2017年04月06日

パッケージビルドエラー


DesignIntf, DesignEditors が見つからないエラー時の対応

プロジェクトオプション
 Delphiコンパイラ -> コンパイル -> その他のオプション -> コンパイラに渡す追加オプション
に、-LUDesignIDE を設定



posted by しんくそふと at 11:14| Comment(0) | TrackBack(0) | おぼえ

2016年12月21日

複数行グリッド

これは Delphi Advent Calendar  2016 21日目の記事です。


複数行表示編集できるグリッドのようなもの(下記のような感じ)ができるか問い合わせがあり、TFrameを使ったものを試作。
個人的にいい感じでできたので、TFrameを組み合わせるとこんな感じでできますと言うご紹介させていただきます。

グリッド全体のTFrameにScrollBoxを置き、その中に明細行のTFrame(1行ごとにCreate)で構成しています。
ScrollBoxの中に、Panelを1枚置き、その中に明細Frameを必要分Createしています。
このScrollBoxの中のPanel位置を移動させることでスクロールを実現しています。

MultiLineGrid1.png


簡単な機能紹介資料(機能概要.pdf)です。



サンプルプログラムです(FrameGrid.Sample.zip)。


ソースは仕事ネタなんで公開できませんが、TFrameを使えばこんな感じでできますというご紹介でした。


タグ:Delphi
posted by しんくそふと at 00:00| Comment(0) | TrackBack(0) | 開発TIPS

2016年12月06日

FDMemTable(FireDAC)フィールド定義作成

これは Delphi Advent Calendar  2016 6日目の記事です。

FDMemTableのフィールド定義をIDE上で行う方法は、最近のDelphiでは、”データセットの割り当て..”機能を使うことで、TFDQueryなどから、取り込むことができるようになっていますが、古いもの(XE5以前は無い。XE6,XE7は未確認。XE8以降はあり)では、このメニューが出ません。
このため、フィールドを1つづつ手作業で追加するということになりちょっと面倒です。これをちょっと楽するためのテクニックです。

最近のDelphiの方法
1)FDMemTableで必要なフィールドを取得できるクエリを書いたFDQueryを作成。
2)FDQueryをOpenし、フィールドエディタですべてのフィールを取り込む。
3)FDMemTable上で、右マウスボタンでメニューを表示。
4)"データセット割り当て"を選択。
5)上記、FDQueryを選択。
6)再度、FDMemTable上で、右マウスボタンでメニューを表示。
7)"フィールドエディタ"を選択
8)"フィールドエディタ"上で、右マウスボタンでメニューを表示。
9)"すべてのフィールドを追加"を選択
10)FDQueryのフィールド定義がコピーされる。
以上


古いものでは、4) の"データセット割り当て"が無く、”項目の設定”のみである。
ClientDataSetは、上記と同様の作業ができるので、こちらを使う。
プロパティの関連図けは
ClientDataSet1. ProviderName -> DataSetProvider1
                                                     DataSetProvider1.Dataset -> FDQuery1
1)上記プロパティ設定後、ClientDataSet1上で、右マウスボタンでメニューを表示。
2)”項目の設定”を選択。フィールドエディタが表示される。
3)"フィールドエディタ"上で、右マウスボタンでメニューを表示。
4)"すべてのフィールドを追加"を選択
5)FDQueryのフィールド定義がコピーされる。
6)dfmをエディタ表示する。
7)上記、ClientDataSet1のクラスを、TFDMemTableに変更。
8)エディタからフォーム表示へ
9)プロパティの相違でエラーメッセージが出るが無視。
10)保存で、ClientDataSet1のpas上のクラス定義の相違のメッセージが出るのでOKする。
以上

FDMemTableの活用法は、過去のブログを見てください。



posted by しんくそふと at 00:00| Comment(0) | TrackBack(0) | 開発TIPS

2016年10月18日

IoT試作3

前回は、MCP3002 で2Chのアナログデータを取得したが、今回はMCP3208で8Chのアナログデータを取得し、諸々データの確認を行った。

Ardinoとの配線は、下記を参照。

161018_103900.jpg


161018_103920.jpg


Ardinoのコードは、上記サイトのものはうまく行かなかったので、SPIのソースをネット上で探し、それを元に作成。
8Chを20回読み込むのに、およそ7m秒ぐらい。

Delphiもちょっとした機能を確認しながら作成できるが、マイコンもArdinoのようなもので簡単に(最初は簡単でなかったけど)確認できるの便利である。



posted by しんくそふと at 16:40| Comment(0) | TrackBack(0) | 開発TIPS

2016年10月13日

IoT試作 2

前回と同じで、ポテンショメータ(ボリューム)2個の動きを、Androidでモニタ。

今回は、ESPr Developer(旧名:ESP-WROOM-02開発ボード) と、ADコントローラ MCP3002の組み合わせで、試作。
ESPr Developerなんで、通信は、Wi−Fiです。

ハードの配線は、上記組み合わせでの実例が、ネットに多数あったので、それを参照に作成。
基本は、3.3Vベースだと思うが、ESPr DeveloperのVOUTポート使って、5VでMCP3002とポテンションメータを使用。
VOUTポートは、ESPr Developerにあるけど、ESP-WROOM-02にはありません。

161013_100126.jpg

ESPr Developerは、アナログデータは1Chしか取得できないので、MCP3002を使って、2Ch取得。
Ch単位に20件ごと取得し、それぞれ平均した値を、送信する仕組みにしている(この処理で、0.1mSecほど)

Wi−Fi側は、UDPを使って、Android側は、100mSec単位でデータをリクエスト。時々データの欠損が出ている。
こういったケースで、ネット上では、UDPを使っているケースが多いが、TCPではダメなのかちょっと不明。後日TCPでも試してみようかと思う。


posted by しんくそふと at 10:37| Comment(0) | TrackBack(0) | 開発TIPS

2016年10月10日

ESPr Developer ファームウェアの書き込み

ESPr Developer(旧名:ESP-WROOM-02開発ボード) ファームウェアの書き込み

1.FLASH 押す
2.RESET 押す
3.RESET 離す
4.この状態(FLASH 押下)のまま、スケッチ書き込み。
5.FLASH 離す(書き込みが始まった時点で離してもよいみたい)
6.RESET 押す/離す




posted by しんくそふと at 09:53| Comment(0) | TrackBack(0) | おぼえ

2016年10月06日

IoT試作

Arduino + Bluetooth + Android(FireMonkey)で試作。

ポテンショメータ(ボリューム)の動きを、Arduinoで監視。
Bluetoothで送信。

161006_155345.jpg

Androidでモニタ。

161006_155441.jpg


ポテンショメータ(ボリューム)の位置に連動して画面が追随。
161006_155518.jpg

161006_155526.jpg

Arduino側で、データを送信する際、若干Delayを入れないと、Android側で、データがうまく受信できなくなるので、ほんの少し反応が送れた感じになるが、ポテンショメータの動きに合わせて、画面も追随できている。








posted by しんくそふと at 16:36| Comment(0) | TrackBack(0) | 開発TIPS

2016年10月05日

BDE ⇒ FireDAC変換 その4 (TFDMemTable活用)

BDE ⇒ FireDAC変換の前半部分で取り上げた、TADMemTable(XE5以降はTFDMemTable)使用部分の補足です。

古くからのプログラムでは、Paradoxを多々使用しているものがあります。
この場合、Paradoxには永続的にデータを保存する使い方と、一時的に使用する使い方の2種類があると思います。
後者のケースとしては、編集用にサーバーのデータをクライアントへ取り込み編集後サーバーへ戻すケースや、印刷時に直接サーバーデータをQueryなどで取り出したデータを使用しにくいく一旦Paradoxに取り込んで編集後、印刷出力という方法を使っている。

この場合、コンポーネントはTTableを使用している。このケースのFireDACへの変換には、TADMemTableが最適である。
具体的には、dfm書き換えで、TTableをTADMemTableに置き換えるだけです。(TTableについては、Field定義は事前に取り込んでおく必要はあります)
弊社の今までの実績では、LookupFieldやCalcFieldもそのままの定義、コードで使えます。また、イベントも変更無く使用可能です。

注意点としては、TADMemTableは、オンメモリで処理しますので、データの処理状況確認等が必要な場合は、必要なタイミングでSaveToFile()メソッドなどで、ファイルに出力することになります。

FDQueryで読み込んだデータは、
   FDMemTable.Data := FDQuery.Data;
でコピーできます。処理前は、FDMemTableは、Closeしておくことが必要です。

posted by しんくそふと at 09:18| Comment(0) | TrackBack(0) | Delphiマイグレーション

2016年08月03日

FastReport VCL ⇒ FireMonkey

FastReportのVCL版で作成したレポートフォームをFireMonkey版で開いたとき、TfrxMemoViewで設定した文字が表示されないときは、Font.Colorを確認。Nullになっているので、再設定。

追記

というか、TfrxMemoView以外もColorは、全部再設定必要。



タグ:FastReport
posted by しんくそふと at 16:57| Comment(0) | TrackBack(0) | おぼえ

2016年06月20日

FastReport 64Bitターゲット

FastReportは、デフォルトでは、ターゲットが32bit Windowsについては、ライブラリパスが設定されるが、64bit Windowsには、設定してくれないようなので、手動で設定する必要がある。

デフォルトは下記(32BitOSで作業の場合)
C:\Program Files\FastReports\LibD24x64


posted by しんくそふと at 08:49| Comment(0) | TrackBack(0) | おぼえ

2016年06月01日

FastReport レポートエディタ

FastReport を使っていて、エディタ部分が非常に使いにくい。
Delphiのコードを確認したいときに、いちいちエディタを閉じないといけない。QuickReportのような形式が便利だと思うのだが。
データベース連携の場合、この仕組みでよいのかもしれないが、データベース連携しない場合は、とくに不便。

で、エディタだけ起動できるプログラムを作ればよいのではと思い、調べる。

  frxReport.DesignReport();

でエディタが起動できるので、これだけのプログラムを作成。
まだ、不満はあるがちょっとましに。








posted by しんくそふと at 10:30| Comment(0) | TrackBack(0) | 開発TIPS

2016年05月31日

FireDAC InterBase

FireDAC InterBase 使用時、Params 設定 以下7点

  with DB.Params do
  begin
    Values['DriverID'] := 'IB';
    Values['Protocol'] := 'TCPIP';
    Values['Server'] := SvrName;       //サーバー名 or IP
    Values['InstanceName'] := InstanceName;  //インスタンス名
    Values['Database'] := DBName; //データベースファイル名
    Values['User_Name']:= UserName;
    Values['Password'] := Password;
  end;

Delphi2007の場合
上位でバージョンでは、CharSet の指定も必要に思う

詳細

posted by しんくそふと at 16:49| Comment(0) | TrackBack(0) | おぼえ

FireDAC PostgreSQL

PostgreSQL クライアントに必要なdll
(下記ファイルをパスが通っているところに置くことで特にインストールは不要)

  • libpq.dll
  • ssleay32.dll
  • libeay32.dll
  • libintl-8.dll
  • libiconv-2.dll


PCによっては、「Microsoft Visual C++ 2010 Redistributable Package」が必要


詳細は、
http://docwiki.embarcadero.com/RADStudio/Seattle/ja/PostgreSQL_%E3%81%B8%E3%81%AE%E6%8E%A5%E7%B6%9A%EF%BC%88FireDAC%EF%BC%89


FireDAC Params設定は、下記7点
  with DBPg.Params do
  begin
    Values['DriverID'] := 'PG';
    Values['Database'] := DBName;      //データベース名
    Values['User_Name'] := UserName;
    Values['Password'] := Password;
    Values['Server'] := Server;               //サーバー名(IP)
    Values['CharacterSet'] := 'UTF8';      //文字コードがUTF8のとき
    Values['ExtendedMetadata'] := 'True';;  //漢字フィールドを使うため
  end;

タグ:FireDAC
posted by しんくそふと at 16:17| Comment(0) | TrackBack(0) | おぼえ

2016年05月18日

FireDAC SQLite 設定


TFDConnectionのParamsは、

DriverID=SQLite
Database=C:\Users\*****\Documents\DataBase\UpdateTest1.db
の2件でOK。
Databaseは、データベースファイルをフルパスで指定。

