AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stringgrid in INI file schreiben

Ein Thema von rhodan · begonnen am 25. Apr 2014 · letzter Beitrag vom 26. Apr 2014
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von rhodan
rhodan

Registriert seit: 4. Okt 2005
Ort: Hamburg
150 Beiträge
 
Delphi 7 Personal
 
#1

Stringgrid in INI file schreiben

  Alt 25. Apr 2014, 00:58
Hallo allerseits!

ich benutze folgende herangehensweise um meine INI file einzulesen ins Stringgrid:

Delphi-Quellcode:
Procedure InitGridFromINI(StrGrid:TStringGrid; Const Section:String; GridINI:TIniFile);
Var X:Integer;
Begin
  With StrGrid Do
  Begin
    RowCount:=GridINI.ReadInteger(Section, 'RowCount', 0)+1;
    ColCount:=GridINI.ReadInteger(Section, 'ColCount', 0);
    For X:=1 To RowCount-1 Do
      Cells[0, X]:=GridINI.ReadString(Section, 'TitleY'+IntToStr(X), '');
    For X:=1 To ColCount Do
    Begin
      Cells[X-1, 0]:=GridINI.ReadString(Section, 'TitleX'+IntToStr(X), '');
      ColWidths[X-1]:=GridINI.ReadInteger(Section, 'ColW'+IntToStr(X), DefaultColWidth)
    End
  End
End;
allerdings stosse ich auf fehlermeldungen wenn ich auf dieselbe weise versuche aus dem Stringgrid in die INI file zu schreiben...
Cells[0, X]:=GridINI.WriteString(Section, 'TitleY'+IntToStr(X), ''); -> [DCC Fehler] source.pas(39): E2010 Inkompatible Typen: 'Integer' und 'string'

offensichtlich reicht es nicht ReadString in Writestring zu ändern...was mache ich falsch bzw. auf welche art schreibe ich die daten in die ini?
ich hab mal gegoogelt aber primär zum lesen aus ini files gefunden, nicht zum schreiben aus dem stringgrid..

wäre dankbar für nen tip!

LG aus Hamburg
Rhodan
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Stringgrid in INI file schreiben

  Alt 25. Apr 2014, 01:06
Tip: Ein Blick in die Dokumentation werfen Delphi-Referenz durchsuchenTIniFile.ReadString und Delphi-Referenz durchsuchenTIniFile.WriteString.
Was fällt dir auf?

Zum Schreiben einer Ini-Datei aus einem StringGrid wirst du auch nicht viel finden. Wenn es dazu Einträge geben würde, dann auch zu jeder anderen beliebigen Komponente, die aber alle das Gleiche aussagen würden:

