![]() |
OnChange bei programmierten Komponenten?
Hi @all!
Bin nicht gerade der Delphiheld, deshalb hätte ich mal eine kleine Frage. Wenn ich auf einem Formular einige Textfelder während der Laufzeit erstelle, wie kann ich dann eine Prozedur schreiben, die ausgelöst wird, wenn man etwas in diese Textfelder reinschreibt? (also onChange Ereignis...) Hab das mal irgendwie so versucht..
Code:
und dann noch viel in der Art, doch irgendwie war das alles falsch ;) wer kann mir helfen??
procedure TEdit(Findcomponent('txtIrgendwas')).OnChange(Sender);
begin //Code... end; (...und lacht mich nicht aus.. *g*) |
Re: OnChange bei programmierten Komponenten?
Du darfst dazu einen eigenen Namen für die Prozedur erfinden wie z.B. "MeineEditsWurdenVeraendert" aber besser ist dann doch "EditChanged".
Delphi-Quellcode:
TForm1 = class(TForm)
... private procedure EditChanged(Sender: TObject); end; procedure TForm1.EditChanged(Sender: TObject); begin MachWas; end; procedure TForm1.FormCreate(Sender: TObject); var Edit: TEdit; begin // Edits werden hier erzeugt. Edit := TEdit.Create(Self); Edit.Parent := Self; // Eventhandler zuweisen: Edit.OnChange := EditChanged; end; |
Re: OnChange bei programmierten Komponenten?
Ups. Da hab ich wohl doppelt geklickt. :cry:
|
Re: OnChange bei programmierten Komponenten?
dankeschööööön :lol:
|
Re: OnChange bei programmierten Komponenten?
ich möchte nochmals was ähnliches machen, auch mit programmierten Komponenten, nur sollte die prozedur noch parameter enthalten, also etwas in der Art:
Delphi-Quellcode:
Hab schon viel versucht, doch immer Fehlermeldungen in diesem Stil erhalten:
...
private procedure Anzeigen(x: integer); end; procedure TForm2.Anzeigen(x: integer); begin showmessage(inttostr(x)); end; procedure TForm2.Button1Click(Sender: TObject); var Edit: TEdit; begin Edit := TEdit.Create(Self); Edit.Parent := Self; Edit.OnChange := Anzeigen(12); end; [Fehler] Unit2.pas(266): Inkompatible Typen: 'TNotifyEvent' und 'procedure, untyped pointer or untyped parameter' kann mir jemand helfen? was mache ich falsch? thx!! Greetz |
Re: OnChange bei programmierten Komponenten?
Moin Hobbyloser,
OnChange ist von Typ TNotifyEvent. Wenn Du nun also eine Prozdure (besser Methode) zuweisen willst muss sie den gleichen Aufbau haben, also in diesem Falle einen Parameter vom Typ TObject. Da Deine Methode Anzeigen, aber einen Integer als Parameter hat kannst Du die nicht als OnChange benutzen. Würde auch keinen Sinn machen, da ja der Sender automatisch gefüllt wird, nämlich mit der Kompo, die das Ereignis auslöst, wenn Du die Routine nicht "von Hand" aufrufst. |
Re: OnChange bei programmierten Komponenten?
ööööööhm...
kapiere ich jetzt nicht ganz! d.h. ich kann nicht eine Methode aufrufen, die zum Beispiel (ein besseres Beispiel als oben..) beim Klick auf einen programmierten Button dessen Caption ausgibt? (MyButton.OnClick -> showmessage(TButton(Findcomponent('Button1')).capt ion) oder nach diesem Prinzip? oder könntest du mir mal ein Beispiel posten.. danke! grüsse |
Re: OnChange bei programmierten Komponenten?
Moin Hobbyloser,
der Aufbau, also die Parameter müssen übereinstimmen. Was Du dann in der Prozedur machst spielt keine Rolle. TNotifyEvent ist ja so deklariert:
Delphi-Quellcode:
Ergo: Die Methode muss eine Prozedur sein, und genau einen Parameter vom Typ TObject haben.
type TNotifyEvent = procedure (Sender: TObject) of object;
Du könntest also schreiben:
Delphi-Quellcode:
TForm1 = class(TForm)
//... procedure MeineClickRoutine(MeinParameter : TObject); //... end; var Form1: TForm1; MeinButton : TButton; implementation procedure TForm1.MeineClickRoutine(MeinParameter : TObject); begin ShowMessage('Hallo'); end; procedure TForm1.FormCreate(Sender: TObject); begin MeinButton := TButton.Create(self); MeinButton.OnClick := MeineClickRoutine; end; |
Re: OnChange bei programmierten Komponenten?
hallo,
das ist ok. Aber ich brauche ja zum Beispiel die Caption das Buttons, der gedrückt wurde, und nicht Hallo. Man kann ja nicht sender.caption anstatt 'Hallo' oder ähnlich verwenden, um den Wert zu bekommen. Sonst ists egal, ich versuche es irgendwie anders :) danke für die Umstände. grüsse |
Re: OnChange bei programmierten Komponenten?
Moin Hobbyloser,
Zitat:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin if (Sender is TButton) then begin ShowMessage((Sender as TButton).Caption); end; end; |
Re: OnChange bei programmierten Komponenten?
Wow! Danke. Du bist der Held. :D
Hab vorher noch nie viel mit Sendern zu tun gehabt. Grüsse und gute Nacht |
Re: OnChange bei programmierten Komponenten?
Mahlzeit!!
Ich habe im Grunde das Gleiche Problem. Nur, dass ich jetzt die Procedure aufrufen kann. Jetzt möchte ich allerdings wissen, welches objekt die Procedure aufgerufen hat, damit ich diese Komponente verändern kann. Problem(e) : 50 Labels erstellen :!: OnMouseMove-Procedure zuweisen :!: Aufrufende Komponente rot färben :?: Ich hoffe ihr könnt mir hier weiterhelfen... |
Re: OnChange bei programmierten Komponenten?
Mit self bekommst Du einen Pointer auf die aufrufende Instanz
|
Re: OnChange bei programmierten Komponenten?
bei dieser Methode färbt er gleich alle rot... wie kann ich das verhindern??
dazu muss man wissen, dass ich ein doppeltes array von labeln, welche ich zur laufzeit aufrufe benutze... Als caption und name hat er 'Form1', obwohl ich den Labels einen Zahlenwert zugewiesen habe. |
Re: OnChange bei programmierten Komponenten?
ok - meine Antwort war nicht ganz richtig, da self in diesem Fall die Form zurückliefert,
da es ja eine Methode der Form und nicht der Komponente ist :wall: Also, nimm self und caste das nach TLabel. (sender as TLabel).Color := clRed; innerhalb der OnMouseOver Methode. Sorry Höflichkeitshalber vorher mit if sender is TLabel then überprüfen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 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