Delphi-PRAXiS
Seite 1 von 2  1 2      

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:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:13 Uhr.
Seite 1 von 2  1 2      

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