Autor Beitrag
MarcRB1975
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131

XP, Windows7
Delphi 2005 PE, Turbo, RAD Delphi 2009, XE, XE2
BeitragVerfasst: Sa 18.06.05 14:35 
Hallo.. da bin ich schon wieder,

leider hab ich noch ein Problem mit StringGrid...
ich habe 2 StringGrid´s. Das Erste übernimmt Variablen aus einer Unit.
Das Zweite übernimmt nur einen Teil aus dem ersten StringGrid.
Soweit klappt ja auch alles.
Aber ich kann nur die Daten des 1. StringGrid speichern. Das 2. speichert er mir zwar auch, zumindet sehe ich den dat.Name aber ich kann nicht gesondert sagen, dass er entweder die Daten des 1. oder des 2. StringGrid laden soll.
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:
....
   procedure oeffnen1Click(Sender: TObject);
   ///////// erstes StringGrid /////: 
   procedure saveGrdToFile(grd: TStringGrid);          
   procedure loadGrdFromFile(grd: TStringGrid);
      
   ///////// zweites StringGrid /////:
   procedure saveGrdToFile2(grd: TStringGrid);
   procedure loadGrdFromFile2(grd: TStringGrid);  
 
/// FRAGE: darf grd beim 1. und 2. Grid 2 mal "gleich" vorkommen oder müssen ///:
/// diese  unterschiedlich sein, ebenso bei fStream und buff??? ///:

.....
const  Name = 'Test.Dat';
const  Name1= 'Test geändert.dat';
var fStream : TFileStream;
buff: string;

......

///////////////// String Grid1  speichern und Laden ////:
procedure TMandant_Neu.saveGrdToFile;
var i, j, row, col, len : word;
begin
fStream := TFileStream.Create(Name, fmCreate);
fStream.Free;
fStream := TFileStream.Create(Name, fmOpenWrite);
col := grd.ColCount -1; row := grd.RowCount -1;
fStream.WriteBuffer(row, SizeOf(Word));
fStream.WriteBuffer(col, SizeOf(Word));

for i := 1 to row do
for j := 1 to col do
begin
buff := grd.Cells[j,i];
len := length(buff);
fstream.WriteBuffer(len, SizeOf(Word));
fStream.WriteBuffer(buff[1], len)
end;
fStream.free;
end;

procedure TMandant_Neu.loadGrdFromFile;
var i, j, row, col, len : Word;
begin
fStream := TFileStream.Create(Name, fmOpenRead);
fStream.ReadBuffer(row, SizeOf(Word));
fStream.ReadBuffer(col, SizeOf(Word));
for i:= 1 to row do
for j:= 1 to col do
begin
fStream.ReadBuffer(len, SizeOf(Word));
SetLength(Buff, len);
fStream.ReadBuffer(Buff[1], len);
grd.Cells[j, i] := buff
end;
fStream.free;
end;

///////////////// String Grid2  speichern und Laden ////:
procedure TMandant_Neu.saveGrdToFile2;
var i, j, row, col, len : word;
begin
fStream := TFileStream.Create(Name1, fmCreate);
fStream.Free;
fStream := TFileStream.Create(Name1, fmOpenWrite);
col := grd.ColCount -1; row := grd.RowCount -1;
fStream.WriteBuffer(row, SizeOf(Word));
fStream.WriteBuffer(col, SizeOf(Word));
for i := 1 to row do
for j := 1 to col do
begin
Buff := grd.Cells[j,i];
len := length(Buff);
fStream.WriteBuffer(len, SizeOf(Word));
fStream.WriteBuffer(Buff[1], len)
end;
fStream.destroy;
end;

procedure TMandant_Neu.loadGrdFromFile2;
var i, j, row, col, len : Word;
begin
fStream := TFileStream.Create(Name1, fmOpenRead);
fStream.ReadBuffer(row, SizeOf(Word));
fStream.ReadBuffer(col, SizeOf(Word));
for i:= 1 to row do
for j:= 1 to col do
begin
fStream.ReadBuffer(len, SizeOf(Word));
SetLength(Buff, len);
fStream.ReadBuffer(Buff[1], len);
grd.Cells[j, i] := Buff
end;
fStream.destroy;
end;


