Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Probleme mit StringGrid speichern (https://www.delphipraxis.net/104103-probleme-mit-stringgrid-speichern.html)

Borschti 27. Nov 2007 13:43


Probleme mit StringGrid speichern
 
Hallo ;)

ich habe mal wieder ein Problem mit dem Speichern eines StringGrids und zwar geht es zuerst um eine Prozedur die Marabu mal in einem Thread gepostet hat.

Hier mal der Link .

Und zwar werden mir bei 3 Stellen Fehlermeldungen angezeigt, die habe ich einfach mal kommentiert.

Die fehlermeldung lautet bei allen drei: [Fehler] UnStringGrid.pas(66): Es gibt keine überladene Version von 'IfThen', die man mit diesen Argumenten aufrufen kann.

Delphi-Quellcode:
type
  TSaveOption = (soSaveCols, soExcludeFixed);
  TSaveOptions = set of TSaveOption;

procedure SaveGrid(sg: TStringGrid; s: TStream; so: TSaveOptions = []);
var
  iLow, iHigh, i: Integer;
  ss: TStringStream;
  bSaveCols, bExcludeFixed: Boolean;
begin
  ss := TStringStream.Create('');
  with sg do
  begin
    bSaveCols := soSaveCols in so;
    bExcludeFixed := soExcludeFixed in so;
    if bSaveCols then
    begin
      iLow := IfThen(bExcludeFixed, FixedCols); //Fehlermeldung
      iHigh := Pred(ColCount); //Fehlermedung
    end else
    begin
      iLow := IfThen(bExcludeFixed, FixedRows); //Fehlermeldung
      iHigh := Pred(RowCount);
    end;
    for i := iLow to iHigh do
    begin
      ss.Size := 0;
      if bSaveCols
        then ss.WriteString(Cols[i].CommaText + sLineBreak)
        else ss.WriteString(Rows[i].CommaText + sLineBreak);
      ss.Position := 0;
      s.CopyFrom(ss, ss.Size);
    end;
  end;
  ss.Free;
end;
Wenn ich die Zeilen in denen die Fehlermeldungen vorkommen auskommentiere, startet das Programm ganz normal. Allerdings speichert es dann die FixedRows doch mit was ja eigentlich, durch eine Anweisung die später im Programm kommt sich aber darauf bezieht, verhindert werden soll.

Hier der angesprochene Code Ausschnitt:
Delphi-Quellcode:
procedure TForm1.Speichern1Click(Sender: TObject);
var
  s: TStream;
  fn: TFileName;
begin
  fn := ChangeFileExt(ParamStr(0), '.txt');
  s := TFileStream.Create(fn, fmCreate);

  savedialog1.execute;
   SaveGrid(StringGrid1, s);
  s.Free;
So das wär dann Problem Nr1 aber ich verzweifle zZ. trotzdem noch an einem anderen Teil und zwar handelt sich darum wie das StringGrid in der Datei abgespeichert wird, hier mal ein Beispiel um es zu verdeutlichen:

11
7
,KundenNr,Name,Vorname,Straße,PLZ,Ort
1,52323,Müller,Hans,"Kühle Bäume 12",13186,Jesberg
2,52266,Lang,Susanne,"Am Rödel 21",52131,Hundshausen
3,85902,Willhelm,Jörg,"Roter Berg 7",63671,Mengsberg
4,36347,Nebel,Maren,"Schulstraße 14",48920,Zimmersrode
5,49403,Bielig,Klaus,"Wiesenwogen 11",49783,Römersberg
6,52531,Kessler,Tobias,"Hauptstraße 40",39202,Jesberg
7,32360,Pitz,Fabian,"Am Brunnen 18",349492,Sachsenhausen
8,48292,Bos,Samuel,"Spiesergarten 6",93921,Münchhausen
9,49202,Usbek,Natalia,"Hauerweg 26",38392,Gilsa
10,49202,Geißel,Theresa,"Steinweg 15",39382,Bischhausen
,,,,,,


So, das Problem ist das er mir die Zeilen- und Spaltenanzahl meines StringGrids mit speichert was zu einem Problem wird wenn ich die Datei dann wieder öffnen möchte :/ , kann ich vielleicht bewirken das wenn das Programm das StringGrid speichert das die beiden Zahlen gleich wieder gelöscht werden, oder kann man das direkt im Keim ersticken? Wenn ja wie kann ich das anstellen?

Das zweite mehr oder weniger große Problem sind die "" um die Straßennamen und Hausnummern welche dann auch wieder in das StringGrid übertragen werden wenn ich die Datei öffne, es ist zwar jetzt nicht der Weltuntergang aber ohne siehts dann scho besser aus, hat jemand eine Idee? ;)


Schonmal danke für alle Antworten

mfg
Alex

DeddyH 27. Nov 2007 13:49

Re: Probleme mit StringGrid speichern
 
