Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Frage zum INI Handling


  • Please log in to reply
19 replies to this topic
fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012
Hallo!

Wenn ich in einer INI mehrere Sektionen habe, über ein Editfeld soll aber nur eine Sektion bearbeitet werden. Kann man sowas lösen?

Kann man nur eine Sektion komplett einlesen und diese in einem Editfeld ausgeben und nach änderung/hinzufügen/löschen in der eigentlichen INI aktualisieren?

In der Hilfe hab ich dazu direkt nichts gefunden.

MfG
fump

strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012
ini_sec lädt eine sektion in ein array und gibt es zurück, kommentare sind atm nicht unterstützt.
Ini_Sec(ini,sec)
{
seca:={}
iniread, sct, % ini, % sec
loop, parse, sct, `n, `r
{
regexmatch(a_loopfield,"^(.+?)=(.*)", item)
if (item1)
seca[item1]:=item2
}
return seca
}


das AusgabeArray kannste bearbeiten (array[key]:=value) und dann in die ini zurückschreiben).

for key,value in array
    iniwrite,% value,% ini,% section,% key

(mit ner tostring fct kannste auch die ganze section auf einmal zurückschreiben.
Regards,
Babba

hoppfrosch
  • Members
  • 399 posts
  • Last active: Feb 26 2016 05:31 AM
  • Joined: 25 Jan 2006
Das sieht mir nach einen "Mischmasch"-Handling aus: INI-Files sind strukturierte Dateien auf der Daten über die Hierarchie Sektion -> Key zugegriffen werden kann.

Wenn ich dich richtige verstehe, willst Du den textuellen Sektionen über INI-Funktionalität (sowas wie GetSectionContent() (<-- diese Funktion gibt es nicht)) lesen und dann den textuellen Inhalt (der dann sowas wie Key1=Value1 beinhaltet) in einer Editbox editieren und dann wieder in mit INI-Funktionalität zurückschreiben (sowas wie PutSectionContent()).

Du nutzt die Möglichkeit des direkten Einlesens von Keys gar nicht ... sondern behandelst den gesamten Sektionsinhalt als eine einzige Wurst ...

Oder verstehe ich was falsch?


Eine sehr feature-reiche Datei zum Handling von INI-Dateien findest du z.B. hier: http://www.autohotke...tions-no-regex/.

strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012
@hoppfrosch: Falls du dich auf meinen post beziehst,
ini_sec lädt ne ganze section und füllt ein array mit key value pairs (in .ini: key=value wird zu array[key]:=value), somit ist die struktur erhalten. Da ich kein build in command für die ausgabe einer key-list einer section kenne, ist das für mich eine effiziente methode. Im skript wird dann ein Array wie auch immer bearbeitet (was einfach ist) und dann wirds einfach zurückgeschrieben.
Regards,
Babba

hoppfrosch
  • Members
  • 399 posts
  • Last active: Feb 26 2016 05:31 AM
  • Joined: 25 Jan 2006

@hoppfrosch: Falls du dich auf meinen post beziehst,


Nein - ich bezug mich auf die Ursprungspost von fump2000. Du warst mit deiner Antwort etwas schneller als ich ... ;-)

fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012
Hi babba,

müsste mir
UserINI:=E:\user.ini
User:=Ini_Sec(UserINI,"User")
msgbox %User%
Nicht eine Box mit den Usernamen anzeigen?
Bleibt aber leer Posted Image

wie genau funktioniert das zurückschreiben?

strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012
Nein. So könnte das was werden:
edit: getestet mit user.ini in a_scriptdir:
UserINI:="user.ini"
Sec:="User"

arr:=ArrayFromIniSec(userini,sec)
msgbox,% IniSecFromArray(arr)
;was ändern
arr["NeuerKey"]:="NeuerValue"
;zurückschreiben
iniwrite,% inisecfromarray(arr),% userini,% sec
run,% userini

IniSecFromArray(array)
{
txt:=""
for k,ak in array
txt.=k "=" ak "`n"
return rtrim(txt,"`n")
}

ArrayFromIniSec(ini,sec)
{
seca:={}
iniread, sct, % ini, % sec
loop, parse, sct, `n, `r
{
regexmatch(a_loopfield,"^(.+?)=(.*)", item)
if (item1)
seca[item1]:=item2
}
return seca
}
Drei Stufen:
1. ini einlesen in array mit array:=ini_sec(userini,sec)
2. array bearbeiten, da brauchst noch code für.
3. zurückschreiben:
iniwrite,% inisecfromarray(array),% userini,% sec

Regards,
Babba

fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012
Ich weiß nicht warum... ich habs so gemacht wie du geschrieben hast aber die msgbox ist und bleibt leer...

Hat aber nix mit dem Inhalt der INI zu tun oder?

