Textfeld während Laufzeit erstellen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Textfeld während Laufzeit erstellen

Beitrag von ConcAPPtLab »

Hallo Communtiy,

ja, ich wei. Das Thema, das ich anspreche, findet sich schon ein paar mal im Internet. Allerdings nur auf Delphi-, nicht auf Lazarus-Seiten (jedenfalls hab ichs nur dort gefunden).

Wie dem auch sei. Ich möchte im in einem Programm Textfelder und Buttons und Variablen zur Laufzeit erstellen. Zu den Textfeldern hab ich schon mal folgenden Code<.

Code: Alles auswählen

NewEdit:=TEdit.Create(Self);
  NewEdit.Parent := Self;
  NewEdit.Left := 100;
  NewEdit.Top := 100;
  NewEdit.Width:=203;

Allerdings kommt da dann immer die Fehlermeldung 'Identifier not found "Edit"'. Das gleiche gilt für Edit statt NewEdit und für Button statt Edit. Und für Variablen hab ich noch keine Idee (sollte ich vielleicht mit nem dynamischen Array arbeiten???)

Wenn ihr mir weiterhelfen könntet: ich würde mich freuen :)

Bis dann
ConcAPPtLab
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Textfeld während Laufzeit erstellen

Beitrag von m.fuchs »

Hast du denn die Variablen denn deklariert in deinem Form?
So zum Beispiel:

Code: Alles auswählen

 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
  private
    NewEdit: TEdit;
  end;


Oder alternativ, wenn du die Komponente nur innerhalb deiner Funktion benötigst:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  NewEdit: TEdit;
begin
 
end;


ConcAPPtLab hat geschrieben: Und für Variablen hab ich noch keine Idee (sollte ich vielleicht mit nem dynamischen Array arbeiten???)

Das hängt alles davon ab, was du eigentlich bewirken möchtest. Gib uns doch einmal etwas mehr Informationen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Textfeld während Laufzeit erstellen

Beitrag von ConcAPPtLab »

Hallo Michael,

danke, ch hab natürlich NewEdit nicht daklariert. Jetzt geht das erstmal.

Zum Projekt:

starte mit 3 Edits. In die kann ich dann etwas hinein schreiben. Dann hab ich aber noch die Möglichkeit, weitere Edits dazu zu erstellen.

Im Anhang seht ihr nochmal die Programm-Oberfläche (die kleine Form auf dem rechten Bildschirm).
Wenn ich auf den '+'-Button klicke, soll ein weiteres Editfeld mit Buttons links und recht erstellt werden.
Wenn ich aber auf einen Button mit 'x' klicke, soll diese Feld gelöscht werden und verschwinden.
Klicke ich auf einen der Button auf der linken Seite, so öffnet sich ein PopUpMenu, wo man die gewünschte Rechenfunktion auswählen kann.

Und das möchte ich halt machen.

Zu den Variablen: das wird ein Programm, was Alphametike (?) lösen soll. Also wenn ich ein Wort eingebe, sollen die Buchstaben in Zahlen umgewandelt werden, und versucht werden, eine gültige Gleichung aufzustellen. Und je mehr Buchstaben desto mehr Variablen (max. 26).

So, ich weiß nicht, ob man das jetzt halbwegs verstehen kann, was ich vorhab.

ConcAPPtLab
Dateianhänge
Oberfläche.png
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Stefan67
Beiträge: 33
Registriert: Di 2. Sep 2014, 23:49
OS, Lazarus, FPC: Linux 3.16, Lazarus 1.0.14, FPC 2.6.2
CPU-Target: 32Bit

Re: Textfeld während Laufzeit erstellen

Beitrag von Stefan67 »

ConcAPPtLab hat geschrieben:... Ich möchte im in einem Programm Textfelder und Buttons und Variablen zur Laufzeit erstellen. ...


Würde es nicht reichen, die Textfelder und Buttons via visible false/true ein- und auszublenden?

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Textfeld während Laufzeit erstellen

Beitrag von ConcAPPtLab »

Nein. Das würde nicht reichen, weil der Benutzer theoretisch unendlich viele Wörter eingeben soll.
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Textfeld während Laufzeit erstellen

Beitrag von m.fuchs »

Hm, und ein Memofeld oder ein StringGrid scheiden aus, als Eingabecontrol?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Textfeld während Laufzeit erstellen

Beitrag von ConcAPPtLab »

Naja. Theoretisch möglich, aber praktisch ist das nicht. Der Benutzer soll nämlich die Rechenoperationen eingeben können. Und das ist über so einen Weg im Grunde idiotensicher. Man kann nichts falsches eingeben. Und es erspart Kontrollcodes, ob das Eingegebene jetzt richtig ist.

Aber die Erstellung von neuen Edits funktioniert dank Michael ja sehr gut. Und denen müsste man ja dann auch einen Namen zuordnen können, oder?

Mit den Variablen überleg ich mir noch genau, wie ich das am besten machen kann.

Eine frage hab ich noch: kann ich eigentlich statt

Code: Alles auswählen

if Sender = Button1 then
begin
...
end
else if Sender=Button2 then
begin
...
end
else ...
.
.
.
else if Sender = Buttonx then
begin
...
end;

auch einfach schreiben:

Code: Alles auswählen

repeat
if Sender=Buttonx then
...
end;
x:=x+1;
until x=z;

Dann könnte der Benutzer einfach so viele Buttons und Edits erstellen wie er will, und ich kann dann mit Hilfe von x (aktuell abgefragter Button) und z (Button insgesamt) herausfinden, welcher Button gedrückt worden ist. Kann man das so oder ähnlich schreiben?
Hoffe, ich habe euch nicht verwirrt :)

