Textfeld während Laufzeit erstellen
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2808
- 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
Warum ist der Zugriff jetzt einfacher als über eine TComponentList?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Beiträge: 89
- Registriert: Fr 18. Apr 2014, 18:57
Re: Textfeld während Laufzeit erstellen
Hey danke. Das sieht so aus als würde es genau das machen was ich will. Danke 

Definition "Strategische Fehlerkorrektur":
Solange rumprobieren bisses klappt :D
Solange rumprobieren bisses klappt :D
-
- Beiträge: 65
- Registriert: Mi 27. Feb 2013, 18:24
- OS, Lazarus, FPC: Linux (L 0.9.30.4-1.1 FPC 2.6.0)
- CPU-Target: 32Bit
Re: Textfeld während Laufzeit erstellen
Hallo Mathias und alle anderen,
klinke mich hier mal ein, weil ich auch so was mal probieren wollte. Ich habe mal versucht deinen Code in eine UInit einzubinden, aber irgendwas mache ich falsch. Wenn ich den "Button1" mit dem Procedure ErzeugenClick verbinde bekomme ich eine SIGSEGV Exception in der Zeile
Elemente[p].Edit := TEdit.Create(self);
Wahrscheinlich mache ich da mit der Class was falsch. Bin nicht wirklich firm in den OO-Programmierung.
klinke mich hier mal ein, weil ich auch so was mal probieren wollte. Ich habe mal versucht deinen Code in eine UInit einzubinden, aber irgendwas mache ich falsch. Wenn ich den "Button1" mit dem Procedure ErzeugenClick verbinde bekomme ich eine SIGSEGV Exception in der Zeile
Elemente[p].Edit := TEdit.Create(self);
Wahrscheinlich mache ich da mit der Class was falsch. Bin nicht wirklich firm in den OO-Programmierung.
Code: Alles auswählen
unit unit_entwurf;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,StdCtrls, ExtCtrls;
type
{ TForm1 }
Tform1 = class(TForm)
Button1: TButton;
ScrollBox1:TScrollbox;
procedure ErzeugenClick(Sender: TObject);
procedure LoeschenClick(Sender: TObject);
procedure FormDestroy(Sender:Tobject);
procedure ButtonClick(Sender:TObject);
private
{ private declarations }
public
{ public declarations }
end;
Telemente = class
Edit:TEdit;
Button:TButton;
end;
var
Form1:Tform1;
Elemente : array of Telemente;
implementation
{$R *.lfm}
{ TForm1 }
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;
end.
Re: Textfeld während Laufzeit erstellen
Probiere es mal so:Wenn Du Elemente[p] erstellst, musst Du sie dann auch entsprechend wieder mit frei geben (nicht nur TEdit und TButton)!
PS: würde ich sowas realisieren wollen, würde ich einen Constructor ( + Destructor + sonstige Methoden) für TElemente erstellen, in dem das TEdit und der TButton erstellt würden, nicht in einem Eventhandler.
Code: Alles auswählen
...
SetLength(Elemente, p + 1);
Elemente[p]:=TElemente.Create; //Diese Zeile einfügen (das Elemente[p] wurde noch nicht erstellt)
Elemente[p].Edit := TEdit.Create(Nil); //Wenn Du sowieso per Hand aufräumst, brauchst Du keinen Owner übergeben (ansonsten müsstest Du auch TElemente mit einem Owner versorgen)
...
PS: würde ich sowas realisieren wollen, würde ich einen Constructor ( + Destructor + sonstige Methoden) für TElemente erstellen, in dem das TEdit und der TButton erstellt würden, nicht in einem Eventhandler.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 65
- Registriert: Mi 27. Feb 2013, 18:24
- OS, Lazarus, FPC: Linux (L 0.9.30.4-1.1 FPC 2.6.0)
- CPU-Target: 32Bit
Re: Textfeld während Laufzeit erstellen
Ja, das war's! Vielen herzlichen Dank für die schnelle Hilfe.Michl hat geschrieben:Probiere es mal so:
Hmm. ja , da hast du sicherlich recht. Muss mich noch ein wenig mit diesen Sachen (Constructor, Destructor.. ) beschäftigen.Michl hat geschrieben: Wenn Du Elemente[p] erstellst, musst Du sie dann auch entsprechend wieder mit frei geben (nicht nur TEdit und TButton)!
PS: würde ich sowas realisieren wollen, würde ich einen Constructor ( + Destructor + sonstige Methoden) für TElemente erstellen, in dem das TEdit und der TButton erstellt würden, nicht in einem Eventhandler.