Der schaut so aus:

[User]
karllang=Karlos Langenhaus
kristaal=Kristian Taalen
ulrihave=Ulrike Haven

usw.

strobo
  • Members
  • 359 posts
  • Last active: Mar 10 2015 08:13 PM
  • Joined: 19 Jun 2012
Bei mir lüppts. Ich habe meinen vorherigen post so erweitert, dass du es als skript testen kannst.
Regards,
Babba

fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012
Nun funktioniert es... Ich blödi hab bei Sec:= das User nicht in "" gesetzt :( *schäm*

Ich wollte das ganze in einem Editfeld ausgeben um es zu bearbeiten. Das geht aber wohl nicht oder? Ich muss das ganze irgendwie in eine GUI packen... Könntest du mir da helfen?

SAPlayer
  • Members
  • 403 posts
  • Last active: Apr 11 2014 04:45 PM
  • Joined: 06 Nov 2012
UserINI:="user.ini"
Sec:="User"

arr:=ArrayFromIniSec(userini,sec)
msgbox,% IniSecFromArray(arr)
;was ändern
arr["NeuerKey"]:="NeuerValue"
;zurückschreiben
iniwrite,% inisecfromarray(arr),% userini,% sec
for index, elem in arr
{
 Gui, Add, Edit, % "ReadOnly x5 y" A_Index * 25 " w80 h20", % index
 Gui, Add, Edit, % "ReadOnly x95 y" A_Index * 25 " w80 h20", % element
}
Gui, Show,, xxx

IniSecFromArray(array)
{
txt:=""
for k,ak in array
txt.=k "=" ak "`n"
return rtrim(txt,"`n")
}

ArrayFromIniSec(ini,sec)
{
seca:={}
iniread, sct, % ini, % sec
loop, parse, sct, `n, `r
{
regexmatch(a_loopfield,"^(.+?)=(.*)", item)
if (item1)
seca[item1]:=item2
}
return seca
}
So vielleicht?

fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012
Von der Gui her ist das schon okay, kann man ja noch anpassen. Allerdings sind nur die linken Felder gefüllt die rechten sind leer.
Bei mehr als 25 Usern wirds dann aber schwer das zu nutzen weil die Gui möglicherweise aus dem Sichtbereich rutscht. Könnte man die Gui teilen nach 25 Usern?

Edit:
Eigentlich müsste die GUI von vorn herein mehr felder bieten, es geht ja darum User zu bearbeiten ggf. zu entfernen oder neue hinzuzufügen.

SAPlayer
  • Members
  • 403 posts
  • Last active: Apr 11 2014 04:45 PM
  • Joined: 06 Nov 2012
Habe es mal verbessert (20 Einträge pro Tab):
#SingleInstance, force
UserINI:="user.ini"
Sec:="User"
arr:=ArrayFromIniSec(userini,sec)
for index, elem in arr
i++
if(i >= 20){
while((A_Index-1) * 20 <= i)
  Tabs .= "Seite " A_Index "|"
}
if(Tabs)
Gui, Add, Tab, r26 w185, %Tabs%
for index, elem in arr
{
t := Ceil(A_Index / 20)
if(Tabs)
  Gui, Tab, % t
Gui, Add, Edit, % "x15 y" (A_Index - ((t-1)*20)) * 25 + 5 " w80 h20", % index
Gui, Add, Edit, % "x105 y" (A_Index - ((t-1)*20)) * 25 + 5 " w80 h20", % elem
}
Gui, Show,, xxx
IniSecFromArray(array)
{
txt:=""
for k,ak in array
txt.=k "=" ak "`n"
return rtrim(txt,"`n")
}
ArrayFromIniSec(ini,sec)
{
seca:={}
iniread, sct, % ini, % sec
loop, parse, sct, `n, `r
{
regexmatch(a_loopfield,"^(.+?)=(.*)", item)
if (item1)
seca[item1]:=item2
}
return seca
}


fump2000
  • Members
  • 591 posts
  • Last active: Nov 11 2015 07:52 AM
  • Joined: 01 Nov 2012
Jau das ist super Posted Image

Könntest du mir auch was einbauen um einem User zu löschen/hinzuzufügen und um das ganze zu speichern?

Vielen vielen Dank!!!

Edit:
Ich rufe diese Gui über einen Button auf. Wenn ich die Gui das erste mal öffne ist alles Top, habe zwei Tabs alles gut. SChließe ich sie per X (GuiClose Label mit Destroy ist vorhanden) und öffne sei erneut, verdoppeln sich jedes mal die Tabs. Warum?

SAPlayer
  • Members
  • 403 posts
  • Last active: Apr 11 2014 04:45 PM
  • Joined: 06 Nov 2012
Setz i und Tabs immer neu zurück, dann passiert das nicht Posted Image