Was macht denn IfThen? Ich habe hier im Moment nur Delphi 5 zur Verfügung, da gibt es das noch nicht.

Borschti 27. Nov 2007 13:54

Re: Probleme mit StringGrid speichern
 
Das ist auch mein Problem ich hab mal nach gegoogelt aber wurde immer nur auf if-then-else verwiesen...daher könnte das Problem vielleicht auch bei meiner Version liegen was ich allerdings bezweifle da er, laut der Fehlermeldung, ja die Anweisung kennt :shock:

Apollonius 27. Nov 2007 13:56

Re: Probleme mit StringGrid speichern
 
Einfach mal in die Hilfe schauen:
Zitat:

IfThen Routine

Conditionally returns one of two specified values.

Unit
Math

Syntax


[Delphi] function IfThen(AValue: Boolean; const ATrue: Integer; const AFalse: Integer): Integer; overload;



[Delphi] function IfThen(AValue: Boolean; const ATrue: Int64; const AFalse: Int64): Int64; overload;



[Delphi] function IfThen(AValue: Boolean; const ATrue: Double; const AFalse: Double): Double; overload;


Description
IfThen checks the expression passed as AValue and returns ATrue if it evaluates to true, or AFalse if it evaluates to false. In Delphi, if the AFalse parameter is omitted, IfThen returns 0 or an empty string when AValue evaluates to False.
Du brauchst also zwingend drei Parameter.

DeddyH 27. Nov 2007 14:01

Re: Probleme mit StringGrid speichern
 
Müsste also IMO so lauten:
Delphi-Quellcode:
iLow := IfThen(bExcludeFixed, FixedCols, 0);

Borschti 27. Nov 2007 15:00

Re: Probleme mit StringGrid speichern
 
Hmm erstmal danke für eure Antworten, also ich habe nochmal in der Deutschen Hilfe nachgeschaut und bin zu den gleichen Ergebnis gekommen wie DeddyH aber funktionieren tut es trotzdem nicht...

Gibt es vielleicht auch eine andere Anweisung mit dem man den Zweck von IfThen erfüllen kann? Oder Marabu könnte sich zu der Anweisung äußern, ich glaube das würde am meisten bringen ;)

mfg
Alex

DeddyH 27. Nov 2007 15:06

Re: Probleme mit StringGrid speichern
 
Delphi-Quellcode:
If bExcludeFixed Then
  iLow := FixedCols
else
  iLow := 0;
Das sollte denselben Zweck erfüllen.

Borschti 27. Nov 2007 15:55

Re: Probleme mit StringGrid speichern
 
Ah ja, jetzt wird das auch klarer, danke erstmal ;)

Aber wie kann ich den Zeilen und Spalten Zähler in der abgespeicherten Datei weglassen bzw. direkt nach dem speichern wieder löschen? Ich stehe da gerade ziemlich aufm Schlauch :/

marabu 28. Nov 2007 08:45

Re: Probleme mit StringGrid speichern
 
Hallo Alex,

Zitat:

Zitat von Borschti
... Gibt es vielleicht auch eine andere Anweisung mit dem man den Zweck von IfThen erfüllen kann? ...

Der dritte Parameter von IfThen() ist optional, deshalb muss er bei D7 nicht angegeben werden.

Zeilen- und Spaltenzähler werden von meinem Code nicht ausgegeben. Wo kommen die denn her?

Freundliche Grüße

Borschti 28. Nov 2007 13:02

Re: Probleme mit StringGrid speichern
 
Hmm also mir würde da nur der SaveDialog einfallen, alles andere was mit dem Speichern in meinem Programm zu tun hat kommt von deiner Prozedur :gruebel:

Hier ist mal der code des SaveDialogs:

Delphi-Quellcode:
procedure TForm1.Speichern1Click(Sender: TObject);
var
  s: TStream;
  fn: TFileName;
begin
  fn := ChangeFileExt(ParamStr(0), '.txt');
  s := TFileStream.Create(fn, fmCreate);

  savedialog1.execute;
   SaveGrid(StringGrid1, s);
  s.Free;

end;
In wie fern kann das zusammenhängen? Ist vielleicht schonmal jemandem aufgefallen das der SaveDialog sowas automatisch macht? Und kennt jemanden einen Weg das zu unterbinden? Viel zu viele Fragen :roll:

marabu 29. Nov 2007 11:43

Re: Probleme mit StringGrid speichern
 
Hallo Alex,

die Zeilennummern sind ja Bestandteil deiner Beispieldaten, also werden sie auch mit ausgegeben. Wenn du das unterdrücken möchtest, dann vielleicht so:

Delphi-Quellcode:
procedure SaveGrid(sg: TStringGrid; s: TStream; so: TSaveOptions = []);
var
  iLow, iHigh, i, n: Integer;
  ss: TStringStream;
  bSaveCols, bExcludeFixed: Boolean;
  sl: TStrings;
begin
  ss := TStringStream.Create('');
  sl := TStringList.Create;
  with sg do
  begin
    bSaveCols := soSaveCols in so;
    bExcludeFixed := soExcludeFixed in so;
    if bSaveCols then
    begin
      iLow := IfThen(bExcludeFixed, FixedCols);
      iHigh := Pred(ColCount);
    end else
    begin
      iLow := IfThen(bExcludeFixed, FixedRows);
      iHigh := Pred(RowCount);
    end;
    for i := iLow to iHigh do
    begin
      ss.Size := 0;
      if bSaveCols then
      begin
        sl.Assign(Cols[i]);
        n := FixedRows;
      end else
      begin
        sl.Assign(Rows[i]);
        n := FixedCols;
      end;
      if bExcludeFixed then
        while n > 0 do
        begin
          sl.Delete(0);
          Dec(n);
        end;
      ss.WriteString(sl.CommaText + sLineBreak);
      ss.Position := 0;
      s.CopyFrom(ss, ss.Size);
    end;
  end;
  sl.Free;
  ss.Free;
end;
Getippt und nicht getestet.

Freundliche Grüße

Borschti 30. Nov 2007 14:12

Re: Probleme mit StringGrid speichern
 
Sorry das ich jetzt erst Antworte war nen bissl stressig hier ;)

Werd mir das mal genauer anschaun und ausprobieren, vielen Dank.


mfg
Alex

Borschti 15. Jan 2008 08:25

Re: Probleme mit StringGrid speichern
 
Hallo,

nach langer Zeit (Urlaub, andere Sachen zu tun etc.) hab ich mir gedacht ich schau mal wieder in mein Delphi Programm und da sind mir auch schon ein paar sachen aufgefallen die ich gleich verändern konnte und ein paar sachen wo ich zZ. nicht weiter weiß.

Also mir ist aufgefallen das die Prozedur von Marabu bei mir garnichts speichert, ich denke es liegt an der Art wie ich sie aufrufe aber einen Fehler konnte ich dort nicht finden.

Hier ist der Code:

Delphi-Quellcode:
procedure TForm1.Speichern1Click(Sender: TObject);
var
  s: TStream;
  fn: TFileName;
begin
  fn := ChangeFileExt(ParamStr(0), '.txt');
  s := TFileStream.Create(fn, fmCreate);

  savedialog1.Title := 'Speichern sie ihre Tabelle in einer Textdatei.';
  savedialog1.execute;
   SaveGrid(StringGrid1, s);
  s.Free;

end;
Wäre super wenn mir jemand helfen könnte.

mfg
Alex

DeddyH 15. Jan 2008 09:07

Re: Probleme mit StringGrid speichern
 
Delphi-Quellcode:
procedure TForm1.Speichern1Click(Sender: TObject);
var
  s: TStream;
//  fn: TFileName;
begin
//  fn := ChangeFileExt(ParamStr(0), '.txt');
//  s := TFileStream.Create(fn, fmCreate);

  savedialog1.Title := 'Speichern sie ihre Tabelle in einer Textdatei.';
  if savedialog1.execute then
    begin
      s := TFileStream.Create(savedialog1.Filename, fmCreate);
      try
        SaveGrid(StringGrid1, s);
      finally
        s.Free;
      end;
    end;
end;

s-off 15. Jan 2008 09:11

Re: Probleme mit StringGrid speichern
 
Hallo,
Zitat:

Zitat von Borschti
Also mir ist aufgefallen das die Prozedur von Marabu bei mir garnichts speichert, ich denke es liegt an der Art wie ich sie aufrufe aber einen Fehler konnte ich dort nicht finden.

Es genügt nicht, wenn man Codes von anderen unbedacht übernimmt - man sollte auch verstehen, was der Code bewirkt.

Zitat:

Zitat von Borschti
Delphi-Quellcode:
procedure TForm1.Speichern1Click(Sender: TObject);
var
  s: TStream;
  fn: TFileName;
begin
  fn := ChangeFileExt(ParamStr(0), '.txt');
  s := TFileStream.Create(fn, fmCreate);

  savedialog1.Title := 'Speichern sie ihre Tabelle in einer Textdatei.';
  savedialog1.execute;
   SaveGrid(StringGrid1, s);
  s.Free;

end;

Du erzeugst einen FileStream. Diesem weist Du eine Datei zu. Schau Dir mal an, wie der Dateiname lautet!

Edit: Rechtschreibfehler.
Edit2: Gar nicht gesehen, dass ich schon wieder zu langsam war :mrgreen:

Borschti 15. Jan 2008 14:12

Re: Probleme mit StringGrid speichern
 
Danke für eure Antworten.

Werde mir deinen Ratschlag zu Herzen nehmen @s-off ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 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