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 user profile iconDeCodeGuru: 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 Suche in: Delphi-Forum, Delphi-Library 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