Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ini-Sektor auslesen und addieren (https://www.delphipraxis.net/24709-ini-sektor-auslesen-und-addieren.html)

BimboBaggins 24. Jun 2004 23:16


ini-Sektor auslesen und addieren
 
Sers,
Hab schon wieder ein Problem für Euch. Diesmal dürfts aber nichts sein, was wirklich viel Aufwand bedarf (ich brauch nur mal wieder den universal-Befehl für die eierlegende Wollmilchsau, hoffen wir, dass es den diesmal gibt!).
Also Folgendes:
Erstmal ne kurze Info zu meinem Problemprogramm. Diverse Buttons mit Artikel-Beschriftungen, die beim Klicken den Bestand prüfen und runterzählen, sowie den Preis des Artikels zu den Gesamteinnahmen addieren und das ganze dann in 3 ini-files speichern. 1 temp-inifile, 1 für die Tagesabrechnung, 1 für die Monatsabrechnung. Dazu 2 Buttons für "neuer Tag" und "neuer Monats", die nur die Funktion haben den "Verkauft"-Zähler (in der temp-ini-file) wieder auf 0 zu setzen und alles in "Tagesabrechnung" (die 2. inifile) zu speichern, um die Datei 1:1 später zu drucken. Das Problem ist jetzt, dass ich einen Button für "Sonstiges" eingefügt hab, bei dem man in ein input-Fenster die Artikelbeschreibung und den Preis manuell eingeben kann. In der Theorie sah das auch ganz einfach aus: Ich speicher das ganze erst in die temp-ini-file und wenn ich "neuer Tag" drück, wird der Sektor "Sonstiges" ausgelesen, in die Tagesabrechnung geschrieben und in der Temp-ini-file gelöscht. Klingt erstmal nicht schwer, aber bin nun auf mehrere Probleme gestoßen:
Erst wollt ich einfach alles sofort in die Tagesabrechnung und Monatsabrechnung schreiben, nur ergibt sich dann das Problem: Wann soll ich den Sektor "Sonstiges" in "Tagesabrechnung" leeren.. hm.. das würd zu weit führen, das jetzt z erklären, auf jeden Fall geht das nicht, weil mein Programm nur indirekt einen "neuen Tag" erkennt.
Auf jeden Fall bin ich auf den Befehl readsector (oder section? egal) gestoßen und hab den ganzen Sektor jetzt in einen (mir bis dahin unbekannten Dateityp) TString geladen. Beim Kompilieren gabs auch keine Probleme, nur schmiert mir das Programm jetzt immer ab, sobald ich das Zeug ausles und das egal, ob etwas in dem Sektor steht oder nicht. Aber da ja eh der wichtigste Teil noch fehlt, wart ich mal ab, ob er das noch bringt, wenn ich den Einschreibe-Teil geschrieben hab. Und dazu komm ich jetzt (nach der kurzen Vorrede...). Und zwar weiß ich nicht, was ich mit meinem TString jetzt anfangen soll bzw wies in meinem TString jetzt aussieht und was da alles drinsteht. Ich hab auf einen Befehl a la "writesector" gehofft, bei dem man dann den Namen und den TString angibt, aber so was hab ich nicht gefunden. Heißt der Befehl nur anders, oder muss man da irgendwie den TString zerpflücken, um die Sektions 1:1 zu kopieren? Und jetzt wirds nochmal ne Nummer härter (sozusagen für die Schnellen, die mit Aufgabe 1 schon fertig sind und aufs Klingeln warten). Und zwar würd ich gern die ganzen Tagesabrechnungsstrings addieren lassen und in die Monatsabrechnung speichern. Nun bräucht ich also einen Befehl, bei dem irgendwie zurückgegeben wird, welche Posten es in der Sektion gibt und der bei "if vorhanden" das ganze addiert oder "else" neu anlegt. Ja, das wars jetzt, hätt nicht gedacht, dass man ein so kleines Problem derart umschreiben kann (und wahrscheinlich noch die Hälfte vergessen haben kann!).
Danke fürs Lesen schonmal, wers bis hierhin geschafft hat ;)


PS: Falls jemand zufällig eine Auflistung ALLER ini-file-Befehle mit kurzer Beschreibung hat, würd mir das auch viel helfen, denn ich find immer nur Tutorials mit den Standartbefehlen, die mir in 99% der Fälle schon reichen, aber bei solchen Fällen leider nicht helfen. Gibts auch bestimmt bei der Delphi-Hilfe irgendwo aber bei ini-files und commands als Stichwort, find ich nix.

Nightshade 25. Jun 2004 00:04

Re: ini-Sektor auslesen und addieren
 
Zitat:

Zitat von BimboBaggins
Auf jeden Fall bin ich auf den Befehl readsector (oder section? egal) gestoßen und hab den ganzen Sektor jetzt in einen (mir bis dahin unbekannten Dateityp) TString geladen. Beim Kompilieren gabs auch keine Probleme, nur schmiert mir das Programm jetzt immer ab, sobald ich das Zeug ausles und das egal, ob etwas in dem Sektor steht oder nicht.

Liegt wahrscheinlich daran, daß du den TStrings Typ nicht Created hast.

Delphi-Quellcode:
var
     liste : TStringlist;
begin
  liste := TStringlist.create;  //  <-- hier TStringlist "initialisieren"
  ini.ReadSectionValues('Artikel',liste);
  if liste.Values['Sonstiges'] = 'Kaffee' then begin
      // do something;
  end;
  liste.free;
end;

Net7 25. Jun 2004 00:05

Re: ini-Sektor auslesen und addieren
 
DeleteKey
EraseSection
ReadSection
ReadSections
ReadSectionValues
ReadString
TIniFile
UpdateFile
WriteString
DeleteKey
EraseSection
GetStrings
ReadSection
ReadSections
ReadSectionValues
ReadString
Rename
SetStrings
UpdateFile
WriteString
ReadBinaryStream
ReadBool
ReadDate
ReadDateTime
ReadFloat
ReadInteger
ReadTime
SectionExists
WriteBinaryStream
WriteBool
WriteDate
WriteDateTime
WriteFloat
WriteInteger
WriteTime

Hmmm das ist so ziemlich alles was ich gefunden habe.
Bei dem Befehl ReadSections (denke mal das du den meinst) kannst du aber nur den Namen aller Schlüssel innerhalb eines bestimmten Abschnitts der INI-Datei ermitteln und es einer Stringliste übergeben.

NicNacMan 25. Jun 2004 00:23

Re: ini-Sektor auslesen und addieren
 
hi,
is ja n netter kleiner roman geworden :-D

du kannst alle einträger einer section auslesen, und sie dann einzelnd in eine neue schreiben:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  srcsection, dessection, eintrag, wert: String;
  tmplist: TStrings;
begin
  srcsection := 'bla1';
  dessection := 'bla2';
  myini := TINIFile.Create('C:\test.ini');
  tmplist := TStringList.Create;
  try
    myini.ReadSection(srcsection, tmplist);
    for i := 0 to Pred(tmplist.Count) do
      begin
        eintrag := tmplist.Strings[i];
        wert := myini.ReadString(srcsection, eintrag, '');
        myini.WriteString(dessection, eintrag, wert);
      end;
  finally
    tmplist.Free;
    myini.free;
  end;
end;
wenn die einträge schon vorhanden sind, werden sie einfach überschrieben

BimboBaggins 26. Jun 2004 18:00

Re: ini-Sektor auslesen und addieren
 
Wollt nur mal vorbeischauen und mich schonmal bedanken. Nicht, dass Ihr meint ich les das gar nicht. Hatte nur bisher keine Zeit das auszuprobieren, warum kann ich hier leider nicht aufführen, n bißchen Stoff brauch ich ja noch für meinen 2. Roman :)

@Nightshade: Dass man den initialisieren muss, wusste ich wirklich nicht, das wird wohl der Grund für meinen ersten Fehler sein, Danke!

@Net7: Danke für die Mühe, is mir unangenehm das sagen zu müssen, aber die Liste kommt auch wenn ich nur ini. eingeb, da kommt bei mir dann so ne Liste aller möglichen Befehle, is vielleicht erst ab einer bestimmten Delphi-Version so, hätt ich wohl dazusagen sollen, sry! :oops:
Aber die Beschreibung, die ich eigentlich gesucht hab war eh die für readsections, dachte halt nur für die Zukunft wär so ne Tutorial-Site, auf der alles beschrieben steht gut. Also Danke nochmal dafür, das bringt mich auch schonmal weiter, denn ich hab bisher gedacht der speichert auch die Werte dazu bzw speichert das als 'Bezeichner1=Wert1' oder so. Dann muss ich wohl noch irgendwie den TString zerpflücken, dann in der tempini-Datei nach dem Wert fragen und den dann in die neue Datei schreiben.

@NicNacman: Das sieht schonmal sehr vielversprechend aus, aber zum sicheren Verständniss frag ich doch nochmal nach:
Pred(tmplist.Count);
Weiß nicht genau wie sich das zusammensetzt, aber der Befehl gibt zusammen praktisch den Wert der letzten Zeile im TString an.
tmplist.Strings[i];
Das scheint ziemlich eindeutig zu sein, damit sprech ich wohl die Zeile i im Tstring an (Wusst ich aber auch vorher nicht wie ich das mach)

Also wenn ich auf den Button "neuer Tag" drück, werden praktisch alle "Namen der Schlüssel" ohne Wert in den TString gespeichert und dann wird in einer Schleife von 0 bis zur Zeilenanzahl des TStrings immer geprüft, ob bereits ein Wert für den Schlüssel i in "Tagesabrechnung.ini" gespeichert ist und gegebenfalls addiert mit dem Wert des Schlüssels der "Temp.ini" und in die Tagesabrechnung geschrieben... klingt eigentlich eigentlich ganz einfach und so als würds klappen. Danke!


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