Textfeld während Laufzeit erstellen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
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 »

Warum ist der Zugriff jetzt einfacher als über eine TComponentList?
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 »

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

paulderfinne
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

Beitrag von paulderfinne »

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.


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.
 

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Textfeld während Laufzeit erstellen

Beitrag von Michl »

Probiere es mal so:

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)
...
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

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

paulderfinne
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

Beitrag von paulderfinne »

Michl hat geschrieben:Probiere es mal so:

Ja, das war's! Vielen herzlichen Dank für die schnelle Hilfe.
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.

Hmm. ja , da hast du sicherlich recht. Muss mich noch ein wenig mit diesen Sachen (Constructor, Destructor.. ) beschäftigen.

Antworten