AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi StrinGrid in einer Datei speichern und auch wieder öffnen
Thema durchsuchen
Ansicht
Themen-Optionen

StrinGrid in einer Datei speichern und auch wieder öffnen

Ein Thema von dopeline · begonnen am 9. Mai 2003 · letzter Beitrag vom 11. Mai 2003
Antwort Antwort
Seite 1 von 2  1 2      
dopeline

Registriert seit: 7. Mär 2003
Ort: Berlin
304 Beiträge
 
Delphi 7 Enterprise
 
#1

StrinGrid in einer Datei speichern und auch wieder öffnen

  Alt 9. Mai 2003, 17:46
Hallo!

Ich hab eine Tabelle(StringGrid) und will diese in einer Datei speichern (mit SaveDialog). mit dem OpenDialog soll die Datei wieder geöffnet werden können und der inhalt wieder in die tabelle geschrieben werden sollen.
Wie stelle ich das an?

Grüße, dopeline
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2
  Alt 9. Mai 2003, 17:49
Die Dialoge dienen nur dazu dir einen Dateinamen zu liefern. Nicht mehr und nicht weniger. Um das Speichern mußt du sich schon selber kümmern.

kein in zwei verschachtelten for-Schleifen die Zeilen und Spalten durch und schreib sie in eine Stringliste.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#3
  Alt 9. Mai 2003, 17:58
Hallo,
hier sind ein paar function's mit denen Du das machen kannst.
Delphi-Quellcode:
function GetToken(aString:String; SepChar: Char;TokenNum: Integer):String;
var
   Token : String;
   StrLen : Integer;
   TNum : Integer;
   TEnd : Integer;
begin
 StrLen := Length(aString);
 TNum := 1;
 TEnd := StrLen;
 while ((TNum <= TokenNum) and (TEnd <> 0)) do
   begin
    TEnd := Pos(SepChar,aString);
    if TEnd <> 0 then
      begin
      Token := Copy(aString,1,Tend - 1);
      Delete(aString,1,TEnd);
      Inc(TNum);
      end // if TEnd <> 0 then
      else
        begin
        Token := aString;
        end; // else if TEnd <> 0 then
    end; // while ((TNum <= TokenNum) and (TEnd <> 0)) do
 If TNum >= TokenNum then
   begin
   Result := Token;
   end // If TNum >= TokenNum then
   else
     begin
     Result := '';
     end;// else If TNum >= TokenNum then
end;

function NumToken(aString:String; SepChar: Char):Integer;
var
   RChar : Char;
   StrLen : Integer;
   TNum : Integer;
   TEnd : Integer;
begin
  If SepChar = '#then
    RChar := '*'
    else
      RChar := '#';
  StrLen := Length(aString);
  TNum := 0;
  TEnd := StrLen;
  while TEnd <> 0 do
    begin
    Inc(TNum);
    TEnd := Pos(SepChar,aString);
    if TEnd <> 0 then
      begin
      aString[TEnd] := RChar;
      end;
    end;
 Result := TNum;
end;

procedure DeleteRow(yourStringGrid: TStringGrid; ARow: Integer);
var i: Integer;
begin
  with yourStringGrid do
  begin
    for i := ARow to RowCount-2 do
      Rows[i].Assign(Rows[i+1]);
    RowCount := RowCount - 1
  end;
end;

procedure DeleteEmptyGridRows(Grid : TStringGrid);
var
  aCol,
  aRow : Integer;
  CheckSum : Integer;
begin
  CheckSum:=Grid.ColCount;
  aRow:=0;
  CheckSum:=0;
  While aRow<=Grid.RowCount-1 do
    begin
    CheckSum:=0;
    For aCol:=0 to Grid.ColCount-1 do
      begin
      If Grid.Cells[aCol,aRow]<>'then
        Inc(CheckSum);
      end;
    If CheckSum=0 then
      DeleteRow(Grid,aRow)
      else
        Inc(aRow);
    end;
end;

function SaveGridToFile(Grid : TStringGrid; Filename : String; SepChar : Char; DelEmptyRows : Boolean) : Boolean;
var
  Tmp : TStringList;
  aCol,
  aRow : Integer;
  H : String;
  aGrid : TStringGrid;
begin
  Result:=True;
  Tmp:=TStringList.Create;
  aGrid:=TStringGrid.Create(Nil);
  Try
    Try
      aGrid.ColCount:=Grid.ColCount;
      aGrid.RowCount:=Grid.RowCount;
      For aRow:=0 to Grid.RowCount-1 do
        aGrid.Rows[aRow].Assign(Grid.Rows[aRow]);
      If DelEmptyRows then
        DeleteEmptyGridRows(aGrid);
      For aRow:=0 to aGrid.RowCount-1 do
        begin
        H:='';
        For aCol:=0 to aGrid.ColCount-1 do
          H:=H+Grid.Cells[aCol,aRow]+SepChar;
        Tmp.Add(H);
        end;
      Tmp.SaveToFile(Filename);
    Except
      Result:=False;
    end;
  Finally
    aGrid.Free;
    Tmp.Free;
  end;
end;

function LoadGridFromFile(Grid : TStringGrid; Filename : String; SepChar : Char) : Boolean;
var
  Tmp : TStringList;
  NewColCount : Integer;
  aCol,
  aRow : Integer;
