2017-09-16 40 views
2

フォーム状態をディスクに簡単に保存することを簡単にしたいと思います。私はTIniFileから派生した独自のINIファイルクラスを使用して、フォームの「すべての」コントロールの状態を読み込みます。このような何か:TAction.OnExecuteは実行されません

procedure TMyIniFile.Read(Comp: TComponent); 
begin 
    if ValueExists(Section, Comp.Name) then 
    begin 
    if Comp.InheritsFrom(TAction) 
    then TAction(Comp).Checked:= ReadBool(Section, Comp.Name, FALSE)    
    else 
     if Comp.InheritsFrom(TCheckBox) etc 
    end; 
end; 

私はこのような私のクラスを使用します。

TYPE 
TformTester = class(TForm) 
    MyAction: TAction; 
    procedure actMyActionExecute(Sender: TObject); 

... 

procedure TformTester.FormDestroy(Sender: TObject); 
VAR 
    MyIniFile: TMyIniFile; 
begin 
MyAction.Checked:= true; 
MyIniFile:= TMyIniFile.Create('Main Form'); 
MyIniFile.write(MyAction); // <------ This saves the 'Checked' property of MyAction. 
... 
end; 

私はシャット時に、施設の状態に応じて(真/偽)INIファイルを検証し、状態が正しく保存されますダウン。

procedure TformTester.FormStartUp; 
VAR MyIniFile: TMyIniFile; 
begin 
MyIniFile:= TMyIniFile.Create('Main Form'); 
MyIniFile.read(MyAction);  // <------ This reads the 'Checked' property of MyAction. It should execute the actMyActionExecute but it doesn't. 
assert(MyAction.Checked);  // <---- Yes, it is checked 
... 
end; 


procedure TformTester.MyActionExecute(Sender: TObject); 
begin 
if MyAction.Checked 
then Caption:= 'Action checked' 
else Caption:= 'Action is un-checked!'; 
end; 

質問: MyIniFile.read(MyAction)が実行されたときに、なぜactMyActionExecuteが呼び出されませんか?

PS:MyIniFile.read(MyCheckbox)は、TActionの代わりに何か他のもの、例えばチェックボックスを渡すと機能します。 MyCheckbox.OnClickが実行されたことを意味します。

+0

MyAction.AutoCheckはTrueです。 – Ampere

答えて

4

アクションOnExecuteは、リンクされたコントロールが呼び出されたときに発生します。たとえば、ボタンが押されたり、メニュー項目が選択されたりします。イベントでExecuteを明示的に呼び出すと、イベントが発生します。

OnExecuteイベントは、プロパティのいずれかを変更しても発生しません。それは設計によるもので、かなり合理的です。このイベントは、ユーザーが何か行動したときに発生します。プログラマがアクションを設定するときではありません。

+0

アクションは、(設計時に)チェックボックスにリンクされています。ごめんなさい。私はそれを言及すべきだった。 – Ampere

+1

アクションのプロパティを設定しても、イベントは呼び出されません。それは設計によるものです。 –

+0

"アクションのプロパティを設定してもイベントは呼び出されません" - ok。だから私の問題です!ありがとう。 – Ampere

関連する問題