Autor Beitrag
Martin W
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 116



BeitragVerfasst: So 31.10.04 11:01 
Ich stehe gerade vor nem riesen Problem... Also folgendes, erst mal hab ich nen bisschen Code für euch:


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type Gebaude_senkt_kosten_eines_bauwerks_spez = record
                      Entstufe: integer;
                      wieviel_prozent_minus: integer;
                    end;

type Gebaude_senkt_kosten_eines_bauwerks = record
                      Gebaude_senkt_kosten_eines_bauwerks_spez_anzahl: integer;
                      Gebaude_senkt_kosten_eines_bauwerks_spez: array of Gebaude_senkt_kosten_eines_bauwerks_spez;
                      Name_der_Bauwerks: string;
                    end;

var
  Savelist: array of Gebaude_senkt_kosten_eines_bauwerks;


Ich hoffe das ist leicht verständlich. Ich habe praktisch mehrfach verschachelte Arrays. Beispiel:

Savelist hat ne Länge von 3;
Gebaude_senkt_kosten_eines_bauwerks_spez hat ne Länge von 4;

Das heißt ich hätte folgende Zugriffsmöglichkeiten:

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:
Savelist[0] --->
- Gebaude_senkt_kosten_eines_bauwerks_spez[0]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Gebaude_senkt_kosten_eines_bauwerks_spez[1]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Gebaude_senkt_kosten_eines_bauwerks_spez[2]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Gebaude_senkt_kosten_eines_bauwerks_spez[3]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Name_der_Bauwerks: string;
- Gebaude_senkt_kosten_eines_bauwerks_spez_anzahl: integer;
Savelist[1] --->
- Gebaude_senkt_kosten_eines_bauwerks_spez[0]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Gebaude_senkt_kosten_eines_bauwerks_spez[1]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Gebaude_senkt_kosten_eines_bauwerks_spez[2]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Gebaude_senkt_kosten_eines_bauwerks_spez[3]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Name_der_Bauwerks: string;
- Gebaude_senkt_kosten_eines_bauwerks_spez_anzahl: integer;
Savelist[2] --->
- Gebaude_senkt_kosten_eines_bauwerks_spez[0]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Gebaude_senkt_kosten_eines_bauwerks_spez[1]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Gebaude_senkt_kosten_eines_bauwerks_spez[2]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Gebaude_senkt_kosten_eines_bauwerks_spez[3]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Name_der_Bauwerks: string;
- Gebaude_senkt_kosten_eines_bauwerks_spez_anzahl: integer;
Savelist[3] --->
- Gebaude_senkt_kosten_eines_bauwerks_spez[0]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Gebaude_senkt_kosten_eines_bauwerks_spez[1]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Gebaude_senkt_kosten_eines_bauwerks_spez[2]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Gebaude_senkt_kosten_eines_bauwerks_spez[3]
  - Entstufe: integer;
  - wieviel_prozent_minus: integer;
- Name_der_Bauwerks: string;
- Gebaude_senkt_kosten_eines_bauwerks_spez_anzahl: integer;


Das letzte Aufzählung sollte verdeutlichen wie das ganze Funktioniert. Frage: Wie speicher ich das ganze Sinnvoll in einer Datei? Welches Dateiformat??? Und wie lese ich das ganze wieder aus, das anschließend alle Arrays die richtige Länge haben und die richtigen Daten enthalten???

Und noch ein wichtiger Hinweis: Im Extremfall können dies (insgesamt, also durch alle Variablen in meinem Quelltext und nicht nur durch die paar die hier als Beispiel stehen) 7- stellig viele Variablen sein.

Danke für eure Antwort im Vorraus, ist mir sehr sehr wichtig!!!

Gruß vom
Maddin ;-)
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: So 31.10.04 11:20 
Hallo

würd mich auch hier für einen Stream entscheiden. Beim Speichern die arraylänge reinschreiben und bei auslesen entsprechend anders rum
kleines Bsp (ungestestet): für das äußere Array gehts analog.
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:
Procedure Speichern...;
Var Stream : TStream;
   i:integer;
  begin
    Stream:=TFilestream.create(Dateiname,fmcreate);
    try
      with Twriter.create(Stream,1024) do
        try
          writestring(Name_der_Bauwerks);
          writeinteger(Gebaude_senkt_kosten_eines_bauwerks_spez_anzahl);

          //inneres array, erst länge dann daten schreiben
          writeinteger(length(Gebaude_senkt_kosten_eines_bauwerks_spez));
          for i:=0 to length(Gebaude_senkt_kosten_eines_bauwerks_spez)-1 do
            begin
              Writeinteger(Gebaude_senkt_kosten_eines_bauwerks_spez[i].Entstufe);
              Writeinteger (Gebaude_senkt_kosten_eines_bauwerks_spez[i].wieviel_prozent_minus);
            end;
        finally
          free;
        end; 
    finally
      Stream.free;
    end;
  end;

Proc Laden
Var Stream : TStream;
   i,len:integer;
  begin
    Stream:=TFilestream.create(Dateiname,fmopenRead);
    try
      with TReader.create(Stream,1024) do
        try
          Name_der_Bauwerks:=readsting;
          Gebaude_senkt_kosten_eines_bauwerks_spez_anzahl:=readinteger;

          //inneres array, erst länge dann daten lesen
          len := ReadInteger;
          SetLength(Gebaude_senkt_kosten_eines_bauwerks_spez,len);
          for i:=0 to len-1 do
            begin
              Gebaude_senkt_kosten_eines_bauwerks_spe[i].Entstufe     := Readinteger;
              Gebaude_senkt_kosten_eines_bauwerks_spe[i].ZuschlagEuro    := Readinteger;
            end;
        finally
          free;
        end; 
    finally
      Stream.free;
    end;
  end;

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Martin W Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 116



BeitragVerfasst: So 31.10.04 11:32 
Schon mal danke, werd´s testen... Gibt es da irgendwas zu beachten??? Dürfen zum Beispiel keine Variablennamen doppelt vorkommen oder darf eine Variablen leer ('') sein ???

Gruß
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: So 31.10.04 11:33 
wie meinst du das mit doppelt vorkommen?
Natürlich können variablen auch als string '' enthalten

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Martin W Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 116



BeitragVerfasst: So 31.10.04 11:40 
Denkfehler.. ich mach mal ein Beispiel:

ausblenden 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:
type schachtel4 = record
                      schachtel4wert1: string;
                      schachtel4wert2: integer;
                      schachtel4wert3: integer;
                      schachtel4wert4: string;
                    end;


type schachtel3 = record
                      schachtel4: array of schachtel4;
                      schachtel3wert1: integer;
                      schachtel3wert2: string;
                      schachtel3wert3: string;
                      schachtel3wert4: integer;
                    end;

type schachtel2 = record
                      schachtel3: array of schachtel3;
                      schachtel2wert1: string;
                      schachtel2wert2: integer;
                      schachtel2wert3: integer;
                      schachtel2wert4: string;
                    end;
var
  schachtel2: array of schachtel2;
  schachtel1wert1: string;
  schachtel1wert2: integer;
  schachtel1wert3: integer;
  schachtel1wert4: string;


Wie müsste der Code dafür jetzt heißen??? Seh da nicht so ganz durch...
Martin W Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 116



BeitragVerfasst: So 31.10.04 12:48 
Hab es doch rausbekommen, bitte sagt mir ob ihr noch Fehler im Source findet!!!

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:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Label5: TLabel;
    SpinEdit4: TSpinEdit;
    Label6: TLabel;
    Label7: TLabel;
    ComboBoxEx1: TComboBoxEx;
    SpinEdit5: TSpinEdit;
    SpinEdit6: TSpinEdit;
    SpinEdit7: TSpinEdit;
    Button2: TButton;
    Label8: TLabel;
    Edit1: TEdit;
    Label9: TLabel;
    Label10: TLabel;
    SpinEdit8: TSpinEdit;
    SpinEdit9: TSpinEdit;
    SpinEdit10: TSpinEdit;
    SpinEdit11: TSpinEdit;
    Label11: TLabel;
    ComboBoxEx2: TComboBoxEx;
    Label12: TLabel;
    Edit2: TEdit;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type schachtel4 = record
                      wert1: string;
                      wert2: string;
                      wert3: string;
                      wert4: string;
                    end;


type schachtel3 = record
                      schachtel4: array of schachtel4;
                      wert1: string;
                      wert2: string;
                      wert3: string;
                      wert4: string;
                    end;

type schachtel2 = record
                      schachtel3: array of schachtel3;
                      wert1: string;
                      wert2: string;
                      wert3: string;
                      wert4: string;
                    end;
var
  schachtel2inhalt: array of schachtel2;
  wert1: string;
  wert2: string;
  wert3: string;
  wert4: string;

procedure TForm1.Button1Click(Sender: TObject);
var
  i2, i3, i4: integer;
begin
  SetLength(schachtel2inhalt, 4);
  for i2 := 0 to 3 do
    begin
      SetLength(schachtel2inhalt[i2].schachtel3, 4);
      for i3 := 0 to 3 do
        begin
          SetLength(schachtel2inhalt[i2].schachtel3[i3].schachtel4, 4);
        end;
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  case SpinEdit4.Value of
    1:
      begin
        case ComboBoxEx1.ItemIndex of
          0: wert1 := Edit1.Text;
          1: wert2 := Edit1.Text;
          2: wert3 := Edit1.Text;
          3: wert4 := Edit1.Text;
        end;
      end;
    2:
      begin
        case ComboBoxEx1.ItemIndex of
          0: schachtel2inhalt[SpinEdit5.Value].wert1 := Edit1.Text;
          1: schachtel2inhalt[SpinEdit5.Value].wert2 := Edit1.Text;
          2: schachtel2inhalt[SpinEdit5.Value].wert3 := Edit1.Text;
          3: schachtel2inhalt[SpinEdit5.Value].wert4 := Edit1.Text;
        end;
      end;
    3:
      begin
        case ComboBoxEx1.ItemIndex of
          0: schachtel2inhalt[SpinEdit5.Value].schachtel3[SpinEdit6.Value].wert1 := Edit1.Text;
          1: schachtel2inhalt[SpinEdit5.Value].schachtel3[SpinEdit6.Value].wert2 := Edit1.Text;
          2: schachtel2inhalt[SpinEdit5.Value].schachtel3[SpinEdit6.Value].wert3 := Edit1.Text;
          3: schachtel2inhalt[SpinEdit5.Value].schachtel3[SpinEdit6.Value].wert4 := Edit1.Text;
        end;
      end;
    4:
      begin
        case ComboBoxEx1.ItemIndex of
          0: schachtel2inhalt[SpinEdit5.Value].schachtel3[SpinEdit6.Value].schachtel4[SpinEdit7.Value].wert1 := Edit1.Text;
          1: schachtel2inhalt[SpinEdit5.Value].schachtel3[SpinEdit6.Value].schachtel4[SpinEdit7.Value].wert2 := Edit1.Text;
          2: schachtel2inhalt[SpinEdit5.Value].schachtel3[SpinEdit6.Value].schachtel4[SpinEdit7.Value].wert3 := Edit1.Text;
          3: schachtel2inhalt[SpinEdit5.Value].schachtel3[SpinEdit6.Value].schachtel4[SpinEdit7.Value].wert4 := Edit1.Text;
        end;
      end;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  case SpinEdit8.Value of
    1:
      begin
        case ComboBoxEx2.ItemIndex of
          0: Edit2.Text := Wert1;
          1: Edit2.Text := Wert2;
          2: Edit2.Text := Wert3;
          3: Edit2.Text := Wert4;
        end;
      end;
    2:
      begin
        case ComboBoxEx2.ItemIndex of
          0: Edit2.Text := schachtel2inhalt[SpinEdit9.Value].wert1;
          1: Edit2.Text := schachtel2inhalt[SpinEdit9.Value].wert2;
          2: Edit2.Text := schachtel2inhalt[SpinEdit9.Value].wert3;
          3: Edit2.Text := schachtel2inhalt[SpinEdit9.Value].wert4;
        end;
      end;
    3:
      begin
        case ComboBoxEx2.ItemIndex of
          0: Edit2.Text := schachtel2inhalt[SpinEdit9.Value].schachtel3[SpinEdit10.Value].wert1;
          1: Edit2.Text := schachtel2inhalt[SpinEdit9.Value].schachtel3[SpinEdit10.Value].wert2;
          2: Edit2.Text := schachtel2inhalt[SpinEdit9.Value].schachtel3[SpinEdit10.Value].wert3;
          3: Edit2.Text := schachtel2inhalt[SpinEdit9.Value].schachtel3[SpinEdit10.Value].wert4;
        end;
      end;
    4:
      begin
        case ComboBoxEx2.ItemIndex of
          0: Edit2.Text := schachtel2inhalt[SpinEdit9.Value].schachtel3[SpinEdit10.Value].schachtel4[SpinEdit11.Value].wert1;
          1: Edit2.Text := schachtel2inhalt[SpinEdit9.Value].schachtel3[SpinEdit10.Value].schachtel4[SpinEdit11.Value].wert2;
          2: Edit2.Text := schachtel2inhalt[SpinEdit9.Value].schachtel3[SpinEdit10.Value].schachtel4[SpinEdit11.Value].wert3;
          3: Edit2.Text := schachtel2inhalt[SpinEdit9.Value].schachtel3[SpinEdit10.Value].schachtel4[SpinEdit11.Value].wert4;
        end;
      end;
  end;
