| Autor |
Beitrag |
MarcRB1975
      
Beiträge: 131
XP, Windows7
Delphi 2005 PE, Turbo, RAD Delphi 2009, XE, XE2
|
Verfasst: 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.
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); procedure saveGrdToFile(grd: TStringGrid); procedure loadGrdFromFile(grd: TStringGrid); procedure saveGrdToFile2(grd: TStringGrid); procedure loadGrdFromFile2(grd: TStringGrid);
..... const Name = 'Test.Dat'; const Name1= 'Test geändert.dat'; var fStream : TFileStream; buff: string;
......
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;
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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
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.
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.
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 
      
Beiträge: 131
XP, Windows7
Delphi 2005 PE, Turbo, RAD Delphi 2009, XE, XE2
|
Verfasst: 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.
|
|
|