MapRulesは、下記の設定をしておくと便利。

    FormatOptions.MapRules = <
      item
        SourceDataType = dtWideMemo
        TargetDataType = dtWideString
      end>
型定義がTEXTのフィールドをグリッド表示するときに、上記の設定をしておけば、データがきちんと表示させることができる。


SQLite、ちと使いにくい。。。
クエリエディタで、確認した後、デバック実行するとDeadLockがでる。
クエリ確認するとIDE上で、データベースオープンになるのが原因だけど、これどいちいちクエリエディタ使ったと、確認しないといけない。
このデータベースの性質上仕方ないんだけど。。。。他のデータベースに変えようかな。。


posted by しんくそふと at 18:38| Comment(0) | TrackBack(0) | おぼえ

Delphiマイグレーション記録 TDBGridバグ

Delphiの古いバージョンから、S-JIS最終版Delphi2007へのマイグレーションで、TDBGridのバグに遭遇。
Delphi2007(December 2007 Update)

データセットが編集中に、データが表示されていない部分をマウスクリックすると、データが不正に変更されるという現象が発生することがあるようです。

対策
DBGrid.pas
---------------
3471行あたりの
TCustomDBGrid.MouseDown();
メソッド中の
------------------------------------------------------------
  Cell := MouseCoord(X, Y);          <=3492行あたりです
  if (Cell.X < 0) and (Cell.Y < 0) then
  begin
    if (FDataLink <> nil) and (FDataLink.Editing) then
//      UpdateData;                                         Del ThinkSoft
      FDataLink.UpdateData;                               //Add ThinkSoft
    inherited MouseDown(Button, Shift, X, Y);
    Exit;
  end;
------------------------------------------------------------


#追記
このバグは、直接グリッド内でデータ編集を行う際にはほぼ遭遇しないと思われます。
同一データセットの内容をDBグリッドに表示させながら、グリッド外で、DBEditのなどのData Controls系のコンポーネントで編集を行うケースで発生します。

posted by しんくそふと at 15:37| Comment(0) | TrackBack(0) | エラー対応覚え

結合クエリのCashUpdate更新(サンプルソース付)

結合クエリのCashUpdate方法ポイント

Delphi 10 Seattle
DBアクセス:FireDAC、DatabaseはSQLiteで確認しています。
他のコンポーエントやデータベースでも考え方は同じなので適用できると思います。

----------------------------------------------------------------------------------------------

テーブル(伝票の明細を編集するイメージです)
 伝票明細(Meisai)、商品マスタ(Syouhin) (1:N関連)

CREATE TABLE "MEISAI" (
    `ORDERNO`    INTEGER NOT NULL,
    `MEISAINO`    INTEGER NOT NULL,
    `SYOUHINCODE`    INTEGER NOT NULL,
    `TANKA`    REAL DEFAULT 0,
    `SURYO`    REAL DEFAULT 0,
    `BIKOU`    TEXT DEFAULT '',
    PRIMARY KEY(ORDERNO,MEISAINO)
)
CREATE TABLE "SYOUHIN" (
    `SYOUHINCODE`    INTEGER NOT NULL,
    `SYOUHINNAME`    TEXT,
    `SYOUHINTANKA`    REAL,
    PRIMARY KEY(SYOUHINCODE)
)

----------------------------------------------------------------------------------------------

クエリ
select
 M.ORDERNO
,M.MEISAINO
,M.SYOUHINCODE 
,S.SYOUHINNAME
,S.SYOUHINTANKA
,M.TANKA        /*<=更新対象*/
,M.SURYO        /*<=更新対象*/
,M.BIKOU        /*<=更新対象*/
from
  MEISAI M        /*<=更新するテーブルはこの位置で無いといけない*/
  inner join SYOUHIN S
  on (S.SYOUHINCODE = M.SYOUHINCODE)
where
 M.ORDERNO = :ORDERNO
order by
 M.MEISAINO

----------------------------------------------------------------------------------------------

FDQuery
 上記クエリを設定後、フィールドエディタでフィールドの展開をする必要がある。