begin
  Result:=True;
  Tmp:=TStringList.Create;
  Try
    Try
      Tmp.LoadFromFile(Filename);
      NewColCount:=NumToken(Tmp.Strings[0],SepChar)-1;
      Grid.ColCount:=NewColCount;
      Grid.RowCount:=Tmp.Count;
      For aRow:=0 to Tmp.Count-1 do
        begin
        For aCol:=1 to NewColCount do
          Grid.Cells[aCol-1,aRow]:=GetToken(Tmp[aRow],SepChar,aCol);
        end;
    Except
      Result:=False;
    end;
  Finally
    Tmp.Free;
  end;
end;
Die Funktionen auf die es ankommt sind:
function SaveGridToFile(Grid : TStringGrid; Filename : String; SepChar : Char; DelEmptyRows : Boolean) : Boolean;
function LoadGridFromFile(Grid : TStringGrid; Filename : String; SepChar : Char) : Boolean;

Die proceduren DeleteEmptyGridRows, DeleteRow, GetToken und NumToken sind nur Hilfsproceduren

Parameter für SaveGridToFile:
Grid : Das TStringGrid, dessn Inhalt gespeichert werden soll
Filename : Pfad und Dateiname
SepChar : Das Separierungzeichen für die einzelnen Strings einer Zeile z.B. ein ;
DelEmptyRows : Wenn True, dann werden alle Zeilen ohne Inhalt nicht gespeichert.

Parameter LoadGridFromFile:
Grid : Das TStringGrid, dessn Inhalt gespeichert werden soll
Filename : Pfad und Dateiname
SepChar : Das Separierungzeichen für die einzelnen Strings einer Zeile z.B. ein ;
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4
  Alt 9. Mai 2003, 20:08
Zitat von Jens Schumann:
Hallo,
hier sind ein paar function's mit denen Du das machen kannst.
Hallo

sorry, finde ich zu kompliziert.
insbeondere das Seperierungszeichen brauchst du nicht. Row und Col sind Tstrings und die bringen mit commatext schon sowas von haus aus mit.

hier ist eine andere Variante:
http://www.tipps.delphi-source.de/ob...010805-6.shtml

Mfg Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#5
  Alt 9. Mai 2003, 20:17
Hallo Keldorn,
Du hast recht im Vergleich mit
http://www.tipps.delphi-source.de/oberflaeche/tut20010805-6.shtml
ist es tatsächlich komplizierter.
Das mit dem SepChar hat natürlich seinen Grund. Damals, als meine Kunden noch Win 95 nutzen ist beim Zugriff von Delphi auf Excel der Rechner ständig abgeschmiert (Macke unter Win95 wenn man zu viele Interfacezeiger anfordert). Ich brauchte jedoch einen Export nach Excel. Da Excel von Haus aus den TapStop als SepChar eingestellt hat habe ich mir die o.g. Funktionen gebastelt. Damit brauchen die Anwender im Textdateiöffnungsassistenten (was für ein Wort) nur auf Fertigstellen klicken.
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6
  Alt 9. Mai 2003, 20:17
außerdem sind fehler drin

Delphi-Quellcode:
      If DelEmptyRows then
        DeleteEmptyGridRows(aGrid);
      For aRow:=0 to aGrid.RowCount-1 do
        begin
        H:='';
        For aCol:=0 to aGrid.ColCount-1 do
          H:=H+Grid.Cells[aCol,aRow]+SepChar;
        Tmp.Add(H);
        end;
      Tmp.SaveToFile(Filename);
du löschst mit deleteemptyrows die leeren Zeilen, ok
anschließen durchläufst du die Zellen deines Hilfsgrids aGrid bis zum ende
holst dir die Strings aber vom Originalem Grid (Grid)
Zitat:
H:=H+Grid.Cells[aCol,aRow]+SepChar;
wenn du Zeilen gelöscht hast, wird dann abver irgendie was nicht stimmen ...

Mfg Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#7
  Alt 9. Mai 2003, 20:21
Hallo Keldorn,
Du hast schon wieder recht.
Es muss natürlich
H:=H+aGrid.Cells[aCol,aRow]+SepChar; lauten.

Vielen Dank für den Hinweis.
Der Fehler hat sich bei mir noch nie bermkbar gemacht.
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8
  Alt 9. Mai 2003, 20:22
Zitat von Jens Schumann:
Hallo Keldorn,

Das mit dem SepChar hat natürlich seinen Grund. Damals, als meine Kunden noch Win 95 nutzen ist beim Zugriff von Delphi auf Excel der Rechner ständig abgeschmiert (Macke unter Win95 wenn man zu viele Interfacezeiger anfordert). Ich brauchte jedoch einen Export nach Excel.
hab jetzt nur D3, da gehts noch nicht aber bei aktuelleren Delphi´s gibt wenn ich mich richtig erinnere es bei Tstrings noch mit DelimetedText (oder so ähnlich) noch die Möglichkeit, einen eigenen Seperator festzulegen. Gugg mal dort nach

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#9
  Alt 9. Mai 2003, 20:26
Hallo Keldorn,
die Möglichkeit des eigenen SepChar gibt es ab D6.
Ich verwende aber immer noch D5 (wegen vielen Bugs in D6).
Da aber meine Kunden jetzt alle min Win2000 verwenden und dort die
Automationschnittstelle zu Excel einwandfrei funktioniert benötige
ich die Funktionen SaveGridToFile und LoadGridFromFile gar nicht mehr.
  Mit Zitat antworten Zitat
dopeline

Registriert seit: 7. Mär 2003
Ort: Berlin
304 Beiträge
 
Delphi 7 Enterprise
 
#10
  Alt 9. Mai 2003, 20:29
Also diese variante funktioniert einwandfrei und ist außerdem übersichtlich. vielen dank!

Gruß, dopeline
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz