AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Spalten eines DBGrid in INI-Datei speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Spalten eines DBGrid in INI-Datei speichern

Ein Thema von waldforest · begonnen am 26. Jun 2005 · letzter Beitrag vom 24. Sep 2005
Antwort Antwort
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#1

Spalten eines DBGrid in INI-Datei speichern

  Alt 26. Jun 2005, 17:49
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]
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Spalten eines DBGrid in INI-Datei speichern

  Alt 27. Jun 2005, 07:33
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
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#3

Re: Spalten eines DBGrid in INI-Datei speichern

  Alt 27. Jun 2005, 15:36
Danke für die Empfehlung.
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.

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]
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Spalten eines DBGrid in INI-Datei speichern

  Alt 24. Sep 2005, 05:21
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Spalten eines DBGrid in INI-Datei speichern

  Alt 24. Sep 2005, 06:58
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
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Spalten eines DBGrid in INI-Datei speichern

  Alt 24. Sep 2005, 10:47
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Spalten eines DBGrid in INI-Datei speichern

  Alt 24. Sep 2005, 11:07
DIe Ereignisse OnCreate() und OnCloseQuery() deiner Form mit dem Grid sind sehr gut geeignet um die Spaltenreihenfolge im Grid herzustellen bzw. zu speichern.

marabu
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Spalten eines DBGrid in INI-Datei speichern

  Alt 24. Sep 2005, 11:19
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Spalten eines DBGrid in INI-Datei speichern

  Alt 24. Sep 2005, 11:33
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
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Spalten eines DBGrid in INI-Datei speichern

  Alt 24. Sep 2005, 11:35
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;
  Mit Zitat antworten Zitat
Antwort Antwort


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 22:51 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