end;

procedure TForm1.Button4Click(Sender: TObject);
Var
  Stream : TStream;
  i, i2, i3:integer;
begin
    Stream:=TFilestream.create('C:\write.ogdb',fmcreate);
    try  
      with Twriter.create(Stream,1024) do  
        try
          writestring(wert1);
          writestring(wert2);
          writestring(wert3);
          writestring(wert4);
          //inneres array, erst länge dann daten schreiben
          writeinteger(length(schachtel2inhalt));
          for i:=0 to length(schachtel2inhalt)-1 do
            begin
              writestring(schachtel2inhalt[i].wert1);
              writestring(schachtel2inhalt[i].wert2);
              writestring(schachtel2inhalt[i].wert3);
              writestring(schachtel2inhalt[i].wert4);
              writeinteger(length(schachtel2inhalt[i].schachtel3));
              for i2:=0 to length(schachtel2inhalt[i].schachtel3)-1 do
                begin
                  writestring(schachtel2inhalt[i].schachtel3[i2].wert1);
                  writestring(schachtel2inhalt[i].schachtel3[i2].wert2);
                  writestring(schachtel2inhalt[i].schachtel3[i2].wert3);
                  writestring(schachtel2inhalt[i].schachtel3[i2].wert4);
                  writeinteger(length(schachtel2inhalt[i].schachtel3[i2].schachtel4));
                  for i3:=0 to length(schachtel2inhalt[i].schachtel3[i2].schachtel4)-1 do
                    begin
                      writestring(schachtel2inhalt[i].schachtel3[i2].schachtel4[i3].wert1);
                      writestring(schachtel2inhalt[i].schachtel3[i2].schachtel4[i3].wert2);
                      writestring(schachtel2inhalt[i].schachtel3[i2].schachtel4[i3].wert3);
                      writestring(schachtel2inhalt[i].schachtel3[i2].schachtel4[i3].wert4);
                    end;
                end;
            end;
        finally  
          free;
        end;
    finally
      Stream.free;  
    end;
end;

procedure TForm1.Button5Click(Sender: TObject);
var
  Stream : TStream;
  i, i2, i3, len, len2, len3: integer;

begin
    Stream:=TFilestream.create('C:\write.ogdb',fmopenRead);
    try
      with TReader.create(Stream,1024) do
        try
          wert1:=ReadString;
          wert2:=ReadString;
          wert3:=ReadString;
          wert4:=ReadString;
          //inneres array, erst länge dann daten lesen  
          len := ReadInteger;
          SetLength(schachtel2inhalt,len);
          for i:=0 to len-1 do
            begin
              schachtel2inhalt[i].wert1 := ReadString;
              schachtel2inhalt[i].wert2 := ReadString;
              schachtel2inhalt[i].wert3 := ReadString;
              schachtel2inhalt[i].wert4 := ReadString;
              len2 := ReadInteger;
              SetLength(schachtel2inhalt[i].schachtel3,len2);
              for i2:=0 to len2-1 do
                begin
                  schachtel2inhalt[i].schachtel3[i2].wert1 := ReadString;
                  schachtel2inhalt[i].schachtel3[i2].wert2 := ReadString;
                  schachtel2inhalt[i].schachtel3[i2].wert3 := ReadString;
                  schachtel2inhalt[i].schachtel3[i2].wert4 := ReadString;
                  len3 := ReadInteger;
                  SetLength(schachtel2inhalt[i].schachtel3[i2].schachtel4,len3);
                  for i3:=0 to len3-1 do
                    begin
                      schachtel2inhalt[i].schachtel3[i2].schachtel4[i3].wert1 := ReadString;
                      schachtel2inhalt[i].schachtel3[i2].schachtel4[i3].wert2 := ReadString;
                      schachtel2inhalt[i].schachtel3[i2].schachtel4[i3].wert3 := ReadString;
                      schachtel2inhalt[i].schachtel3[i2].schachtel4[i3].wert4 := ReadString;
                    end;
                end;
            end;
        finally  
          free;  
        end;   
    finally  
      Stream.free;  
    end;  
end;


end.