FDQueryのdfmファイル内容(関係ない部分は一部削除しています)
  object QryList: TFDQuery
    OnCalcFields = QryListCalcFields
    CachedUpdates = True
    SQL.Strings = (
      'select'
      ' M.ORDERNO'
      ',M.MEISAINO'
      ',M.SYOUHINCODE'
      ',S.SYOUHINNAME'
      ',S.SYOUHINTANKA'
      ',M.TANKA'
      ',M.SURYO'
      ',M.BIKOU'
      'from'
      '  MEISAI M'
      '  inner join SYOUHIN S'
      '  on (S.SYOUHINCODE = M.SYOUHINCODE)'
      'where'
      ' M.ORDERNO = :ORDERNO'
      'order by'
      ' M.MEISAINO')
    object QryListORDERNO: TIntegerField
      FieldName = 'ORDERNO'
      ProviderFlags = [pfInWhere, pfInKey]
    end
    object QryListMEISAINO: TIntegerField
      FieldName = 'MEISAINO'
      ProviderFlags = [pfInWhere, pfInKey]
    end
    object QryListSYOUHINCODE: TIntegerField
      FieldName = 'SYOUHINCODE'
      ProviderFlags = [pfInUpdate]
    end
    object QryListSYOUHINNAME: TWideStringField
      FieldName = 'SYOUHINNAME'
      ProviderFlags = [pfHidden]
      ReadOnly = True
    end
    object QryListSYOUHINTANKA: TFloatField
      FieldName = 'SYOUHINTANKA'
      ProviderFlags = [pfHidden]
      ReadOnly = True
    end
    object QryListTANKA: TFloatField
      FieldName = 'TANKA'
      ProviderFlags = [pfInUpdate]
    end
    object QryListSURYO: TFloatField
      FieldName = 'SURYO'
      ProviderFlags = [pfInUpdate]
    end
    object QryListCalKINGAKU: TIntegerField
      FieldKind = fkCalculated
      FieldName = 'CalKINGAKU'
      Calculated = True
    end
    object QryListBIKOU: TWideStringField
      FieldName = 'BIKOU'
      ProviderFlags = [pfInUpdate]
    end
  end
------------------------------------
ポイントは、ProviderFlagsになります。
更新するフィールドは、pfInUpdateをTrueにする。
更新時の、Where句に相当する部分は、pfInWhereをTrueにする。
join先のテーブルのフィールドは、pfHiddenをTrueにする。
テーブルの主キーのフィールドは、pfInKeyをTrueにする(ふつう勝手にTrueになる)

結合クエリとは関係ないが、BDE=>FireDAC切り替え時、BDEでは設定しなくても
問題なかった、キー項目のProviderFlagsが、未設定だとエラーが出る。
エラー(例外:EFDDBEngineException)が出たらキー項目の下記の確認を。
ProviderFlags = [pfInWhere, pfInKey]
エラー内容は何パターンかあるようだ。
 メッセージ [FireDAC][Phys][IB]-312.〜〜〜〜
 メッセージ [FireDAC][DApt]-400.〜〜〜〜
など。


上記だけではわかりにくいかと思うのでサンプル(ソースのみ)を下記にアップ。データベースも含めています。


(含 LookUpフィールドサンプル。)
明細の追加や削除は考慮して作っていません。上記確認のためなので諸々端折っています。

追記。。。。

今回のケースでは、
--------------------------------
from
  MEISAI M        /*<=更新するテーブルはこの位置で無いといけない*/
  inner join SYOUHIN S
  on (S.SYOUHINCODE = M.SYOUHINCODE)
--------------------------------
の部分は、下記のようなLeft Outer Joinでも使えます
(仕様としては、商品マスタが無い商品を取り扱うというのは、NGですが)
--------------------------------
from
  MEISAI M        /*<=更新するテーブルはこの位置で無いといけない*/
  left outer join SYOUHIN S
  on (S.SYOUHINCODE = M.SYOUHINCODE)
--------------------------------
でもOK。
right outer join や full outer join は、当然ダメ。
ちなみにもともと、SQLiteは、right outer join / full outer join をサポートしていませんが。
他のデータベースをつかうときの注意点です。

ついでに。
たぶんやろうとしないと思うけど、まとめて複数のテーブル(今回では、MEISAIとSYOUHIN)を更新もNGです。


追記その2。。。。
(結合クエリとLookupフィールドについて。私論)

