FDELPHI 17 初心者のコンポーネント作成 みなさん、こんにちは。 私は32ビットコンソールアプリを作ることがあります。 ただ、通常のGUIなアプリでロジックを作って、そこでデバッグを行ってから コンソールアプリに作り替える、という事も多いです。 さて、そうやって作っているときに、コンポーネント化するのに良さそうに思え た部分に気がつきました。ん〜、そういえば、GUIなアプリのソースがまだ残 っていたはず。あ、これこれ。 unit mainf; uses (略) type TMainForm = class(TForm) Hogehoge1: THogehoge; Fugafuga1: TFugafuga; procedure FormCreate(Sender: TObject); procedure Hogehoge1Work(Sender: TObject); procedure write_data(stream1: Tstream); end; var MainForm: TMainForm; implementation var Stream1: TMemoryStream; (略) procedure TMainForm.FormCreate(Sender: TObject); begin (以下略) これを安直に作り替えることにしました。ま、コンソールアプリのグローバルな 部分におきたいものもあるので、ちょいと書き換えて。 あ、Form 関係のメソッドも全部消さないと。 program MySoft; {$APPTYPE CONSOLE} uses (中略) type TMyCompo = class(TComponent) Hogehoge1: THogehoge; Fugafuga1: TFugafuga; procedure Hogehoge1Work(Sender: TObject); end; var i: Integer; Stream1: TMemoryStream; MyCompo: TMyCompo; (中略) procedure TMyCompo.Hogehoge1Work(Sender: TObject); begin (中略) end; begin // メインルーチン //初期設定 Stream1 := TMemoryStream.Create; MyCompo := TMyCompo.Create(nil); try MyCompo.Hogehoge1.OnWork := MyCompo.Hogehoge1Work; (中略) finally MyCompo.Free; Stream1.Free; end; (以下略) さて、コンパイル。 よし、一発通し。 では実行。 ・・・なんで EAccessViolation が出るんだぁ? え、constructor? う〜ん、名前ぐらいは知っているけど。 Hogehoge1 と Fugafuga1 の実体? そんなもん、自動作せ・・・あ! ということで、自動作成されないものを自動作成されると勘違いしたことが原因 でした。で、まぁ、原因はわかったんだけど。とった解決策が大たわけ。 クラス定義には手をつけずに、メインルーチンを以下の通り書き換え。 Stream1 := TMemoryStream.Create; MyCompo := TMyCompo.Create(nil); MyCompo.Hogehoge1 := THogehoge.Create(nil); MyCompo.Fugafuga1 := TFugafuga.Create(nil); try MyCompo.Hogehoge1.OnWork := MyCompo.Hogehoge1Work; (中略) finally MyCompo.Fugafuga1.Free; MyCompo.Hogehoge1.Free; MyCompo.Free; Stream1.Free; end; おぅい、どこにコンポーネント化のメリットがあるんだぁ? そりゃ、ま、動くことは動くだろうけどさ。                                  としき