Was interessiert sich die Ini-Datei dafür wo die Daten zum Schreiben herkommen?
Ein String ist und bleibt ein String, egal ob von einem Edit, StringGrid, ... oder wie auch immer Komponente.
(Mir ist auf jeden Fall noch kein spezieller StringGridString vor die Füße gefallen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (25. Apr 2014 um 01:13 Uhr)
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Stringgrid in INI file schreiben

  Alt 25. Apr 2014, 03:00
Das was du da versuchst ergibt keinen Sinn.

Cells[0, X]:=GridINI.WriteString(Section, 'TitleY'+IntToStr(X), '');
Du versuchst hier, Cells[0, X] den Rückgabewert von GridINI.WriteString zuzuweisen. Hä?

Wenn dann eher so: GridINI.WriteString(Section, 'TitleY'+IntToStr(X), Cells[0, X]); Du willst ja den Inhalt von Cells[0, X] in die Ini schreiben, daher muss der dritte Parameter für TIniFile.WriteString auch Cells[0, X] sein. Und TIniFile.WriteString ist eine Prozedur, also dh da gibts auch keinen Rückgabewert.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#4

AW: Stringgrid in INI file schreiben

  Alt 25. Apr 2014, 04:28
Solange das StringGrid nur paar Daten enthällt, also nicht zu groß ist, kann man das so lösen:
Delphi-Quellcode:
var
  x, y: Integer;
  IniFile: String;
  Ini: TIniFile;
begin
  IniFile := ChangeFileExt(ParamStr(0), '.ini');
  with StringGrid1 do
  begin
    //Speichern
    Ini := TIniFile.Create(IniFile);
    try
      for x := 0 to ColCount do
        Ini.WriteString('Sel', IntToStr(x), Cols[x].CommaText);
    finally
      Ini.Free;
    end;

    //Löschen
    for x := 0 to ColCount do
      for y := 0 to RowCount do
        Cells[x, y] := '';

    //Lesen
    Ini := TIniFile.Create(IniFile);
    try
      for x := 0 to ColCount do
        Cols[x].CommaText := Ini.ReadString('Sel', IntToStr(x), '');
    finally
      Ini.Free;
    end;
  end;
end;
Rows und Cols sind StringLists, somit kann man leicht CommaText als einzelnen String speichern. In dem Beispiel werden Cols gespeichert, man kann aber auch Rows speichern.

Das Problem ist, dass die Zeilenlänge nur knapp über 2000 Zeichen lang sein kann, danach wird sie umbrochen, womit es dann beim Einlesen wieder Probleme gibt. Wenn die Summe alle Zellen einer Spalte aber darunter bleibt, sollte das kein Problem bilden.

//EDIT:

Oder man macht es pro Zelle:
Delphi-Quellcode:
var
  x, y, k: Integer;
  IniFile, s, xs, ys: String;
  sl: TStringList;
  Ini: TIniFile;
begin
  IniFile := ChangeFileExt(ParamStr(0), '.ini');
  with StringGrid1 do
  begin
    Ini := TIniFile.Create(IniFile);
    try
      k := 0;
      for x := 0 to ColCount do
        for y := 0 to RowCount do
        begin
          Inc(k);
          Ini.WriteString('Sel2', IntToStr(k), Format('%d:%d:%s', [x, y, Cells[x, y]]));
        end;
    finally
      Ini.Free;
    end;

    for x := 0 to ColCount do
      for y := 0 to RowCount do
        Cells[x, y] := '';

    Ini := TIniFile.Create(IniFile);
    try
      sl := TStringList.Create;
      try
        Ini.ReadSection('Sel2', sl);

        for k := 0 to sl.Count - 1 do
        begin
          s := Ini.ReadString('Sel2', sl[k], '');
          xs := System.Copy(s, 1, Pos(':', s) - 1);
          System.Delete(s, 1, Pos(':', s));
          ys := System.Copy(s, 1, Pos(':', s) - 1);
          System.Delete(s, 1, Pos(':', s));
          Cells[StrToInt(xs), StrToInt(ys)] := s;
        end;
      finally
        sl.Free;
      end; {}
    finally
      Ini.Free;
    end;
  end;
end;

Geändert von Popov (25. Apr 2014 um 04:43 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: Stringgrid in INI file schreiben

  Alt 25. Apr 2014, 07:42
Oder:
TClientDataSet => TDataSource => TDBGrid
Die Daten stehen dann nicht im TStringGrid, sondern im TClientDataSet, wo sie vielleicht besser hingehören.
Laden/Speichern über das TClientDataSet, und zwar mit einem Aufruf. Ist zwar nicht eine INI-Datei, aber dafür sind die INI-Teile ja auch nicht gedacht.
  Mit Zitat antworten Zitat
Benutzerbild von rhodan
rhodan

Registriert seit: 4. Okt 2005
Ort: Hamburg
150 Beiträge
 
Delphi 7 Personal
 
#6

AW: Stringgrid in INI file schreiben

  Alt 25. Apr 2014, 23:16
hallo!

danke für die hilfe euch allen!
und danke dir popov für deine mühe! ich wette du hast das wie ich dich kenne bei nem Käffchen und nem keks so nebenbei aus dem ärmel geschüttelt ;D

2 fragen habe ich noch...lesen/schreiben funktioniert dank deiner hilfe einwandfrei...ich nutze diesen code nun um während der laufzeit neue columns hinzuzufügen:
Delphi-Quellcode:
var
 Column: Integer;
 NewColumn: Integer;
begin
  StrGrid.ColCount := StrGrid.ColCount + 1;
  for Column := StrGrid.ColCount - 1 downto NewColumn do
    StrGrid.Cols[Column].Assign(StrGrid.Cols[Column - 1]);
  StrGrid.Cols[NewColumn - 1].Text := '';
end;
das klappt auch super..nur wenn ich das programm neu starte und es sind z.bsp zu beginn nur 2 columns da, in der ini aber 7 gespeichert wird nicht alles eingelesen...ich kriege es nicht gebacken beim lesevorgang automatisch so viele columns zu erzeugen wie in der INI stehen so das alle infos eingelesen werden...

2. frage...wenn ich öfter abspeichere und einlese hab ich die erfahrung gemacht das sich "müll" bzw leere zeilen in der ini sammeln, wäre es nicht sinnvoll vor dem schreibvorgang die ini zu leeren/löschen damit sie auf dem aktuellen stand ist? steh da vor dem berg.

danke für eure anteilnahme..auch wenn ich mich freue wenn mir geholfen wird, ich versuche jedesmal daraus zu lernen...dankeschön
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Stringgrid in INI file schreiben

  Alt 25. Apr 2014, 23:25
Du kannst einfach die gesamte Section in der Ini vor dem Speichern entfernen. Dann gibt es die nicht mehr und ist also komplett leer.

Speicherst du denn nicht die Anzahl der Spalten und Zeilen in der Ini?
Auslesen, setzen und dann die Zellwerte eintragen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von rhodan
rhodan

Registriert seit: 4. Okt 2005
Ort: Hamburg
150 Beiträge
 
Delphi 7 Personal
 
#8

AW: Stringgrid in INI file schreiben

  Alt 25. Apr 2014, 23:35
danke sir rufo!
Delphi-Quellcode:
var
 Ini: TIniFile;
begin
 ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'myinifile.ini');
ini.EraseSection('sel');
 ini.Free;
end;
damit habe ich eine saubere inifile for dem speichern, aber ich kriegs nicht hin beim einlesen die anzahl der columns in der ini file in der runtime zu erzeugen :S
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Stringgrid in INI file schreiben

  Alt 25. Apr 2014, 23:38
Wenn du es einrichten könntest deinen aktuellen Code zum Speichern und Laden zu zeigen, dann könnte ich auch konkret antworten.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von rhodan
rhodan

Registriert seit: 4. Okt 2005
Ort: Hamburg
150 Beiträge
 
Delphi 7 Personal
 
#10

AW: Stringgrid in INI file schreiben

  Alt 25. Apr 2014, 23:53
popovs code funktioniert schon sauber.^^ hab ich quasi übernommen

lesen:
Delphi-Quellcode:
procedure TForm2.btnreadClick(Sender: TObject);
var
  x, y: Integer;
  IniFile: String;
  Ini: TIniFile;
begin
  IniFile := ChangeFileExt(ParamStr(0), '.ini');
  with strgrid do
  begin
      ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'myinifile.ini');
    try
      for x := 0 to ColCount do
      strgrid.
        Cols[x].CommaText := Ini.ReadString('Sel', IntToStr(x), '');
    finally
      Ini.Free;
    end;
  end;
end;
schreiben:
Delphi-Quellcode:
procedure TForm2.btnwriteClick(Sender: TObject);
var
  x, y: Integer;
  IniFile: String;
  Ini: TIniFile;
begin
ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'myinifile.ini');
ini.EraseSection('sel');
 ini.Free;
  with strgrid do
  begin
    ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'myinifile.ini');
    try
      for x := 0 to ColCount do
        Ini.WriteString('Sel', IntToStr(x), Cols[x].CommaText);
    finally
      Ini.Free;
    end;
 end;
end;
columns zur runtime erzeugen:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
 Column: Integer;
 NewColumn: Integer;
begin
  StrGrid.ColCount := StrGrid.ColCount + 1;
  for Column := StrGrid.ColCount - 1 downto NewColumn do
    StrGrid.Cols[Column].Assign(StrGrid.Cols[Column - 1]);
  StrGrid.Cols[NewColumn - 1].Text := '';
end;

wobei mir auffällt das in der ini immer EINE column mehr erzeugt wird bzw abgespeichert wird als tatsächlich existieren..also wenn ich 3 in der runtime habe und speichere wird in der ini eine vierte erzeugt "4=,," die leer ist

Geändert von rhodan (25. Apr 2014 um 23:57 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 12:34 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