Autor Beitrag
ralph
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57

openSUSE 10.3 mit Crossover Linux 6.2
Delphi 3 Pro, Freereport 2.32
BeitragVerfasst: So 05.02.06 09:20 
Hallo,

ich habe einen Datenbankexplorer für Mybase geschrieben, der fast fertig ist. Dabei werden bei der Umschaltung vom Tabellenmodus in die Einzelsatzdarstellung, die Felder zur Laufzeit dynamisch generiert und ins Formular eingepaßt. Wenn er innerhalb der Schleife auf ein Feld vom Typ ftMemo trifft, soll er automatisch ein neues Fenster generieren, indem der Inhalt des dbmemo angezeigt wird. Also verfügt die geladene Datenbank xxx.cds über zwei Memofelder, sollten auch zwei Fenster aufgemacht werden. Oder gibt es einen besseren Vorschlag ? Oder erst ein Fenster generieren, wenn der Cursor in einem Memofeld steht ? Ich bin ratlos und komme nicht weiter !

Hier der Code:

ausblenden volle Höhe Delphi-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:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
procedure TForm1.form_maske;

var DBLabel : TLabel;

var Feld    : TDBEdit;

var Feldname : String;

var Feldtype : TFieldtype;

var Feldgroesse : Integer;

var i, Abstand : Integer;

var memo_fenster : TForm;

begin

if Datenbank.Active then

begin

DBGrid1.Visible := False;

Datenquelle.DataSet := Datenbank;

with Form1.Datenbank do

begin

Abstand := 40;

end;

for i := 0 to Datenbank.FieldCount -1 do

begin

Feldname := Form1.Datenbank.Fields[i].FieldName;

Feldgroesse := Form1.Datenbank.Fields[i].DataSize;

Feldtype := Form1.Datenbank.Fields[i].DataType;

// Neues DBEdit Feld wird nur erzeugt, wenn nicht schon vorhanden !

if TDBEdit(FindComponent('Feld_' + IntToStr(i)))= NIL then

begin

Feld := TDBEdit.Create(SELF);

end;

if TLabel(FindComponent('Label_' + IntToStr(i)))= NIL then

begin

DBLabel := TLabel.Create(SELF);

end;

// und werden dem Formular zugeordnet

Feld.Parent := Self;

DBLabel.Parent := DBGrid1.Parent;

// und erhöht Namen: Feld_1, Label_1, ...

Feld.Name := 'Feld_' + IntToStr(i);

DBLabel.Name := 'Label_' + IntToStr(i);

// Position und Abmessungen neu setzen

Feld.DataField := Feldname;

Feld.Top := 20 + Abstand;

Feld.Left := 400;

// DBLabel.Top := 25 + Abstand;

DBLabel.Top := -13 + Abstand;

DBLabel.Left := 30;

DBLabel.Caption := Feldname;

If Feldtype = ftString then

begin

Feld.Width := Feldgroesse * 9;

end;

If Feldtype = ftDate then

begin

Feld.Width := 90;

end;

If Feldtype = ftFloat then

begin

Feld.Width := 80;

end;

If Feldtype = ftBoolean then

begin

Feld.Width := 60;

end;

If Feldtype = ftMemo then

begin

// Hier gibt es Ärger

memo_fenster := TForm.Create(Self);

memo_fenster.Parent := self;

// ... hier weiterer Code

end;

Feld.DataSource := Datenquelle;

abstand := abstand + 30;

next;

end;

end;

end;


Danke, Ralli

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt
raiguen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 374

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: Di 28.02.06 12:29 
Titel: Denkanstoß
Moin :-)

Anregung: Vor dem Generieren der Datensensitiven Komopnenten (TDBEdit / TDBMemo) FeldTyp abfragen und entsprechende Komponente generieren ;-)

Hier der umgebaute Code (ist nicht getestet):

ausblenden volle Höhe Delphi-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:
procedure TForm1.form_maske;
var DBLabel : TLabel;
    Feld    : TDBEdit;
    FeldM   : TDBMemo;
    Feldname : String;
    Feldtype : TFieldtype;
    Feldgroesse : Integer;
    i, Abstand : Integer;

begin

  if Datenbank.Active then
    begin //active
      DBGrid1.Visible := False;
      Datenquelle.DataSet := Datenbank;

      Abstand := 40;
 
      for i := 0 to Datenbank.FieldCount -1 do
        begin //fieldCount
          Feldname := Form1.Datenbank.Fields[i].FieldName;
          Feldgroesse := Form1.Datenbank.Fields[i].DataSize;
          Feldtype := Form1.Datenbank.Fields[i].DataType;

          If Feldtype = ftMemo then
            begin
            // Neues DBMemo Feld wird nur erzeugt, wenn nicht schon vorhanden !
            if TDBMemo(FindComponent('Feld_' + IntToStr(i)))= NIL then
              begin
                FeldM := TDBMemo.Create(SELF);

                FeldM.Parent := Self;
                FeldM.Name := 'Feld_' + IntToStr(i);
                FeldM.DataField := Feldname;
                FeldM.DataSource := Datenquelle;

                //-- hier weitere Eigenschaften wie Top, Left etc setzen
                //...
                //...
                //-- sofortiges Anzeigen des Inhaltes
                FeldM.AutoDisplay := True;
             end;
             end
          else 
            // Neues DBEdit Feld wird nur erzeugt, wenn nicht schon vorhanden !
            if TDBEdit(FindComponent('Feld_' + IntToStr(i)))= NIL then
              begin // kein Memofeld
                Feld := TDBEdit.Create(SELF);
             
                // und werden dem Formular zugeordnet
                Feld.Parent := Self;

                Feld.Name := 'Feld_' + IntToStr(i);

                Feld.DataField := Feldname;
                Feld.DataSource := Datenquelle;

                // Position und Abmessungen neu setzen
                Feld.Top := 20 + Abstand;

                Feld.Left := 400;

                If Feldtype = ftString then
                  Feld.Width := Feldgroesse * 9;

                If Feldtype = ftDate then
                  Feld.Width := 90;

                If Feldtype = ftFloat then
                  Feld.Width := 80;

                If Feldtype = ftBoolean then
                  Feld.Width := 60;

          end; // kein Memofeld

          if TLabel(FindComponent('Label_' + IntToStr(i)))= NIL then
            begin
              DBLabel := TLabel.Create(SELF);
              DBLabel.Parent := DBGrid1.Parent;

              DBLabel.Name := 'Label_' + IntToStr(i);

              // DBLabel.Top := 25 + Abstand;
              DBLabel.Top := -13 + Abstand;

              DBLabel.Left := 30;

              DBLabel.Caption := Feldname;
          end;

          abstand := abstand + 30;

  end; //active

end;


Noch ein Denkanstoß: Plaziere auf Deinem AnzeigeFormular eine ScrollBox und create die Komponenten dorthin. Vorteil: ein schönes, sauberes Anzeigefenster, welches unabhängig von der Anzahl der Datenfelder ist ;-)
Naturlich muss die 'Eltern'-Eigenschaft entsprechend gesetzt werden: KomponenteXYZ.Parent := ScrollBox1

Verstehe das im Übrigen richtig, dass je nach Tabelle die entsprechenden Datenfelder-AnzeigeKomponenten generiert werden sollen und dann durch diese Tabelle gescrollt wird?

Gruß
ralph Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57

openSUSE 10.3 mit Crossover Linux 6.2
Delphi 3 Pro, Freereport 2.32
BeitragVerfasst: Di 28.02.06 22:14 
Titel: Und so funktioniert es
Moin,

habe Deine Denkanstöße umgesetzt, jetzt funktioniert die Einzelsatzdarstellung (oder der Formularmodus) einwandfrei, mußte aber noch einiges ändern. Hier nun der funktionierende und getestet Code:

ausblenden volle Höhe Delphi-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:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
procedure TFRM_Main.form_maske;

var    DBLabel     : TLabel;

var    DBEdit      : TDBEdit;

var    DBMemo      : TDBMemo;

var    Feldname    : String;

var    Feldtype    : TFieldtype;

var    Feldgroesse : Integer;

var    i, Abstand  : Integer;

begin

if Tabelle.Active then

begin

DBGrid1.Visible := False;

Abstand := 40;

for i := 0 to Tabelle.FieldCount -1 do

begin // FieldCount

Feldname := Tabelle.Fields[i].FieldName;
Feldgroesse := Tabelle.Fields[i].DataSize;
Feldtype := Tabelle.Fields[i].DataType;

If Feldtype = ftMemo then

begin

// Neues DBLabel wird nur erzeugt, wenn nicht schon vorhanden !

if TLabel(FindComponent('Label_' + IntToStr(i)))= NIL then

DBLabel := TLabel.Create(SELF);

DBLabel.Parent := DBGrid1.Parent;

DBLabel.Name := 'Label_' + IntToStr(i);

DBLabel.Top := -13 + Abstand;

DBLabel.Left := 30;

DBLabel.Caption := Feldname;

// Neues DBMemo Feld wird nur erzeugt, wenn nicht schon vorhanden !

if TDBMemo(FindComponent('Memofeld_' + IntToStr(i)))= NIL then

DBMemo := TDBMemo.Create(SELF);

DBMemo.DataSource := DataSource1;

DBMemo.Parent := Self;

DBMemo.Name := 'Memofeld_' + IntToStr(i);

DBMemo.DataField := Feldname;

//-- sofortiges Anzeigen des Inhaltes

DBMemo.AutoDisplay := True;

//-- hier weitere Eigenschaften wie Top, Left etc setzen

DBMemo.Top := 20 + Abstand;

DBMemo.Left := 400;

DBMemo.Width := 600;

DBMemo.Height := 200;

Abstand := Abstand + DBMemo.Height;

end

else

begin // kein Memofeld

// Neues DBEdit Feld wird nur erzeugt, wenn nicht schon vorhanden !

if TDBEdit(FindComponent('Editfeld_' + IntToStr(i)))= NIL then

DBEdit := TDBEdit.Create(SELF);

if TLabel(FindComponent('Label_' + IntToStr(i)))= NIL then

DBLabel := TLabel.Create(SELF);

// und werden dem Formular zugeordnet

DBEdit.Parent := Self;

DBLabel.Parent := DBGrid1.Parent;

// und erhöht Namen: Feld_1, Label_1, ...

DBEdit.Name := 'Editfeld_' + IntToStr(i);

DBLabel.Name := 'Label_' + IntToStr(i);

// Position und Abmessungen neu setzen

DBEdit.DataField := Feldname;

DBEdit.Top := 20 + Abstand;

DBEdit.Left := 400;

DBLabel.Top := -13 + Abstand;

DBLabel.Left := 30;

DBLabel.Caption := Feldname;

If Feldtype = ftString then

DBEdit.Width := Feldgroesse * 9;

If Feldtype = ftDate then

DBEdit.Width := 90;

If Feldtype = ftFloat then

DBEdit.Width := 80;

If Feldtype = ftBoolean then

DBEdit.Width := 60;

DBEdit.DataSource := DataSource1;

abstand := abstand + 30;

end; // kein Memofeld

end; //active

end;

end;


Das mit der Scrollbox implementiere ich demnächst. Danke, ich habe viel gelernt.

Ralli