An was könnte es liegen, dass ich bei einem Button-Click z.B. die erste oder zweite Datei in den unterschiedlichen Grids nicht anzeigen kann? Ich kann nur immer die Daten aus dem StringGrid1, die ich gespeichert habe laden und anzeigen lassen.
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: Sa 18.06.05 16:16 
Hallo

ich würde dir empfehlen, deinen code auch einzurücken, das erhöht sie Übersicht ungemein.
Zitat:

const Name = 'Test.Dat';
const Name1= 'Test geändert.dat';

zum 3 Millionsten mal, mit diesen relativen Pfadangaben wirst du über kurz oder lang vor ganz anderen Problemen stehen. wird irgendwo das verzeichnis gewechselt, werden deine Daten sonstwo gespeichert. Wenn du willst, das deine Daten immer im Verzeichnis der Anwendung gespeichert werden, hilft dir
ausblenden Delphi-Quelltext
1:
extractfilepath(application.exename)					

weiter.
Zitat:

procedure saveGrdToFile(grd: TStringGrid);

Es ist zwar möglich, im implemention Teil die Prozedur-Parameter wegzulassen, empfehlenswert ist es sicher nicht. Insbesonderen bei größeren codes kannst du nicht jedesmal in den Interface-teil scrollen, um die Paramterliste einzusehen. Der Code zum Speichern ist nicht von Dir, denn richtig verstanden hast du ihn nicht. Du brauchst nicht für jedes Grid eine eigene Lade und Speicherroutine, deswegen hast du ja den Grid-paramter, wo du das entsprechende Grid (Stringgrid1 oder stringgrid2) übergibst. Ändere die Prozeduren doch so ab, das du auch den Filenamen als Paramter mitübergibst. So hast du nur jeweils eine Lade und Speicherprozedur.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
...
saveGrdToFile(Stringgrid1,Dateiname);
und 
saveGrdToFile(Stringgrid2,Dateiname2);


Zitat:

fStream := TFileStream.Create(Name, fmCreate);
fStream.Free;
fStream := TFileStream.Create(Name, fmOpenWrite);

das ist unnötig, das geht auch in einem rutsch. und ein try-finalley wäre auch nicht ganz verkehrt.

Zitat:

var fStream : TFileStream;
buff: string;

diese beiden Variablen global definieren gibt wenig sinn. Sie werden doch nur innerhalb der Prozeduren erstellt, verwendet und wieder freigegeben. außerhalb der Prozeduren ist dich gar kein Zugriff möglich, da z.B. Filestream überhauot nicht existiert. Schreib das in die lade und Speicherprocs mit rein.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TMandant_Neu.saveGrdToFile;  
var i, j, row, col, len : word;  
    fStream : TFileStream;  
    buff: string;  
begin
...
end;


Mfg frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
MarcRB1975 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 131

XP, Windows7
Delphi 2005 PE, Turbo, RAD Delphi 2009, XE, XE2
BeitragVerfasst: Sa 18.06.05 17:57 
Danke für Deine Tipps. Naja.... ich bin halt so Hobby-Delphianer und beschäftige mich erst seit ein paar Monaten mit Delphi. Stück für Stück muss man sich rantasten. Hab zwar 3 Delphibücher, aber oft steht genau das, was man braucht oder was man gerne realisieren möchte, nicht darin.
Deshalb danke für Deine Hinweise!!!!

Aber leider stehe ich immer noch vor dem Problem, dass wenn ich 2 Grids habe, ich diese aus unserschiedlichen Dateeien nicht laden kann.
z.B.:
Im 1. Grid stehen die A-Daten, die ich ändern, speichern und laden kann.
Im 2. Grid stehen die B-Daten, die ich ebenfalls ändern, speichern und laden kann.

Und genau da liegt mein Problem:
Ich kann nur die A-Daten laden. Komisch ist, dass ich die A-Daten ins erste oder ins zweite Grid laden kann. Das geht. Aber wenn ich loadGrdFromFile(StringGrid2) eingebe, passiert nichts.

Wenn ich je StringGrid ein eigenes Form habe, gehts einwandfrei.

An was könnte das denn liegen.