![]() |
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. |
Re: ini-Sektor auslesen und addieren
Zitat:
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; |
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. |
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:
wenn die einträge schon vorhanden sind, werden sie einfach überschrieben
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; |
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 15:55 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