Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Spalten eines DBGrid in INI-Datei speichern (https://www.delphipraxis.net/48518-spalten-eines-dbgrid-ini-datei-speichern.html)

waldforest 26. Jun 2005 17:49


Spalten eines DBGrid in INI-Datei speichern
 
Halo,

Habe einen Tipp mit dem
DBGrid1.Columns.SaveToFile('c:\sortierung.txt') gefunden, ist toll, und funktioniert

Ich möchte allerdings den Stream in eine INI-Section ablegen, hier verzweifel ich.
Habe auch keine Ahnung, wie ich einen TStringStream direkt in eine INI-Section bekomme.
Hat jemand einen Tipp ??

mfg waldforest



Delphi-Quellcode:
 
procedure TQueryForm.GridToIni(GridName: TDBGrid; Section: string);
var
MS: TMemoryStream;
Ini : TIniFile;
tTv: TStringStream;
node : string;
n: integer;
begin
tTv := TStringStream.Create('');
MS := TMemoryStream.Create;
Ini:=TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
try
GridName.Columns.SaveToStream(MS);
MS.Position := 0;
tTv.Read(MS,ms.Size) ;


INI.EraseSection(Section);
INI.WriteString(Section, '', tTv.DataString); // Hier läuft die Anwendung auf Fehler

finally
tTv.Free;
MS.Free;
end;
end;
[edit=Christian Seehase]Delphi-Tags korrigiert. Mfg, Christian Seehase[/edit]

marabu 27. Jun 2005 07:33

Re: Spalten eines DBGrid in INI-Datei speichern
 
Zitat:

Zitat von waldforest
Habe auch keine Ahnung, wie ich einen TStringStream direkt in eine INI-Section bekomme.

Direkt geht das auch nicht. Außerdem bekommst du Schwierigkeiten, wenn du solche Eigenschaften wie Font speichern willst. Die Ini-Datei bietet sich eigentlich nur für solche Eigenschaften der Columns an, die in deinem Programm vom Benutzer zur Laufzeit verändert werden können. Hier eine kleine Starthilfe:

Delphi-Quellcode:
uses
  TypInfo,
  IniFiles;

procedure SaveToIniFile(gc: TDBGridColumns; ini: TMemIniFile);
var
  i, j, iProps: integer;
  c: TColumn;
  ppl: PPropList;
  ppi: PPropInfo;
  colName: string;
begin
  for i := 1 to gc.Count do begin
    c := gc.Items[Pred(i)];
    colName := c.FieldName;
    ini.EraseSection(colName);
    iProps := GetPropList(c, ppl);
    for j := 0 to Pred(iProps) do begin
      ppi := ppl[j];
      case ppi.PropType^.Kind of
        tkString,
        tkLString:
          ini.WriteString(colName, ppi.Name, GetStrProp(c, ppi));
        tkInteger:
          ini.WriteString(colName, ppi.Name, IntToStr(GetInt64Prop(c, ppi)));
        tkEnumeration:
          ini.WriteString(colName, ppi.Name, GetEnumProp(c, ppi));
      end;
    end;
  end;
end;
Grüße vom marabu

waldforest 27. Jun 2005 15:36

Re: Spalten eines DBGrid in INI-Datei speichern
 
Danke für die Empfehlung. :-D
Habe es ausprobiert, und das Ergebnis war toll; Mein persönlicher Anspruch (lediglich die Reihenfolge lässt sich verändern) wurde sogar übertroffen.
Ich habe aber dadurch viele neues gelernt und auch mein Problem lösen können. :angel:

Hier nun die Gesamtlösung, welche auch funktioniert.
Manchmal reicht ein kleiner Tipp um Quantensprünge zu machen, Danke !!!

Forest

Delphi-Quellcode:
Procedure TQueryForm.GridIniWritePos(GridName: TDBGrid; Section: String) ;
var
  Ini : TIniFile;
  i : Integer;
  reihenfolge : String;
begin
  reihenfolge := '';
  for i := 0 to GridName.FieldCount-1 do
    reihenfolge := reihenfolge+GridName.Columns.Items[i].FieldName+';';           :thumb:
    Ini:=TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
  try
    Ini.WriteString(Section, 'Reihenfolge:', reihenfolge);
  finally
    Ini.Free;
  end;
end;

Procedure TQueryForm.GridIniReadPos(GridName: TDBGrid; Section: String) ;
var
  Ini : TIniFile;
  reihenfolge : String;
  i, posi    : integer;
begin
  reihenfolge := '';

  try
    Ini:=TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
    reihenfolge := Ini.ReadString(Section, 'Reihenfolge:', '');

    posi := Pos(';', reihenfolge);
    i := 0;
    while posi > 0 do
    begin
      GridName.Columns.Items[i].FieldName := Copy(reihenfolge, 1, posi-1);
      Delete(reihenfolge, 1, posi);
      posi := Pos(';', reihenfolge);
      Inc(i);
    end;
  finally
    Ini.Free;
  end;

end;
[edit=alcaeus]Delphi-Tags korrigiert. Mfg, alcaeus[/edit]

renekr 24. Sep 2005 05:21

Re: Spalten eines DBGrid in INI-Datei speichern
 
Hi,waldforest

Ich habe gerade das selbe Thema.

Habe deine Source getestet und das Speichern geht, aber ich kann es zwar auslesen,aber er ändert die Reihenfolge beim Grid nciht.
welche Ereignisse hast du verwendet??
Danke.

marabu 24. Sep 2005 06:58

Re: Spalten eines DBGrid in INI-Datei speichern
 
Hi René,

wenn es dir nur um die Reihenfolge der Spalten in einem DBGrid geht, dann reicht vielleicht schon das hier:

Delphi-Quellcode:
procedure LoadColumnOrder(gc: TDBGridColumns; sl: TStrings);
var
  i: integer;
begin
  for i := 0 to gc.Count - 1 do
    with gc.Items[i] do
    Index := sl.IndexOf(FieldName);
end;

procedure SaveColumnOrder(gc: TDBGridColumns; sl: TStrings);
var
  i: integer;
begin
  sl.Clear;
  for i := 0 to gc.Count - 1 do
    sl.Add(gc.Items[i].FieldName);
end;

// Verwendung:
// SaveColumnOrder(DBGrid.Columns, sl);
// LoadColumnOrder(DBGrid.Columns, sl);
Müsstest du aber noch testen.

Grüße vom marabu

renekr 24. Sep 2005 10:47

Re: Spalten eines DBGrid in INI-Datei speichern
 
Hi,
jo mir gehts nur um das Column Reihenfolge,
Ich bekomme da nur eine Zugriffsverletzung.
Ich habe das Ereignis ONColumnMoved genommen!

Wenn ich das PRog schließe und wida Starte hat er ja wida die Normalen Columns dann muß ich die Strings speichern.

Danke.

marabu 24. Sep 2005 11:07

Re: Spalten eines DBGrid in INI-Datei speichern
 
DIe Ereignisse OnCreate() und OnCloseQuery() deiner Form mit dem Grid sind sehr gut geeignet um die Spaltenreihenfolge im Grid herzustellen bzw. zu speichern.

marabu

renekr 24. Sep 2005 11:19

Re: Spalten eines DBGrid in INI-Datei speichern
 
Hi,
Danke.
Aber die Zugriffsverletzung kommt imma noch.
Habe das über Buttons gemacht und mit Memo ,da ging es.
Kann es sein das mit der TStings was nicht so stimmt.

Danke.
PS: Habe mit `TStrings noch wenig gemacht,


Danke.

marabu 24. Sep 2005 11:33

Re: Spalten eines DBGrid in INI-Datei speichern
 
sl wird außerhalb von den Load- und Save-Routinen instanziiert:

Delphi-Quellcode:
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  SaveColumnOrder(DBGrid.Columns, sl);
  ini.WriteString('Grid.Settings', 'ColumnOrder', sl.CommaText);
  sl.Free;
end;
Du hast doch nicht etwa versucht TStrings zu erzeugen?

marabu

renekr 24. Sep 2005 11:35

Re: Spalten eines DBGrid in INI-Datei speichern
 
Danke.
Werde ich a mal testen,
Ich habe es jetzt mit einer Ini gelöst.

Klappt 1 A hab es nur noch in ontitleclick auch noch einfügen müßen,weil ich da die Sortierung mache.


BSP:
procedure TForm1.Button43Click(Sender: TObject); //LOAD
var
i: integer;
begin
for i := 0 to dbgrid1.columns.Count - 1 do
with dbgrid1.columns.Items[i] do
Index := ini.readinteger('Reihenfolge_Arbeitsscheine',Field Name,i);
end;

procedure TForm1.Button44Click(Sender: TObject);//SAve
var
i: integer;
begin
for i := 0 to dbgrid1.columns.Count - 1 do
begin
ini.Writeinteger('Reihenfolge_Arbeitsscheine',dbgr id1.columns.Items[i].FieldName,i);
end;

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz