2011-07-12 4 views
2

Je avais pu le faire en utilisant les boutons delphi simples:Comment libérer un cadre dans un événement de clic sur un bouton du cadre?

Dans le premier cadre, je l'ai (simplifié)

procedure FirstFrame.ButtonClick(Sender: TObject) 
Begin 
    if TButton(Sender).ModalResult = mrOK then 
    ChildFrame.DoOKStuff 
    else 
    ChildFrame.DoCancelStuff; 
    ChildFrame.Free; 
end; 

procedure FirstFrame.ShowFranme; 
begin 
    ChildFrame := TFrameWithButtons.Create(Owner); 
    ChildFrame.Parent := self; 
    ChildFrame.OKButton.OnClick := ButtonClick; 
    ChildFrame.CancelButton.OnClick := ButtonClick; 
    ChildFrame.Visible := True; 
end; 

Dans le Childframe je ne fais rien pour traiter le bouton clic sur le bouton ... le clic est déjà défini pour renvoyer le contrôle à la première image.

Avec certains boutons tiers, cela occasionne parfois un AV. Je comprends pourquoi - à un moment donné dans le traitement de code 3ème partie renvoie à un cadre ou un bouton maintenant libéré MAIS le code appelé est dans la première image ... Annoyingly cela fonctionne seulement 99.99% du temps :)

est aucune procédure de libération pour les cadres. Donc, ma question est de savoir quelle est la bonne façon de gérer cette situation?

Utilisation de Delphi 6 et Delphi 2009.

+1

Que diriez-vous reprocucing comportement TCutsomForm.Release dans votre cadre? –

+0

En supposant que 'ChildFrame' est un champ de' FirstFrame', vous devriez probablement appeler 'FreeAndNil (ChildFrame)' au lieu de 'ChildFrame.Free'. Cela aurait probablement l'effet secondaire de travailler 0% du temps après ... mais même si cela fonctionne 99% du temps en ce moment, cela ne donnera pas toujours le bon résultat. –

+0

Excuses aux affiches de réponse - je ne suis pas revenu à ceci en raison d'autres pressions - mais il ressemble à CMRelease :) – Despatcher

Répondre

4

Essayez ceci:

type 
    TFrameWithButtons = class(TFrame) 
    ... 
    procedure CMRelease(var Message: TMessage); message CM_RELEASE; 
    ... 
    end; 

procedure TFrameWithButtons.CMRelease(var Message: TMessage); 
begin 
    Free; 
end; 

procedure FirstFrame.ButtonClick(Sender: TObject) 
Begin 
    if TButton(Sender).ModalResult = mrOK then 
    ChildFrame.DoOKStuff 
    else 
    ChildFrame.DoCancelStuff; 
    PostMessage(ChildFrame.Handle, CM_RELEASE, 0, 0); 
end; 
+0

Je sais 2 ans! – Despatcher

4

Jetez un oeil à la façon dont TCustomForm.Release est mis en œuvre. C'est assez simple: il envoie un message à la file d'attente des messages Windows qui, une fois traitée, provoque la libération du formulaire. Cela ne devrait pas être trop difficile à mettre en œuvre dans votre propre code.

Questions connexes