上記の処理では、SYOUHINCODEも変更するということが一般だと思う。
この場合、上記結合テーブルで行うと、SYOUHINCODEが変わったときの処理、コードでゴリゴリ書く必要が出てくる。
そのように考えると、SYOUHINテーブルの引用は、Lookupフィールドを使ったほうが便利だと思う。

ただ、読み込むMEISAIテーブルのデータが少ないケースはそれでよいが、件数が多いケースでは、Lookupフィールドの使用は、格段に処理時間がかかる。そういったケースではコードでゴリゴリ書くことに目をつぶって、結合テーブルを使用することもメリットが出ると思う。


タグ:Delphi FireDAC BDE
posted by しんくそふと at 13:32| Comment(0) | TrackBack(0) | 開発TIPS

2015年12月17日

DB登録方法の違いによるパフォマンス比較

この投稿はDelphi Advent Calendar 2015の21日目の記事です。


同じコンポーネントを使っても、データベースに登録する方法は複数あります。
今回は、その方法の違いによるパフォーマンスの比較をしたいと思います。

コンポーネントは、FireDACを使います。Delphiは、10 Seattle、データベースは、PostgreSQLを使いました。
データは、日本郵便株式会社のサイトからダウンロードした郵便番号データを使用しました。
件数は、123907件です。項目は、新旧郵便番号と、県市区町村名のカナと漢字名で9項目のフィールド対象としています。
このデータをテーブルに追加する処理で確認します。

登録方法の比較は下記の3種類。すべて、TFDQueryを使います。

1)
ChashUpdateを使用し、全件Append->Post後、ApplyUpdatesする。

2)
Insert文を使い、ExecSQLで1件づつ全件登録します。

3)
同じく、Insert文を使用し、配列DMLを使います。
配列数は2パターン計測したものを示します。


計測値です。それぞれ2回行っています。

パターン1回目(hh:nn:ss.zzz)2回目(hh:nn:ss.zzz)
1) 00:04:23.610 00:06:49.251
2) 00:01:22.688 00:02:21.500
3)  ArraySize = 5000 00:00:07.126 00:00:07.031
3)  ArraySize = 10 00:00:28.047 00:00:41.969

配列DMLでArraSizeが大きいものが圧倒的に早いようです。
データ移行や、バッチ系の処理で、処理時間が気になるようなときは、配列DMLが有効なようです。

ArraySizeは、大きいほうがよいと言うこと上記からわかりますが、あまり大きくするとメモリのエラーが出ます。
最初、ArraySizeをデータ件数(123,907)にしたら駄目でした。1万件でも駄目で、上記5000件はOKでした。
その間は確認してません。
このあたりはパラメータの項目数などによって、調整が必要なようです。
ここのQ4に情報があるようです。いまいち意味がわからないですが、結局環境によって違うってことなのかな。

posted by しんくそふと at 16:26| Comment(0) | TrackBack(0) | 開発TIPS

2015年10月03日

PostgreSQL 漢字テーブル名のアクセス(FireDAC)

PostgreSQLで、漢字で、テーブルを作成。
TFDQuery, TFDTableでアクセスしたところ、
-----------------------------------------------------
 符号化方式"UTF8"で無効なバイトシーケンスです
-----------------------------------------------------
のエラーが発生。

調べると、フィールド名で漢字は問題ないが、テーブル名の漢字が駄目っぽい。
いろいろ試したがわからないので、エンバカ サポートに確認。

TFDConnectionのExtendedMetadataをTrueにすることで、TFDQueryについては、エラーが発生しなくなった。



--補足情報--
Embarcadero Delphi 10 Seattle
 バージョン: 23.0.20618.2753
PostgreSQL 9.4.4
 データベースの文字コードは、UTF-8で作成
posted by しんくそふと at 10:55| Comment(0) | TrackBack(0) | エラー対応覚え

2015年05月30日

Frameの Create, Destroy イベント2

Formにconstructor/destructorを追加して確認

----------------------------------------------------------------------------------------------
constructor TFormUnit.Create(AOwner: TComponent);
begin
  OutputDebugString(PChar('○TFormUnit.Create Before inherited○'));
  inherited;
  OutputDebugString(PChar('○TFormUnit.Create After inherited○'));