Grüße
ConcAPPtLab
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Textfeld während Laufzeit erstellen

Beitrag von m.fuchs »

ConcAPPtLab hat geschrieben:Naja. Theoretisch möglich, aber praktisch ist das nicht. Der Benutzer soll nämlich die Rechenoperationen eingeben können. Und das ist über so einen Weg im Grunde idiotensicher. Man kann nichts falsches eingeben. Und es erspart Kontrollcodes, ob das Eingegebene jetzt richtig ist.


Da verstehe ich jetzt nicht, was eine Reihe von TEdits da sicherer macht, als ein TStringGrid.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Textfeld während Laufzeit erstellen

Beitrag von ConcAPPtLab »

erklär ich heute abend. bis dann, muss jetzt los
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Textfeld während Laufzeit erstellen

Beitrag von ConcAPPtLab »

Also, ich merk gerade, mit ner Stringlist kann mans im Grunde genause machen wie mit den Edits. Nur fin dich das persönlich nicht so schön. Also wenn ihr noch Lösungsansätze habt, würde ich die bevorzugen. einfach aus "designtechnischen" Gründen ;)
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Textfeld während Laufzeit erstellen

Beitrag von m.fuchs »

Nicht StringList sondern StringGrid. Das sind ganz unterschiedliche Dinge.

Wenn dir das nicht gefällt, kannst du sicher auch bei deiner Lösung mit den Edit-Feldern bleiben. Du solltest bei der Menge aber eine TComponentList benutzen, um die Referenzen auf die Editfelder zu speichern. Ich würde das ganze dann noch in eine Scrollbox packen.

Der Code zum Hinzufügen ginge dann beispielsweise so:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  NewEdit: TEdit;
begin
  NewEdit := TEdit.Create(Self);
  NewEdit.Parent := ScrollBox1;
  NewEdit.Left := 10;
  NewEdit.Width:=120;
  if EditList.Count > 0 then
    NewEdit.Top := (EditList.Last as TEdit).Top + 35
  else
    NewEdit.Top := 10;
  EditList.Add(NewEdit);
end;


Das Löschen des letzten Elementes kann man dann so durchführen:

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
var
  LastComponent: TComponent;
begin
  LastComponent := EditList.Last;
  if Assigned(LastComponent) then begin
    EditList.Remove(LastComponent);
    FreeAndNil(LastComponent);
  end;
end;


Wenn auch "mittendrin" gelöscht werden soll, wird es etwas komplexer.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Textfeld während Laufzeit erstellen

Beitrag von ConcAPPtLab »

Dankeschön, das hilft mir schon sehr viel weiter :)
Mittendrin zu löschen muss dann nicht unbedingt sein. Ich hab aber noch eine Frage:
Kriegt dann jedes Editfeld einen Namen wie z.B. 'Edit1', 'Edit2' etc.?
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Textfeld während Laufzeit erstellen

Beitrag von theo »

ConcAPPtLab hat geschrieben:Dankeschön, das hilft mir schon sehr viel weiter :)
Mittendrin zu löschen muss dann nicht unbedingt sein. Ich hab aber noch eine Frage:
Kriegt dann jedes Editfeld einen Namen wie z.B. 'Edit1', 'Edit2' etc.?


Einen Namen oder ein Tag (Integer) kannst du dem Edit selber geben.
Es lässt sich aber auch über seinen Platz in der "EditList" identifizieren.

ConcAPPtLab
Beiträge: 89
Registriert: Fr 18. Apr 2014, 18:57

Re: Textfeld während Laufzeit erstellen

Beitrag von ConcAPPtLab »

Danke. ich wird mal gucken wie das geht
Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Textfeld während Laufzeit erstellen

Beitrag von Mathias »

Ich hätte die Edits und Buttons in eine dynamische Array gepackt:

Somit ist der Zugriff auf die einzelnen Elemente recht einfach.

Code: Alles auswählen

procedure TForm1.ErzeugenClick(Sender: TObject);
var
  p: integer;
begin
  p := Length(Elemente);
  SetLength(Elemente, p + 1);
  Elemente[p].Edit := TEdit.Create(self);
  with Elemente[p].Edit do begin
    Parent := ScrollBox1;
    Top := p * 22;
    Name := 'Edit' + IntToStr(p);
    Text := Name;
  end;
 
  Elemente[p].Button := TButton.Create(self);
  with Elemente[p].Button do begin
    Parent := ScrollBox1;
    Left := Elemente[p].Edit.Width + 8;
    Width := 40;
    Height := 20;
    Top := p * 22;
    Name := 'Button_' + IntToStr(p);
    Caption := IntToStr(p);
    Tag := p;
    OnClick := @ButtonClick;
  end;
end;
 
procedure TForm1.LoeschenClick(Sender: TObject);
var
  l: integer;
begin
  l := Length(Elemente);
  if l > 0 then begin
    Elemente[l - 1].Edit.Free;
    Elemente[l - 1].Button.Free;
    SetLength(Elemente, l - 1);
  end;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to Length(Elemente) - 1 do begin
    Elemente[i].Edit.Free;
    Elemente[i].Button.Free;
  end;
  SetLength(Elemente, 0);
end;
 
procedure TForm1.ButtonClick(Sender: TObject);
var
  p: integer;
begin
  p := TButton(Sender).Tag;
  Elemente[p].Edit.Text := Elemente[p].Edit.Text + 'x';
end;   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten