Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Problem mit ini-Datei bei Wertzuweisungen (https://www.delphipraxis.net/114392-problem-mit-ini-datei-bei-wertzuweisungen.html)

Subsidenz 24. Mai 2008 15:11


Problem mit ini-Datei bei Wertzuweisungen
 
Hallo,

Ich habe mich mal näher mit einer Art Datenbank beschäftigt. Der Inhalt von meinem Programm wäre ein StringGrid in der verschiedene Werte stehen. Diese möchte ich in einer ini abspeichern und auch wieder abfragen können. Mein Problem hierbei ist das grundsätzliche Problem bei einer Wertzuweisung. Ich habe es schon geschafft, dass wenn ich auf den Button Speichern klicke, fügt er ein Element der Stringgrid in die ini, jedoch möchte ich eine Art Schleife (for to oder repeat oder was sich am besten macht). Habt ihr eine Lösung parat?

Quellcode:
Code:
procedure TForm1.speiClick(Sender: TObject);
var a,h : integer;
begin
a:=1;
h:=grid.RowCount;
ini := TIniFile.Create(ExtractFilePath( ParamStr(0))+'data.ini')
for a:=1 to h do
begin
 ini.WriteString('Titel', 'a', grid.Cells[0,a])
end;
end;
Die Schleife funktioniert halt nicht. Er soll von der StringGrid (grid) in der 1. Spalte alle Elemente von 1 bis Anzahl der vorhanden Elemente (also RowCount) in die ini schreiben.

MFG Subsidenz

DeddyH 24. Mai 2008 15:44

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Du überschreibst in Deiner Schleife immer wieder denselben Ident in derselben Section.

Subsidenz 24. Mai 2008 15:48

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Zitat:

Zitat von DeddyH
Du überschreibst in Deiner Schleife immer wieder denselben Ident in derselben Section.

Wie wie sollte es dann richtig heißen? Ich mein der macht doch theorethisch in die erste Zeile den Wert also in a (das ja 1 ist) und dann geht der weiter oder? Der soll das ja bis h machen.

DeddyH 24. Mai 2008 15:49

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Ich weiß nicht, ob ich Dich richtig verstanden habe, aber versuch es mal so:
Delphi-Quellcode:
ini.WriteString('Titel', IntToStr(a), grid.Cells[0,a])

Subsidenz 24. Mai 2008 15:52

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Zitat:

Zitat von DeddyH
Ich weiß nicht, ob ich Dich richtig verstanden habe, aber versuch es mal so:
Delphi-Quellcode:
ini.WriteString('Titel', IntToStr(a), grid.Cells[0,a])


Woaw tatsächlich das funktioniert^^ Danke DeddyH

DP-Maintenance 24. Mai 2008 16:10

DP-Maintenance
 
Dieses Thema wurde von "Christian Seehase" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Kein allgemeines Problem

Muetze1 24. Mai 2008 16:17

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Sollte die Schleife nicht eher von 0 bis h-1 gehen - oder wenn du eine Überschrift hast, dann halt von 1 bis h-1?

DeddyH 24. Mai 2008 16:18

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Stimmt eigentlich, da hatte ich gar nicht hingesehen. Ich würde einfach von FixedRows bis RowCount - 1 gehen, das sollte immer passen.

Subsidenz 24. Mai 2008 18:22

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Da ich eine Überschrift in der Tabelle habe geht das schon alles seinen Gang :wink:

Mir ist da noch was eingefallen:
Wie kann ich nun die Anzahl an Werten in einer ini mir ausgeben lassen? Ich möchte also wissen, wieviel Werte unter einer Sektion in der ini stehen.

MFG Subsidenz

DeddyH 24. Mai 2008 18:28

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Versuch es mal mit TIniFile.ReadSectionValues. Die Anzahl der Einträge in der Stringliste entspricht dann der Anzahl der Werte.

Helmi 24. Mai 2008 18:31

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Hallo,

du hast zwei Möglichkeiten:

1. Möglichkeit:

Du liest dir mit ReadSectionValues alle Einträge der Section in eine StringList
ein und schaust dir dann StringList.Count an

oder...

2. Möglichkeit:

Du speicherst dir zuerst in die Ini-Datei wieviele Einträge es sind (sofern du es
zu diesem Zeitpunkt schon weisst).
Beim Auslesen brauchst dann nur den Eintrag der Anzahl auslesen und du weisst
wieviele drin sind.
(unsicher wenn sich was ändert)

Subsidenz 24. Mai 2008 18:33

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Zitat:

Zitat von DeddyH
Versuch es mal mit TIniFile.ReadSectionValues. Die Anzahl der Einträge in der Stringliste entspricht dann der Anzahl der Werte.

Delphi-Quellcode:
z:=TIniFile.ReadSectionValues('Titel');
so? Anmerkung: Titel ist einer meiner Überschriften in der Tabelle.

DeddyH 24. Mai 2008 18:35

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Etwas zu kurz, fürchte ich.
Delphi-Quellcode:
var sl: TStringlist;
    Anzahl: integer;
begin
  sl := TStringList.Create;
  Anzahl := 0;
  try
    Ini.ReadSectionValues('Titel',sl);
    Anzahl := sl.Count;
  finally
    sl.Free;
  end;
end;

Helmi 24. Mai 2008 18:36

Re: Problem mit ini-Datei bei Wertzuweisungen
 
eher so:

Delphi-Quellcode:
var
  sl: TStringList;
  z: Integer; //Anzahl

begin
  sl := TStringList.Create;

  try
    IniFile.ReadSectionValues('Titel', sl);

    z := sl.Count;
  finally
    FreeAndNil(sl);
  end;
end;

Subsidenz 24. Mai 2008 18:46

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Okay ich sollte mal lieber das Problem etwas ausführlicher erklären.
Also ich habs jetzt geschafft, dass er die Werte ordentlich in die ini abspeichert.
Wenn ich nun das Programm erneut starten will klick ich auf den "Laden"-Button und will meine StringGrid nach den Werten einrichten. Da hab ich mir überlegt, dass die Zeilenanzahl der Anzahl der Werte in der ini entsprechen muss (nur halt +1 wegen der tabelle).

Das Ganze hab ich dann so umgesetzt:

Delphi-Quellcode:
procedure TForm1.ladenClick(Sender: TObject);
var i : TListBox;
    z,a : integer;
    sl: TStringlist;
begin
 begin
  sl := TStringList.Create;
  try
    Ini.ReadSectionValues('Titel',sl);
    z := sl.Count;
  finally
    FreeAndNil(sl);
  end;
ini := TIniFile.Create(ExtractFilePath( ParamStr(0))+'data.ini');
a:=1;
grid.RowCount:=z+1;
 for a:=1 to z do
 begin
  grid.Cells[0,a]:=ini.ReadSection('Titel', IntToStr(a), '');
 end;
end;
Jetzt meckert er an folgender Stelle:
Delphi-Quellcode:
  grid.Cells[0,a]:=ini.ReadSection('Titel', IntToStr(a), '');
MFG Subsidenz

DeddyH 24. Mai 2008 18:48

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Ersetz mal ReadSection durch ReadString.

Subsidenz 24. Mai 2008 18:52

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Zitat:

Zitat von DeddyH
Ersetz mal ReadSection durch ReadString.

Jetzt führt er zwar das Programm endlich aus aber er zeigt ein Acces violation Error. :)

DeddyH 24. Mai 2008 18:54

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Du erzeugst die Ini erst, nachdem Du versucht hast, daraus zu lesen?

Subsidenz 24. Mai 2008 18:55

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Zitat:

Zitat von DeddyH
Du erzeugst die Ini erst, nachdem Du versucht hast, daraus zu lesen?

Naja eigentlich existiert sieh ja schon.^^ Soll ich den Befehl rausnehmen?

DeddyH 24. Mai 2008 18:58

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Solange Du die IniFile erzeugt und nicht wieder freigegeben hast, musst Du sie nicht wieder neu erzeugen.

Subsidenz 24. Mai 2008 19:00

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Also nach dem rausnehmen sah es nicht gerade besser aus. Er zeigt immer noch den Access violation Fehler und geht in diese Zeile(die mit den Ausrufezeichen):

Delphi-Quellcode:
begin
  sl := TStringList.Create;
  try
    Ini.ReadSectionValues('Titel',sl); !!!!
    z := sl.Count;
  finally
    FreeAndNil(sl);
  end;

DeddyH 24. Mai 2008 19:05

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Wo hast Du denn das TIniFile.Create stehen? Ist die Ini eine globale Variable?

Subsidenz 24. Mai 2008 19:07

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Zitat:

Zitat von DeddyH
Wo hast Du denn das TIniFile.Create stehen? Ist die Ini eine globale Variable?

Delphi-Quellcode:
var
  ini : TiniFile;
Das hab ich bei den globalen Variablen stehen.

MFG Subsidenz

DeddyH 24. Mai 2008 19:08

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Und wo wird sie angelegt (TIniFile.Create)?

Subsidenz 24. Mai 2008 19:11

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Zitat:

Zitat von DeddyH
Und wo wird sie angelegt (TIniFile.Create)?

Die wird beim Speichern angelegt, bzw. verändert.

Delphi-Quellcode:
ini := TIniFile.Create(ExtractFilePath( ParamStr(0))+'data.ini');
Dieser Code ist mit in der Speicher-Prozedur. Sie wird also im gleichen Ordner angelegt bzw. gespeichert/überschrieben.

DeddyH 24. Mai 2008 19:15

Re: Problem mit ini-Datei bei Wertzuweisungen
 
So kommen wir irgendwie nicht weiter. Wenn es nicht gerade 400 Zeilen sind, poste mal die Unit.

Subsidenz 24. Mai 2008 19:20

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Delphi-Quellcode:
unit Seite1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, jpeg, ExtCtrls, Outline, ComCtrls, TabNotBk,
  Buttons, iniFiles;

type
  TForm1 = class(TForm)
    Hintergrund: TImage;
    ueberschrift: TLabel;
    eigenschaften: TGroupBox;
    ltitel: TLabel;
    tinterpret: TLabel;
    tgenre: TLabel;
    tgroesse: TLabel;
    tlaenge: TLabel;
    titel: TEdit;
    interpret: TEdit;
    genre: TEdit;
    groesse: TEdit;
    laenge: TEdit;
    grid: TStringGrid;
    operatoren: TGroupBox;
    ein: TButton;
    BitBtn1: TBitBtn;
    spei: TButton;
    loeschen: TButton;
    laden: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure einClick(Sender: TObject);
    procedure speiClick(Sender: TObject);
    procedure ladenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  ini : TiniFile;

implementation

uses Unit2, Seite2;

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
Form3.ShowModal;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
grid.Cells[0,0]:='Titel';
grid.Cells[1,0]:='Interpret';
grid.Cells[2,0]:='Genre';
grid.Cells[3,0]:='Größe in MB';
grid.Cells[4,0]:='Länge in min';
end;


procedure TForm1.einClick(Sender: TObject);
var h :integer;
begin
h:=grid.RowCount-1;
grid.Cells[0,h]:=titel.Text;
grid.Cells[1,h]:=interpret.Text;
grid.Cells[2,h]:=genre.Text;
grid.Cells[3,h]:=groesse.Text;
grid.Cells[4,h]:=laenge.Text;
grid.RowCount:=h+2;
titel.SetFocus;
end;

procedure TForm1.speiClick(Sender: TObject);
var a,h : integer;
begin
a:=1;
h:=grid.RowCount-2;
ini := TIniFile.Create(ExtractFilePath( ParamStr(0))+'data.ini');
ini.EraseSection('Titel');
for a:=1 to h do
begin
 ini.WriteString('Titel', IntToStr(a), grid.Cells[0,a])
end;
end;

procedure TForm1.ladenClick(Sender: TObject);
var i : TListBox;
    z,a : integer;
    sl: TStringlist;
begin
 begin
  sl := TStringList.Create;
  try
    Ini.ReadSectionValues('Titel',sl);
    z := sl.Count;
  finally
    FreeAndNil(sl);
  end;
a:=1;
grid.RowCount:=z+1;
 for a:=1 to z do
 begin
  grid.Cells[0,a]:=ini.ReadString('Titel', IntToStr(a), '');
 end;
end;
end;

end.
Anmerkung: Dies ist ein Programm für eine Musik-Datenbank. Man trägt jeweils in 5 Editfelder etwas ein und dann wird es in eine Tabelle geschrieben. Die Werte daraus kann man durch den Button "Speichern" in eine ini-Datei schreiben. Beim "Laden" sollen nun diese Werte wieder in die Tabelle eingefügt werden.

Soweit wollt ich das erstmal machen. Löschen der Zeilen bzw. Bearbeiten kommt noch hinzu. Das Laden steht halt gerade im Problem-Mittelpunkt :-D

MFG Subsidenz

DeddyH 24. Mai 2008 19:25

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Wenn ich das richtig sehe, müsstest Du immer erst speichern, damit die Ini zur Verfügung steht. Da Du eh globale Variablen benutzt, kannst Du das auch so machen (vor dem letzten end.):
Delphi-Quellcode:
initialization
  ini := TIniFile.Create(ExtractFilePath( ParamStr(0))+'data.ini');

finalization
  ini.Free;
Damit steht die Ini global zur Verfügung, Du musst sie nicht neu erzeugen. (Hoffentlich werde ich jetzt nicht öffentlich gesteinigt :duck: )

Subsidenz 24. Mai 2008 19:29

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Zitat:

Zitat von DeddyH
Wenn ich das richtig sehe, müsstest Du immer erst speichern, damit die Ini zur Verfügung steht. Da Du eh globale Variablen benutzt, kannst Du das auch so machen (vor dem letzten end.):
Delphi-Quellcode:
initialization
  ini := TIniFile.Create(ExtractFilePath( ParamStr(0))+'data.ini');

finalization
  ini.Free;
Damit steht die Ini global zur Verfügung, Du musst sie nicht neu erzeugen. (Hoffentlich werde ich jetzt nicht öffentlich gesteinigt :duck: )

Entschuldigung :oops:
Aber wo müssen die beiden Sachen denn eingefügt werden?

DeddyH 24. Mai 2008 19:34

Re: Problem mit ini-Datei bei Wertzuweisungen
 
Zitat:

vor dem letzten end.

Subsidenz 24. Mai 2008 19:41

Re: Problem mit ini-Datei bei Wertzuweisungen
 
DeddyH du bist mein Held! :thumb:

Jetzt funktionert alles zur vollsten Zufriedenheit :-D

Hast mir wirklich sehr geholfen, danke.

MFG Subsidenz


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