Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Editfeld dynamisch erzeugen
DJ_Apfel - Mo 09.12.02 16:03
Titel: Editfeld dynamisch erzeugen
Hi,
ich möchste Editfelder zur Laufzeit des Programmes erzeugen allerdings mit TEdit funzt das nicht so ganz :/. Ich erstelle eine Variable vom Typ TEdit aber das endet mit der Fehlermeldung. Bei den anderen Beiträgen wo Labels erzeugt werden geht es?!
Udontknow - Mo 09.12.02 16:10
Hi!
Drücke dich bitte deutlicher aus! Wenn du eine Fehlermeldung erhälst, wieso nennst du sie dann nicht?
Cu,
Udontknow
Tino - Mo 09.12.02 16:12
Poste doch mal den Sourcecode der den Fehler verursacht!
Gruß
TINO
DJ_Apfel - Mo 09.12.02 17:07
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var textfeld: TEdit;
begin
textfeld.create...?
end; |
So nun hab ich erhofft das wie bei jedem Objekt ne schöne Programmierhilfe kommt :) aber ich habe hier keine Anhaltspunkte...
Der Fehler besagt nur das TEdit nicht deklariert ist.
Trialtom - Mo 09.12.02 17:10
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Editfeld : TEdit; begin Editfeld:= TEdit.Create(self); Editfeld.Parent := Self; Editfeld.Left := X; Editfeld.Top := Y; Editfeld.Width := Editfeld.Width + 50; Editfeld.Text :='Mhhh'; end; |
das ist sicher der quellcode den du auch hast.
bei mir bringt es den fehler, dass ich kein semikolon gesetzt hätte und wie du jetzt auch gesagt hast, TEdit nicht deklariert ist.
wird nie behoben, außer, wenn ich kurz auf dem formular ein editfenster aus der komponentenpalette erstelle geht es. Danach kann ich es auch löschen und es geht immernoch.
aber warum muss ich erst ein editfeld erstellen, was ich dann eh wieder löschen kann??
DJ_Apfel - Mo 09.12.02 18:00
Ich weiß (glaube ich) warum und zwar müssen wir beide TEdit gaanz oben deklarieren. Allerdings bin ich in Objekten deklarieren noch ein Noob :),
deswegen plz eine Antowort von den Profs.
Christian S. - Mo 09.12.02 18:02
Zitat: |
aber warum muss ich erst ein editfeld erstellen, was ich dann eh wieder löschen kann?? |
Weil dann der Eintrag "StdCtrls" in der Uses-Klausel erscheint (bei mir erst, wenn ich das Programm einmal starte). Wenn Du diesen Eintrag manuell vornimmst, wird das Programm auch ohne das Erstellen des Edit-Feldes funktionieren.
MfG,
Peter
DJ_Apfel - Mo 09.12.02 19:18
Achso also man muss eine Unit einbinden.
Aber jetzt wo es funzt gibt es grad das nächste prob, wie kann man nun auf die Textfelder zugreifen? Solange sie nicht vorhanden sind Kompelliert Delphi den ganzen Ramsch nicht.
Christian S. - Mo 09.12.02 20:33
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Editfeld : TEdit; begin inc(i); Editfeld:= TEdit.Create(self); Editfeld.Parent := Self; Editfeld.Left := X; Editfeld.Top := Y; Editfeld.Width := Editfeld.Width + 50; Editfeld.Text :='Mhhh'; Editfeld.name:='feld'+IntToStr(i); end;
procedure TForm1.Button1Click(Sender: TObject); begin TEdit(Form1.FindComponent('feld1')).Text:='Hallo'; end; |
Dies wäre eine Möglichkeit: Du gibst den Feldern, wenn Du sie erstellst, einen eindeutigen Namen. Das habe ich hier mit der Laufvariable i gelöst, die ich bei Programmstart noch mit 0 initialisiert habe. Dann kannst Du ganz einfach über die Namen der Editfelder auf sie zugreifen.
Oder aber du deklarierst Deine Variablen für die Editfelder global, für Dich hier praktisch wäre ein Array of TEdit. Dann kannst Du beliebig viele Felder erstellen und über das Array ansprechen. Bei beiden musst Du vorher sicherstellen, dass die Editfelder, die Du ansprechen willst, auch vorher per TEdit.Create erstellt worden sind.
MfG,
Peter
Wolff68 - Mo 09.12.02 23:04
Du kannst auf das Edit nachher ganz normal zugreifen.
Nur solltest Du es 1. unter public deklarieren und 2. vor dem Aufruf dann auch wirklich erzeugt haben, oder prüfen, ob es existiert.
Hier mal ein ausführliches Beispiel:
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: 32: 33:
| type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } Edit2: TEdit; // Hier die deklaration von Edit2 vornehmen. end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin Edit2 := TEdit.Create(Self); Edit2.Parent := self; Edit2.Name := 'Edit2'; end;
procedure TForm1.Button2Click(Sender: TObject); begin IF Assigned(Edit2) then // prüft, ob Edit2 existiert Edit1.Text := Edit2.Text; end; |
DJ_Apfel - Di 10.12.02 14:36
@ wolff68 danke für das TUT aber das funzt nicht so ganz: Es wird kein Inhalt
von Edit2 nach Edit1 verschoben als ob er die Namen der beiden Textfelder ignoriert. Woran liegt das? (hast du dieses kleine Progra,, bei dir getestet?)
Christian S. - Di 10.12.02 15:54
@Wolff68: ich war davon ausgegangen, dass das ganze für beliebig viele Editfelder funktionieren soll, die bei jedem OnMouseDown-Ereignis erschaffen werden. Deswegen habe ich das ganze als Array of TEdit geplant. Ansonsten funktioniert es ja aber genauso.
Wolff68 - Mi 11.12.02 20:31
Hast recht Peter. Ich hab nicht daran gedacht, daß es mehrere sein sollen.
Aber um das Prinzip zu verstehen, ist es vielleicht besser erst mal mit einem anzufangen, und nicht gleich mit Findcomponent anzufangen.
@DJ:
Ja, der Code war getestet. Wundert mich, wenn er bei Dir nicht funktionieren sollte.
Das Edit2 wird angezeigt und dennoch nichts verschoben?
Dann kann es nur noch an dem IF Assigned liegen. Das Name := 'Edit2'; hast aber mit übernommen, oder?
Ansonsten kannst ja mal einen haltepunkt setzen, und nachsehen, ob das Assigned auf false steht obwohl das Edit2 erzeugt wurde.
Christian S. - Mi 11.12.02 20:36
Zitat: |
Aber um das Prinzip zu verstehen, ist es vielleicht besser erst mal mit einem anzufangen, und nicht gleich mit Findcomponent anzufangen. |
Ja, auf jeden Fall!!
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!