Autor Beitrag
patmann2001
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 201

Windows 7 Prof.
Delphi XE2
BeitragVerfasst: Di 10.12.02 19:39 
Hallo
Ich möchte belibig viele Componenten zur Laufzeit erschaffen können. Dazu habe ich folgendes Programm geschrieben.
Man benötigt:
Eine Form mit dem Namen Felder_Form
Ein PageControle mit dem Namen Felder_Controle
Einen Button mit dem Namen Erschaffen_Button.
Alles andere sollte sich aufgrund des Codes erschaffen lassen
Das Programm:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
program felder;

uses
  Forms,
  erzeugen in 'erzeugen.pas' {felder_form};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(Tfelder_form, felder_form);
  Application.Run;
end.

Die Unit:
ausblenden volle Höhe 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:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
unit erzeugen;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, StdCtrls;

type
  Tfelder_form = class(TForm)
    felder_controle: TPageControl;
    erschaffen_button: TButton;
    procedure FormResize(Sender: TObject);
    procedure erschaffen_buttonClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
   boden_feld:ARRAY OF TTabSheet;
   eingabe_feld: ARRAY OF TEdit;
   anzeige_feld: ARRAY OF TRichEdit;
   nick_feld : Array OF TMemo;
   trennen_feld_button: ARRAY OF TButton;
    { Public-Deklarationen }
  end;

var
  felder_form: Tfelder_form;

implementation

{$R *.DFM}

procedure Tfelder_form.FormResize(Sender: TObject);
  begin
    felder_controle.Height := felder_form.ClientHeight -       erschaffen_button.Height - 5; 
    felder_controle.Width := felder_form.ClientWidth;
    erschaffen_button.Top := felder_controle.Height + 2;
    erschaffen_button.Left :=0;
end;

procedure Tfelder_form.erschaffen_buttonClick(Sender: TObject);
  VAR index,index2:INTEGER;
  begin
     index := Length(boden_feld);
     index2:=index;
     SetLength(boden_feld,index + 1);
     boden_feld[index2] := TTabSheet.Create(felder_controle);
     boden_feld[index2].PageControl :=felder_controle;
     boden_feld[index2].caption := IntToStr(index);
     boden_feld[index2].left:=0;
     boden_feld[index2].top :=0;
     boden_feld[index2].width := felder_controle.ClientWidth;
     boden_feld[index2].height := felder_controle.ClientHeight;
     boden_feld[index2].show;
     boden_feld[index2].setfocus;
     SetLength(anzeige_feld,index + 1);
     anzeige_feld[index2] :=TRichEdit.Create(boden_feld[index2]);
     anzeige_feld[index2].left:=0;
     anzeige_feld[index2].top :=0;
     anzeige_feld[index2].width := boden_feld[index2].ClientWidth - 100;
     anzeige_feld[index2].height := boden_feld[index2].ClientHeight - 52;
     anzeige_feld[index2].show;
     SetLength(eingabe_feld,index + 1);
     eingabe_feld[index2] := TEdit.Create(boden_feld[index2]);
     eingabe_feld[index2].left := 0;
     eingabe_feld[index2].top := anzeige_feld[index2].height + 2;
     eingabe_feld[index2].width := boden_feld[index2].ClientWidth - 100;
     eingabe_feld[index2].height := 50;
     eingabe_feld[index2].show;

     SetLength(nick_feld,index + 1);
     nick_feld[index2] := TMemo.Create(boden_feld[index]);

     SetLength(trennen_feld_button,index + 1);
     trennen_feld_button[index2] := TButton.Create(boden_feld[index]);

end;

procedure Tfelder_form.FormClose(Sender: TObject;
  var Action: TCloseAction);
  VAR index:INTEGER;
    begin
       For index := 0 to High(eingabe_feld) DO
            eingabe_feld[index].Free;
       For index := 0 to High(anzeige_feld) DO
            anzeige_feld[index].free;
       For index := 0 to High(nick_feld) DO
            nick_feld[index].free;
       For index := 0 to High(trennen_feld_button) DO
            trennen_feld_button[index].free;
       For index := 0 to High(boden_feld) DO
            boden_feld[index].free;
end;

end.

So, nun zum eigentlichen Problem. Es werden zwar TTabSheet's erschaffen, aber darauf erscheint weder das TRichEdit noch das TEdit obwohl ich sie erschaffe, eine Position zuweise und Show auslöse. Was mache ich falsch????????
:?

cu Patmann
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 10.12.02 19:50 
Du mußt noch das Parent zuweisen für das Edit und das RichEdit.

Komisch, irgendwie liegt es immer daran. Jedes mal, wenn jemand fragt warum klappt das mit dem Komponenten zur Laufzeit erstellen nicht, liegt es zu 99% daran. So langsam sollte sich das aber rumgesprochen haben bzw. eine kurze Suche im Forum sollte das Problem lösen. :twisted: :roll:


Zuletzt bearbeitet von Luckie am Mi 11.12.02 10:11, insgesamt 1-mal bearbeitet
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 10.12.02 20:15 
Im übrigen würde ich Dir raten, Dir mal den Befehl "with ... do" anzuschauen. Das macht das Programm übersichtlicher.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Mi 11.12.02 09:27 
Noch ne Anmerkung: Das Array für deine TabSheets kannst du dir eigentlich sparen, da die TabSheets ja sowieso als Array von Pages in deinem PageControl behandelt werden.

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...