J'ai un formulaire et puis j'ai un objet 'TPageControl' (nommé 'MyPages') et un objet 'TButton' (nommé 'MyButton') placé dessus à temps de conception. Ensuite, j'ai une nouvelle classe appelée 'TTab' qui étend 'TTabSheet'. La classe 'TTab' a un objet 'TButton' comme l'une de ses variables membres comme ci-dessous.Comment passer un message d'un objet à un autre objet dans Free Pascal
class TTab = class(TTabSheet)
private
m_btnCloseTab: TButton;
end;
Lorsque je clique sur le « MyButton », il créerait un nouvel objet « TTAB », init l'onglet (comme instancier le « m_btnCloseTab ») et l'ajouter à « MyPages » à Durée.
Procedure TForm1.MyButtonClick(Sender:TObject);
var
newTab: TTab;
newCaption: AnsiString;
begin
newCaption:= 'Tab' + IntToStr(count); //count is a global var
inc(count);
newTab:= TTab.Create(nil);
newTab.Init(newCaption);
newTab.Parent(MyPages);
end;
Voici à quoi ressemble la procédure TTab.Init (newCaption: AnsiString).
Procedure TTab.Init(newCaption: AnsiString);
begin
Self.Caption:= newCaption;
m_btnCloseTab:= TButton.Create(nil);
with m_btnCloseTab do begin
Parent:= Self;
Left:= 10;
Top:= 10;
Caption:= 'Close Tab';
Visible:= True;
OnClick:= @closeTab;
end;
end;
Cela ajoute un nouvel onglet. Le bouton de fermeture est également affiché sur chaque onglet. Comment puis-je cliquer sur le «m_btnCloseTab» sur chaque onglet pour fermer cet onglet particulier?
Si je définis un destructeur (en remplaçant le destructeur de la TTabSheet) pour TTab comme ci-dessous, je peux l'appeler de l'extérieur.
Destructor TTab.Destroy;
begin
if m_btnCloseTab <> nil then begin
m_btnCloseTab.Destroy;
m_btnCloseTab:= nil;
end;
inherited;
end;
Mais je ne peux pas appeler le Destructeur depuis l'intérieur de l'onglet (enfin, vous pouvez). Si je le fais, je ne peux pas libérer l'objet m_btnCloseTab car cela donnerait une exception, car nous sommes toujours son gestionnaire d'événements. Si je ne le libère pas, l'onglet se ferme bien, mais la mémoire est divulguée (parce que nous n'avons pas libéré m_btnCloseTab). Je crois que je dois déclencher un événement pour que le destructeur puisse être appelé depuis l'extérieur de 'TTab'. Je ne sais pas comment le faire.
Toute aide serait appréciée.
Merci.
Je ne suis pas sûr si je comprends tout correctement. Mais si vous créez m_btnCloseTab avec l'onglet comme propriétaire (mbtn_CloseTab: = TButton.Create (self), au lieu de ... Create (nil)), le bouton est automatiquement détruit avec l'onglet. En outre, TTab devrait avoir une méthode de notification qui est appelée chaque fois qu'un de ses enfants est détruit et que vous pouvez utiliser pour mettre mbtn_CloseTab à nil: Cela éviterait que Tab appelle le destructeur des boutons dans le cas où les boutons ont été détruits auparavant quelque raison. –
Merci pour le commentaire (je pensais que plus personne n'utilisait Free Pascal) mais cela ne change rien au résultat. En utilisant create (nil), je dois libérer le m_btnCloseTab par moi-même dans le destructeur. En utilisant Create (Self), le destructeur de la classe TTab le fait automatiquement. Qu'est-ce qu'une méthode de notification? Comment puis-je en implémenter un? Ce que je pense est ce que j'ai besoin de faire, un peu comme une fonction de délégué en C#. Appréciez-le si vous pouvez me diriger vers un tutoriel ou une documentation sur la façon de le faire. –
Vous avez tort. Visitez le forum Lazarus pour voir une communauté Pascal vivante. –