![]() |
OnClick-Ereignis ohne Prozedur
Hi,
ich bin dabei einige Komponenten auf dem Formular dynamisch zu erstellen. Nun meine Frage: Wie kann ich das OnClick-Ereignis so zuweisen, dass ich keine zusätzliche Funktion schreiben muss (ausgenommen sind Funktionen in Funktionen, sofern dass in Delphi geht (in TP gings))... Chris |
Korrigiert mich bitte, falls ich was Falsches sag:
Ein Prozedurpointer kann einem Ereignishandler zugewiesen werden. Diese Prozedur oder Funktion kannst du selbst erstellen, du kannst aber auch eine nehmen, die bereist existiert. Also folgendes müsste z. B. gehen:
Delphi-Quellcode:
Über den Sinn und Zweck lässt sich da allerdings streiten.
//Objekte erzeugen
//... MyObject.onClick := ShowMessage(MyObject.Text); Ob es eine andere (sinnvolle) Möglichkeit gibt, weiß ich nicht. |
Geht leider nicht, wird wohl doch eine eigene Prozedur werden.
Frage dann ist: Kann man in Delphi (in TP ging's, wie gesagt) eine Prozedur in eine andere schachteln? So ein etwa:
Delphi-Quellcode:
Geht das und was müsste man an diesem Source anders machen?
procedure TForm1.MyProc(Sender: TObject);
var bButton1: TButton; begin procedure b1Click(Sender: TObject); begin ShowMessage('Button1 geklickt!'); end; bButton1 := { ... }; { ... alles weitere ... } bButton1.OnClick := b1Click(bButton1); end; Chris |
@Chewie: Das geht nicht, weil die Events vom Typ
Delphi-Quellcode:
sind. ShowMessage ist aber eine procedure(Text: String) of object.
type
TNofifyEvent = procedure(Sender: TObject) of object; @Chakotay: Wie in TP auch: Die Prozedurendeklaration vor begin. MfG, d3g |
Wenn mich nicht alles täuscht, mußt Du die innere Procedure über dem begin der äusseren deklarieren.
Allgemein gesehen ist das überhaupt kein Problem. Ich glaube in der Hilfe von Delphi finden sich auch einige Beispiele dazu. Gruß, Helld |
Zitat:
Trotzdem, danke... Chris |
Delphi-Quellcode:
Das ist mein Source... Und warum funktioniert das nicht?
procedure TForm1.Serienummergenerator1Click(Sender: TObject);
var { ein paar Variablen } procedure bButtonClick(Sender: TObject); begin // ein paar Anweisungen end; begin // einige Zeilen Code bButton.OnClick := bButtonClick; end; Chris |
So, habe meinen Fehler gefunden (ich hatte geschrieben bButton.OnClick := bButtonClick(bButton);) schon folgt der nächste gleich Zeile, korrigierter Source:
Zitat:
Zitat:
Chris |
Hi Chakotay,
das Problem liegt in der Definition von TNotifyEvent:
Delphi-Quellcode:
Das "of object" ist das Problem, es bedeutet, dass die Prozedur eine Methode einer Klasse sein muss (also sollte sie ein "TForm1." vor dem Namen stehen). Mit Prozeduren innerhalb anderer Prozeduren ist das aber nicht möglich. Ich habe es mit einem schmutzigen Trick versucht:
type
TNotifyEvent = procedure(Sender: TObject) of object;
Delphi-Quellcode:
Das führt aber zu einer Access Violation. Dir bleibt wahrscheinlich nichts anderes übrig, als jedes Ereignis als Methode von TForm1 zu deklarieren.
bButton.OnClick := TNotifyEvent((@bButtonClick)^);
MfG, d3g [edit]Die zu große Anzahl an Tippfehlern dezimiert.[/edit] |
Zitat:
Ja, ist eigentlich logisch. Es erschien mir auch seltsam, aber ich hatte angefangen zu schreiben und keine LList, aufzuhören :wink: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz