2009-07-10 13 views
4

Ich habe eine TForm (TVehicleEditForm) mit 3 identischen TFrames (TVfahricUnitFrame) innen.EventHandler in einem TFrame?

Die Idee war, dass jede Instanz des Rahmens eigene Ereignisse durch eine eventhandler innerhalb des Rahmens behandeln. Das Problem ist, dass die eventhandler nicht aufgerufen wird.

Ich habe versucht, die eventhandler durch Code innerhalb des Rahmens durch Überschreiben der Create-Methode zuweisen, aber der Handler wird auch in diesem Fall nicht aufgerufen.

Aber wenn ich die eventhandler außerhalb des Rahmens aus dem Formular zuweisen, funktioniert es gut. So:

fraVehicleUnitFrame1.cmdNewOwner.OnClick := fraVehicleUnitFrame1.cmdNewOwnerClick; 
fraVehicleUnitFrame2.cmdNewOwner.OnClick := fraVehicleUnitFrame2.cmdNewOwnerClick; 
fraVehicleUnitFrame3.cmdNewOwner.OnClick := fraVehicleUnitFrame3.cmdNewOwnerClick; 

Und dies ist nur eine Taste! Da ich viele Komponenten innerhalb des Rahmens habe, würde dies zu vielen Zuweisungen führen ... Ziemlich hässlicher Code, wenn dies direkt im Objektinspektor gemacht werden sollte.

Ich benutze D2007. Irgendeine Idee von der Ursache?

Grüße Roland

Antwort

11

Der Grund, es funktioniert, wenn Sie es aus dem Code zu tun, ist, dass Sie den Zeiger auf den Ereignishandler ersetzen, und zwar unabhängig von dem, was vor dort war.

Zur Entwurfszeit habe ich zwei mögliche Stellen, um den Handler zu setzen. Angenommen, ich habe Frame1 in Unit1 und ich platziere es auf MyForm in MyUnit, dann habe ich die Möglichkeit, den Event-Handler an beiden Stellen zu setzen.

In Ihrem Fall möchten Sie den Event-Handler im Rahmen selbst (Unit1 in meinem Beispiel), wie der Code, auf den es verweist, auf den Rahmen selbst ist. Wenn Sie das tun, sollte es funktionieren. Wenn Sie den Ereignishandler auf den Ort setzen, an dem er verwendet wird (MyUnit), wird der Ereignishandler dort zugewiesen.

Delphi ist schlau genug, um den Event-Handler immer noch von Ihrem Frame aus aufzurufen, solange dieser Event-Handler vor zugewiesen wurde, den Sie im Formular hinzugefügt haben. Wenn Sie es zuerst im Formular hinzufügten und dann den Handler für den Frame hinzufügten, wurde der auf dem Frame nicht genannt. Um die Sache noch schlimmer zu machen, wenn Sie den Handler in der Form entfernen, ruft er immer noch nicht den im Formular auf.

Was Sie tun müssen, ist dies:

rechten clcik Ihre Form und wählen Ansicht als Text. Scrollen Sie nach unten zum Bild. Es sollte so etwas sein:

inline FrameX: fraVehicleUnitFrame1 

Darunter, suchen Sie nach

inherited cmdNewOwner: TButton 

Es Sie so etwas wie sehen sollte:

OnClick = FormOldClickHandler 

oder vielleicht

OnClick = nil 

löschen OnClick Zuweisung, Ansicht als wieder bilden und speichern. Alles sollte gut sein.Wenn Sie jetzt die Schaltfläche (oder einen anderen CmdNewOwner) im Formular auswählen, sollte der Objektinspektor neben diesem Ereignis nichts anzeigen.

+0

Danke für den Hinweis !!! Ich habe es wieder funktioniert :) Vielen Dank –

+0

Ich bin froh, dass ich helfen konnte! –

+0

Ich löse dieses Problem, indem ich die Frame-Instanz aus dem Formular lösche und erneut hinzufüge, aber deine Lösung ist der beste Weg, besonders wenn Änderungen an der Frame-Instanz vorgenommen wurden. –