2017-09-16 10 views
2

Je veux simplifier un peu la sauvegarde d'un état de formulaire sur le disque. J'utilise ma propre classe de fichier INI dérivée de TIniFile pour lire l'état de "tous" les contrôles présents dans le formulaire. Quelque chose comme ceci:TAction.OnExecute n'est pas exécuté

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; 

-je utiliser ma classe comme ceci:

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; 

J'ai vérifié le fichier INI et l'état est correctement enregistré (true/false) en fonction de l'état de la propriété lors de l'arrêt vers le bas.

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; 

Question: Pourquoi actMyActionExecute n'est pas appelée lorsque MyIniFile.read (MonAction) est exécuté? PS: MyIniFile.read (MyCheckbox) fonctionne si au lieu de TAction je passe tout autre chose, par exemple une case à cocher. Je veux dire MyCheckbox.OnClick est exécuté!

+0

MyAction.AutoCheck est True; – Ampere

Répondre

4

L'action OnExecute est déclenchée lorsque des contrôles liés sont appelés. Par exemple, un bouton est enfoncé ou un élément de menu est sélectionné. Ou il est déclenché si vous appelez explicitement Execute sur l'événement.

L'événement OnExecute ne sera pas déclenché lorsque vous modifiez l'une de ses propriétés. C'est par conception et tout à fait raisonnable. Cet événement se déclenche lorsque les utilisateurs effectuent une action. Pas quand le programmeur met en place l'action.

+0

L'action est liée (au moment du design) à une case à cocher. Pardon. J'aurais dû le mentionner. – Ampere

+1

La définition des propriétés d'une action n'invoque pas ses événements. C'est par conception. –

+0

"La définition des propriétés d'une action n'appelle pas ses événements" - ok. Donc c'est mon problème! Merci. – Ampere