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!!