![]() |
Events von Objekten, die während der Laufzeit erzeugt werden
Hallo.
Wie kann ich die Events (OnMouseMove,OnClick usw..). Von Objekten, welche ich in einer eigenen Funktion erzeuge bestimmen ? Beispiel:
Delphi-Quellcode:
~stift
procedure MyProcedure;
var Names : Array [0..5] of TLabel; begin //Objekte erzeugen for i:=0 to high(names) do Names[i] := TLabel.Create(Form1); //anzeigen for i:=0 to high(names) do Names[i].Parent:=Form1; //Wie kann ich jetzt das Ereignis zB. Names[i].Onclick bestimmen ? ???? ... |
Re: Events von Objekten, die während der Laufzeit erzeugt we
du nimmst Names[i].OnClick und weißt diesem einfach eine passende Methode (Prozedur) zu
|
Re: Events von Objekten, die während der Laufzeit erzeugt we
Und nimm bitte eine TObjectList oder nur eine TList. Damit kannst du deine Objekte wesentlich einfacher verwalten! Ebenso wäre es teilweise nicht ganz schlecht, deinen Labels Namen zu geben, sodass du diese später besser verwalten/identifizieren kannst ;)
Was mit gerade noch eingefallen ist: überleg mal, was mit deinem in der Methode definierten Array passiert, wenn diese Methode verlassen wird? Benötigst du diese Liste außerhalb der Methode kannst du nicht darauf zugreifen :) |
Re: Events von Objekten, die während der Laufzeit erzeugt we
Zitat:
|
Re: Events von Objekten, die während der Laufzeit erzeugt we
Vielen Dank.
Wofür brauch ich eine TComponentList, wenn ich nur Labels brauche ? ~stift |
Re: Events von Objekten, die während der Laufzeit erzeugt we
Die TComponentList hilft bei der Verwaltung der Einträge und ggf. deren Freigaben.
Das steht aber alles in der Hilfe... |
Re: Events von Objekten, die während der Laufzeit erzeugt we
TList = Pointer
TObjectList = TObject TComponentList = TComponent TLabel stammt über Umwege von TComponent ab TComponent stammt über Umwege vom Basistypen TObject ab TObject ist indirekt ein Pointer Also im Prinzip kannst du ale diese Listen nehmen, aber da TComponent am nächsten an TLabel dran ist, würde sich die TComponentList natürlich am Besten eignen :zwinker: und außerdem hat diese TComponentList noch ein paar nette Zusatzfeatures, gegenüber den anderen Varianten. |
Re: Events von Objekten, die während der Laufzeit erzeugt we
Danke, werd mir das ganze mal näher anschauen.
|
Incompatible types: 'method pointer and regular procedure'
Zitat:
Das funktioniert so leider nicht. Aber warscheinlich mache ich auch etwas verkehrt. Zitat:
Delphi-Quellcode:
procedure DoStuffs;
begin //work to do end; procedure MyProcedure; var Names : Array [0..5] of TLabel; begin //Objekte erzeugen for i:=0 to high(names) do begin Names[i] := TLabel.Create(Form1); Names[i].OnClick := DoStuffs; end; //anzeigen for i:=0 to high(names) do Names[i].Parent:=Form1; |
Re: Events von Objekten, die während der Laufzeit erzeugt we
Die Methode muss eine Methode der passenden ereignisbehandlung sein.
Du kannst Sie z.B. in Deiter Form1 deklarieren:
Delphi-Quellcode:
Diese kannst Du dann Deiner Label-Ereignisbehandlung zuweisen (es wird im Grunde ein Zeiger auf diese Methode zugewiesen).
procedure TForm1.MyLabelsClick(Sender: TObject);
begin (Sender as TLabel).Color := clRed; end; Hast Du Dir mal die TComponentList angesehen? Das ändert zwar nichts an Deiner jetzigen Frage, ist aber evtl. eine sinnvolle Lösung für die Verwaltung Deiner Labels. |
Re: Events von Objekten, die während der Laufzeit erzeugt we
Zitat:
Also hab die Prozedur in meiner Klasse eingetragen, und dann erstellt, wenn ich sie dann dem ereignis (names[i].onclick = meineklasse.MyLabelsClick) zuweise kommt diese Fehlermeldung (siehe oben). ~stift |
Re: Events von Objekten, die während der Laufzeit erzeugt we
Wie sieht deine Funktionsdefinition nun aus?
siehe Beitrag #10 |
Re: Events von Objekten, die während der Laufzeit erzeugt we
Hallo nochmal himitsu.
Das ganze sieht bei mir nun so in etwa aus.
Delphi-Quellcode:
type myThread = class(TThread) fSleepRequest : Boolean; IdHTTPLT: TIdHTTP; procedure MyLabelsClick(Sender: TObject); protected procedure Execute; override; Public Procedure GotoSleep; Procedure WakeUp; end; ...... procedure mythread.MyLabelsClick(Sender: TObject); begin (Sender as TLabel).Color := clRed; end; procedure mythread.execute; var Names : Array [0..5] of TLabel; begin //Objekte erzeugen for i:=0 to high(names) do begin Names[i] := TLabel.Create(Form1); Names[i].OnClick := mythread.MyLabelsClick; end; //anzeigen for i:=0 to high(names) do Names[i].Parent:=Form1; |
Re: Events von Objekten, die während der Laufzeit erzeugt we
mythread.MyLabelsClick wäre für eine Klassen-Procedur
du brauchst aber eine Objekt-Prozedur in deinem Fall
Delphi-Quellcode:
und das Self. kann man hier auch weglassen
Names[i].OnClick := self.MyLabelsClick;
|
Re: Events von Objekten, die während der Laufzeit erzeugt we
... und damit das im Quelltext schneller ersichtlich wird, solltest Du Deine Klasse
Delphi-Quellcode:
nennen.
TMyThread = class(TThread)
Das ist zwar nicht zwingend erforderlich, aber den Delphi-Konventionen entsprechend. MyThread sieht eben nach einer Objektinstanz aus. Bei TMyThread vermutet man schon eher einen Typ oder eine Klasse. |
Re: Events von Objekten, die während der Laufzeit erzeugt we
Danke, das macht Sinn!.
Funktioniert zudem noch wunderbar :). ~stift |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:07 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-2025 by Thomas Breitkreuz