Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Quelltext eines Dynamisch erstellten Buttons
hibbert - Sa 06.03.04 22:26
Titel: Quelltext eines Dynamisch erstellten Buttons
Hi,
mit folgendem Quellcoder erzeuge ich einen Button auf einer neuen Form:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.BitBtn1Click(Sender: TObject); var new_form:tform; new_btn:Tbutton; begin new_form:=tform.Create(new_form); new_form.Show; new_btn:=tbutton.Create(new_form); new_btn.Parent:=new_form; new_btn.Caption:='Mein Button'; end; |
Nun soll dieser Button einen Quelltext erhalten.
Wie kann ich zusätzlich noch jede einzelne Form ansprechen, die müssen doch auch einen Namen haben, zb. Form1 .
Thx Hibbert
Moderiert von
DeCodeGuru: Topic verschoben
Killmag10 - Sa 06.03.04 23:24
Titel: Re: Quelltext eines Dynamisch erstellten Buttons
hibbert hat folgendes geschrieben: |
Hi,
mit folgendem Quellcoder erzeuge ich einen Button auf einer neuen Form:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.BitBtn1Click(Sender: TObject); var new_form:tform; new_btn:Tbutton; begin new_form:=tform.Create(new_form); new_form.Show; new_btn:=tbutton.Create(new_form); new_btn.Parent:=new_form; new_btn.Caption:='Mein Button'; end; |
Nun soll dieser Button einen Quelltext erhalten.
Wie kann ich zusätzlich noch jede einzelne Form ansprechen, die müssen doch auch einen Namen haben, zb. Form1 .
Thx Hibbert |
hatt sie doch auch !
new_form
oder versteh ich dich falsch ?
Delete - So 07.03.04 00:53
Such mal hier nach
BUTTON DYNAMISCH da steht wie du dem Button eine OnClick-Prozedur zuweist, wenn es das ist, was du willst.
hibbert - So 07.03.04 23:23
jo danke, genau danach habe ich gesucht....
So, nun führe ich die Procedure zum dynamischen erstellen 3 mal durch.
Nun habe ich als 2 dynamisch erstellte formen, kann ich diese noch einzeln anspreche, oder haben diese alle den gleichen Namen?
thx hibbert
Killmag10 - Mo 08.03.04 00:10
hibbert hat folgendes geschrieben: |
jo danke, genau danach habe ich gesucht....
So, nun führe ich die Procedure zum dynamischen erstellen 3 mal durch.
Nun habe ich als 2 dynamisch erstellte formen, kann ich diese noch einzeln anspreche, oder haben diese alle den gleichen Namen?
thx hibbert |
du kannst blos die letzte ansprechen die du erstellt hast.
am besten ist es wenn du es mit einen array löst !
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Button1Click(Sender: TObject); var new_btn:array of Tbutton; begin SetLength(new_btn, 20); new_btn[0]:=tbutton.Create(new_form); new_btn[1]:=tbutton.Create(new_form); new_btn[0].Caption:='Mein 1. Button'; new_btn[1].Caption:='Mein 2. Button'; end; |
mfg. Killmag10
hibbert - Mo 08.03.04 20:24
ok, das funzt ja, doch nun habe ich folgendes Problem:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure MyButton(Sender: TObject); procedure Button1Click(Sender: TObject);
...
var Form1: TForm1; new_btn:array of Tbutton;
implementation
...
procedure Tform1.myButton(Sender: TObject); begin showmessage(''); end;
procedure TForm1.Button1Click(Sender: TObject); var new_form: tform; begin SetLength(new_btn, 20); new_btn[0]:=tbutton.Create(new_form); new_btn[1]:=tbutton.Create(new_form); new_btn[0].Caption:='Mein 1. Button'; new_btn[1].Caption:='Mein 2. Button'; new_btn[1].Left:=new_btn[0].Width+1; new_btn[0].OnClick:=myButton; new_btn[0].Parent:=form1; new_btn[1].Parent:=form1; end; |
Also das kompelieren funzt ja noch, doch wenn ich auf den Button klicke, kommt diese Nette Fehlermeldung:
Project1 hat folgendes geschrieben: |
Zugriffsverletzung bei Adresse 004032CE in Modul 'Project1.exe'. Lesen von Adresse 0000BCE1. |
Warum kommt diese Meldung?
thx hibbert
Killmag10 - Mo 08.03.04 21:58
hibbert hat folgendes geschrieben: |
ok, das funzt ja, doch nun habe ich folgendes Problem:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure MyButton(Sender: TObject); procedure Button1Click(Sender: TObject);
...
var Form1: TForm1; new_btn:array of Tbutton;
implementation
...
procedure Tform1.myButton(Sender: TObject); begin showmessage(''); end;
procedure TForm1.Button1Click(Sender: TObject); var new_form: tform; begin SetLength(new_btn, 20); new_btn[0]:=tbutton.Create(new_form); new_btn[1]:=tbutton.Create(new_form); new_btn[0].Caption:='Mein 1. Button'; new_btn[1].Caption:='Mein 2. Button'; new_btn[1].Left:=new_btn[0].Width+1; new_btn[0].OnClick:=myButton; new_btn[0].Parent:=form1; new_btn[1].Parent:=form1; end; |
Also das kompelieren funzt ja noch, doch wenn ich auf den Button klicke, kommt diese Nette Fehlermeldung:
Project1 hat folgendes geschrieben: | Zugriffsverletzung bei Adresse 004032CE in Modul 'Project1.exe'. Lesen von Adresse 0000BCE1. |
Warum kommt diese Meldung?
thx hibbert |
ganz einfach !
du erstellst die butten in einer Form die es nicht gibt !
Delphi-Quelltext
1: 2:
| new_btn[0]:=tbutton.Create(new_form); new_btn[1]:=tbutton.Create(new_form); |
Schreib mal statt new_form den namen deiner exestirenten Form rein (zb Form1)
oder füge vor den erstellen der buttens das ein:
Delphi-Quelltext
1: 2:
| new_form:=TForm.CreateNew(Application); new_form.show; |
Denk daran auch alles mit Free wieder Freizugeben !
hibbert - Mo 08.03.04 22:53
Hach stimmt ja, mist :roll:
naja nun funzt es, vielen Dank !!!
THX Hibbert
hibbert - Di 09.03.04 17:24
Titel: zu früh grefreut...
Mist, hab doch noch ne Frage:...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure type_text(Sender: TObject; var txt:string); ... implementation
{$R *.dfm}
procedure Tform1.type_text(Sender: TObject; var txt:string); begin showmessage(txt); end; ... SetLength(new_edit, 20); ... new_edit[anz]:=tedit.Create(new_form); new_edit[anz].Parent:=new_form; new_edit[anz].Top:=new_rich[anz].Height+1; new_edit[anz].Width:=new_form.Width-7; new_edit[anz].OnChange:=form1.type_text(form1.Button1,'txt'); |
Folgender Fehler tritt auf und die letzte Zeile meines hier angegebenden Quelltextes wird rot markiert:
compiler hat folgendes geschrieben: |
[Fehler] Unit1.pas(338): Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden |
Wie kann ich solch eine Procedure ausführen?
hibbert
rokdd - Di 09.03.04 21:24
hallo,
dein Problem ist das die Parameter von onclick und der procedure unterschiedlich sind. also wenn dann die parameter global deklinieren oder(weiß nicht wie das genau geht) eine neue Kompo machen.
Robert
Keldorn - Di 09.03.04 21:28
Hallo
Zitat: |
procedure Tform1.type_text(Sender: TObject; var txt:string);
begin
showmessage(txt);
end;
|
dir ist die Bedeutung von VAR bei der Parameterübergabe klar? In der Hilfe ist ein Punkt Wert-und Variablenparamter (unt Var (reserviertes Wort) guggn und siehe auch klicken.
Wenn du nur txt ausgeben willst, brauchst du das var nicht, und da du eine Stringkonstante 'txt' übergeben willst, meckert Delphi zurecht.
Mfg Frank
Keldorn - Di 09.03.04 22:56
hab mir vorhin nur deine Fehlermeldung und type_text angeschaut und nicht den restlichen Quelltext :oops: , aber ich versteh nicht ganz, was du willst.
Wenn du einen Hinweis bekommst, wie du ein Onclick-ereignis einem dynamisch erzeugten Button zuweist, ist es mir schleierhaft, wie man dann sowas
new_edit[anz].OnChange:=form1.type_text(form1.Button1,'txt'); überhaupt probieren kann. Warum sollte man denn das onchange anders machen als das onclick? Ein wenig auseinandersetzen mußt du dich schon damit, und es gibt wohl sehr viele (erklärenden) Einträge dazu bereits im Forum.
Ich hoffe, die showmessage beim onchange eines Edits ist nur ein Test, ansonsten kommst du bei einer Eingabe aus deinem Prog nicht so schnell wieder raus.
Auch würd mich mal interessieren, was für einen Text du da übergeben willst. nicht das dir bloß ein Typcast fehlt und du das Text des Edits willst.
Delphi-Quelltext
1: 2: 3: 4:
| Procedure OnChange... begin If (Sender is TEdit) then showmesssage(Tedit(Sender).text); end; |
Mfg Frank
hibbert - Mi 10.03.04 16:34
Also,
ich erzeuge eine neue Form mit einem editfeld darauf.
Das mit der showmessage ist auch nur ein test, eigendlich soll da nur überprüft werden, ob die enter taste gedrückt wurde oder nicht.
Wenn ja, dann soll der eingegebene Text, aus dem dynamischen editfeld, in eine listbox, welche nicht dynamisch ist, eingefügt werden.
Das ist alles, doch ich muss ja auch irgendwie den Quelltext so schreiben, dass es für das dynam. Editfeld gilt, und ganau das ist mein prob.
mfg hibbert
Christian S. - Mi 10.03.04 16:46
(1) Du kannst ein OnChange-Ereignis nicht so aufbauen. Ein OnChange-Ereignis erhält genau einen Parameter und das ist Sender : TObject.
(2) Wenn Du Edit.OnChange eine Prozedur zuweist, machst Du das nur mit den Prozedurennamen ohne die Paramter
(3) Du kannst einem VAR-Parameter keine Konstante zuweisen. Denn der könnte ich ja keinen Wert zuweisen.
hibbert - Mi 10.03.04 18:02
Peter Lustig hat folgendes geschrieben: |
(2) Wenn Du Edit.OnChange eine Prozedur zuweist, machst Du das nur mit den Prozedurennamen ohne die Paramter |
also so?
Delphi-Quelltext
1:
| new_edit[anz].OnChange:=procedurename; |
ok, das kenn ich ja schon, doch ich möchte ja gerne den Inhalt des Editfeldes auslesen und wo anders wieder einfügen, da muss ich doch irgendwie den Inhalt als var übergeben.
Wie mache ich das?
oder gibt es noch einen anderen Weg, um den inhalt eines bestimmten Editfeldes herrauszubekommen?
thx hibbert
Christian S. - Mi 10.03.04 18:09
Wie das mit dem Text geht, hat Keldorn doch schon gepostet!
Du hast das OnChange-Event und dort wird ein Sender übergeben. Der Sender ist das entsprechende Editfeld. Und da kannst Du dann den Text auslesen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.Edit1OnChange(Sender : TObject): var derText : String; begin if Sender is TEdit then derText := TEdit(Sender).Text; end; |
Es wäre ja auch ziemlicher Unsinn, den Parameter beim Erzeugen des Feldes zu übergeben, wie Du es wolltest. Wie sollte da schon was drin stehen ... :roll:
hibbert - Mi 10.03.04 19:22
ok stimmt ja auch wieder das mit der eingabe, sorry Peter :oops:
Aber wie kann ich jetzt noch überprüfen, ob eine bestimmte Taste gedrückt wurde, zb: die Enter Taste ?
thx hibbert
rokdd - Mi 10.03.04 19:35
als erstes: Wäre eigentlich ein neuer thread!!!
Wenn dann machst du eine globale variable die bei keypress auf deiner form die variable neu zuweist.
die variable ist wenn dann char oder word
Oder mit virtual key schau dazu mal im Forum!
Robert
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!