end;

destructor TFormUnit.Destroy;
begin
  OutputDebugString(PChar('○TFormUnit.Destroy○'));
  inherited;
end;
----------------------------------------------------------------------------------------------

結果
----------------------------------------------------------------------------------------------
デバッグ出力: ◎initialization◎ プロセス Project1.exe (3000)
デバッグ出力: ○initialization○ プロセス Project1.exe (3000)
デバッグ出力: ○TFormUnit.Create Before inherited○ プロセス Project1.exe (3000)
デバッグ出力: ◎TFrameUnit.Create◎ プロセス Project1.exe (3000)
デバッグ出力: ○TFormUnit.Create After inherited○ プロセス Project1.exe (3000)
デバッグ出力: ○TFormUnit.FormCreate○ プロセス Project1.exe (3000)
----------------------------------------------------------------------------------------------
これは、 Formのプロパティ OldCreateOrder = False (Default) の場合
これを、OldCreateOrder = True にすると
----------------------------------------------------------------------------------------------
デバッグ出力: ◎initialization◎ プロセス Project1.exe (2836)
デバッグ出力: ○initialization○ プロセス Project1.exe (2836)
デバッグ出力: ○TFormUnit.Create Before inherited○ プロセス Project1.exe (2836)
デバッグ出力: ◎TFrameUnit.Create◎ プロセス Project1.exe (2836)
デバッグ出力: ○TFormUnit.FormCreate○ プロセス Project1.exe (2836)
デバッグ出力: ○TFormUnit.Create After inherited○ プロセス Project1.exe (2836)
----------------------------------------------------------------------------------------------
FormCreateのタイミングが変わる。

posted by しんくそふと at 09:47| Comment(0) | TrackBack(0) | おぼえ

2015年05月29日

Frameの Create, Destroy イベント


Frame には、OnCreate/OnDestroyイベントがないが下記のように、constructor/Destroyを定義すれば、同じようなイベントはかける。

-------------------------------------------------------------------------------------
type
  TFrameUnit = class(TFrame)
  private
    { Private declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;
-------------------------------------------------------------------------------------
ただし、発生タイミングに注意が必要。
Frameのimplementationを下記のように定義。
-------------------------------------------------------------------------------------
constructor TFrameUnit.Create(AOwner: TComponent);
begin
  inherited;
  OutputDebugString(PChar('◎TFrameUnit.Create◎'));
end;
destructor TFrameUnit.Destroy;
begin
  OutputDebugString(PChar('◎TFrameUnit.Destroy◎'));
  inherited;
end;
initialization
  OutputDebugString(PChar('◎initialization◎'));
finalization
  OutputDebugString(PChar('◎finalization◎'));
end.
-------------------------------------------------------------------------------------
Formにも下記のように定義して確認
-------------------------------------------------------------------------------------
procedure TFormUnit.FormCreate(Sender: TObject);
begin
  OutputDebugString(PChar('○TFormUnit.FormCreate○'));
end;
procedure TFormUnit.FormDestroy(Sender: TObject);
begin
  OutputDebugString(PChar('○TFormUnit.FormDestroy○'));
end;
initialization
  OutputDebugString(PChar('○initialization○'));
finalization
  OutputDebugString(PChar('○finalization○'));
end.
-------------------------------------------------------------------------------------

デバッグ出力: ◎initialization◎ プロセス Project1.exe (3656)
デバッグ出力: ○initialization○ プロセス Project1.exe (3656)
デバッグ出力: ◎TFrameUnit.Create◎ プロセス Project1.exe (3656)
デバッグ出力: ○TFormUnit.FormCreate○ プロセス Project1.exe (3656)

デバッグ出力: ○TFormUnit.FormDestroy○ プロセス Project1.exe (3656)
デバッグ出力: ◎TFrameUnit.Destroy◎ プロセス Project1.exe (3656)
デバッグ出力: ○finalization○ プロセス Project1.exe (3656)
デバッグ出力: ◎finalization◎ プロセス Project1.exe (3656)
となる。

posted by しんくそふと at 16:16| Comment(0) | TrackBack(0) | おぼえ