Verwendung von Dateiinhalten

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Verwendung von Dateiinhalten

24 Feb 2015, 04:30

Hallo zusammen,

ich versuche gerade mit Dateiinhalten klar zu kommen. Per FileOpen wird eine txt Datei geöffnet die etwas derartiges enthält:

Code: Select all

SECTION: Monitors=1,MonitorPrimary=1; Desktop size:0,0,1366,768
Title="Calendar - Paul",x=150,y=0,width=1055,height=728
Title="Inbox - Paul",x=150,y=0,width=1055,height=728
Title="Mozilla Firefox",x=76,y=0,width=1283,height=728
Title="Microsoft Excel",x=120,y=0,width=1246,height=728
Title="Microsoft PowerPoint",x=65,y=0,width=1295,height=728
Title="Reminder",x=623,y=235,width=473,height=336

SECTION: Monitors=2,MonitorPrimary=2; Desktop size:-1920,0,3840,1080
Title="Calendar - Paul",x=-1921,y=0,width=871,height=1080
Title="Inbox - Paul",x=-1056,y=0,width=1055,height=1080
Title="Internet Explorer",x=-1477,y=20,width=1265,height=995
Title="Microsoft PowerPoint",x=291,y=41,width=1506,height=945
Title="Mozilla Firefox",x=180,y=72,width=1359,height=937
Title="Microsoft Excel",x=398,y=17,width=1424,height=996
Title="Reminder",x=623,y=235,width=473,height=336

SECTION: Monitors=1,MonitorPrimary=1; Desktop size:0,0,1920,1080
Title="Calendar - Paul",x=205,y=0,width=871,height=1040
Title="Inbox - Paul",x=127,y=0,width=1055,height=1040
Title="Windows Internet Explorer",x=289,y=46,width=1332,height=955
Title="Mozilla Firefox",x=227,y=17,width=1329,height=968
Title="Microsoft Excel",x=399,y=0,width=1424,height=1040
Title="Microsoft PowerPoint",x=662,y=0,width=1256,height=1040
Title="Reminder",x=623,y=235,width=473,height=336
Das Script selbst ist DockWin aus dem alten Forum.
http://www.autohotkey.com/board/topic/1 ... positions/

Es erstellt anhand der offnen Fenster eine solche Liste. Was es aber nicht kann ist erkennen das eine solche Liste schon existiert aber ein Update erfolgen soll.

Ich habe mir die Hilfe zum FileObjekt angeschaut aber ich kann nicht sagen wie ich damit in der Datei erkennen soll ob TextX schon vorkommt und das dieser in ZeileY steht.
Wenn ich hier einen Updateprozess einbauen will, dann muss ich doch den Datensatz der schon existiert erkennen und deklarieren können.

Dazu sehe ich aber keinen Weg.

Könntet Ihr mir hier bitte auf die Sprünge helfen?

Vielen Dank!

MfG
fump

// Edit:
Das einlesen der Datei und erkennen von Start und Ende habe ich nun so gelöst:

Code: Select all

Loop, Read, %FileName%
	{
		; Einlesen der Daten bis Abschnitt gefunden wurde
		if (A_LoopReadLine<>SectionToFind) {
			if (A_LoopReadLine="" && SectionDublicate=1) {
				PointEnd:=A_Index
				break
			} else {
				Continue
			}
		}
		else {
			SectionDublicate:= 1
			PointStart:=A_Index
		}
	}
msgbox Start: %PointStart% Ende: %PointEnd%
Nun weiß ich wo mein Bereich anfängt und wo er endet aber wie kann ich nun eine Zeile hinzufügen oder ggf. löschen bzw. ersetzen?
Last edited by fump2000 on 24 Feb 2015, 09:37, edited 1 time in total.
strobo
Posts: 125
Joined: 30 Sep 2013, 15:24

Re: Verwendung von Dateiinhalten

24 Feb 2015, 09:37

das fileobject hat keine fertige methode zum suchen oder zum einfügen (im Sinne von array.insert).
Wieso nicht einfach die Liste neu erstellen lassen (vllt vorher löschen)?
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Verwendung von Dateiinhalten

24 Feb 2015, 09:52

Weil die Liste mehrere konfigurationen für mehrere Monitorkonfigurationen beinhalten kann.

Wie würdest du denn eine bestimmte Zeile durch einen anderen Text ersetzen?

// Edit:
Andere Frage, mal angenommen ich stell das mit dem FileObjekt um. Lese die Datei komplett ein, kann sie dann genauso durchgehen um start und endpunkt zu erhalten. Wie kann ich eine solche Textzeile in einer Variable löschen oder ersetzen oder eine hinzufügen?
strobo
Posts: 125
Joined: 30 Sep 2013, 15:24

Re: Verwendung von Dateiinhalten

24 Feb 2015, 12:08

Weil die Liste mehrere konfigurationen für mehrere Monitorkonfigurationen beinhalten kann.
Das schliesst die möglichkeit des neuerstellens oder anhängens (ohne vorher löschen) nicht aus. Um die existenz der SECTIONs muss man sich beim Schreiben kümmern und um die eindeutigkeit der SECTIONs kann man sich beim Auslesen kümmern.
Andere Frage, mal angenommen ich stell das mit dem FileObjekt um. Lese die Datei komplett ein, kann sie dann genauso durchgehen um start und endpunkt zu erhalten. Wie kann ich eine solche Textzeile in einer Variable löschen oder ersetzen oder eine hinzufügen?
Ich glaub da gibts libraries, die dich da unterstützen können, TF (?), string-things irgendwie so hiessen die. Im Endeffekt gehts natürlich darum irgendein Zufalls-Textformat zu parsen, und ich sehe gerade, dass ein grossteils des skripts darauf verwendet wird, dieses Format zu de/enkodieren, vllt kannst du da was abgucken.
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Verwendung von Dateiinhalten

25 Feb 2015, 03:11

Moin fump,

ich bin nicht sicher, ob ich die Fragestellung richtig verstehe. Was willst Du machen?
- Feststellen, ob ein Block bereits vorhanden ist.
- - Ggf. den vorhandenen Block löschen und komplett neu schreiben.
- - Ggf. Teile des vorhandenen Blocks überschreiben.

In jedem Fall ist das Arbeit mit dem Inhalt von Variablen. Ob Du zum Lesen/Schreiben die alten Filekommandos oder das neue Fileobjekt benutzt, macht keinen nennenswerten Unterschied.
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Verwendung von Dateiinhalten

25 Feb 2015, 03:46

Moin!

Ja hast du richtig verstanden.
Ich komme mit dem verwenden bzw. Bearbeiten von Dateiinhalten nicht klar.
In dem Script wied die datei per FileObjekt genutzt. Ich habe es nun schon soweit, dass ich folgendes wissen haben:
1. Ich kann sehen ob eine SECTION schon existiert.
2. Ich kann erkennen ab welcher Zeile diese beginnt.
3. Ich erkenne in welcher Zeile sie endet.

Wie kann ich die Datei nun innerhalb dieser Werte um z. B. eine Zeile erweitern oder eine bestimmte Zeile ersetzen bzw. löschen?
Das ist es was ich nicht verstehe...

Kannst du es mir näher bringen?

// Edit:
Also ich bin mir ziemlich sicher, dass ich per Loopen erkennen kann ob ich innerhalb vom Start und Endpunkt den Fenstertitel X schon habe.
Das hilft mir aber nur bedingt denn ich hab keine Ahnung wie ich diese Zeile dann ersetzen kann durch die neuen Werte... Ich sehe keinen Befehl der Zeile X durch String Y ersetzen kann.
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Verwendung von Dateiinhalten

25 Feb 2015, 05:19

Hmmm, wie ich es sehe erzeugt das Skript per Win+Shift+0 für die aktuelle Monitorkonfiguration eine komplette Liste der derzeit offenen Fenster. Diese "Section" wird dann an die Datei angehängt, wenn sie existiert. Wenn dann die Fenster per Win+0 wiederhergestellt werden sollen, wird die Datei allerdings nur bis zur ersten passenden Monitorkonfiguration durchsucht und ggf. die dort gefundenen 'veralteten' Werte verwendet.

Nun nochmal die entscheidende Frage:
Willst Du eine vorhanden 'Section' mit den aktuellen Fensterwerten neu schreiben oder willst Du vorhandene und aktuelle Fensterwerte irgendwie vermischen?
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Verwendung von Dateiinhalten

25 Feb 2015, 06:00

Genau das mit den veralteten möchte ich abstellen bzw. ändern und zwar so, das nicht immer neu geschrieben wird sondern die vorhandene Konfig erweitert wird.

Es gibt Fenster wie Lync z. B. die verändern ihren Titel je nachdem mit wem man zuletzt kommuniziert hat. Sowas soll ergänzt werden. Sollte der Fenstertitel schon vorhanden sein werden jedoch nur die Werte dazu überschrieben bzw. diese Zeile wird ersetzt.

Ich will die SECTION nicht löschen und neu schreiben. Ich will sie ergänzen bzw. Editieren.
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Verwendung von Dateiinhalten

25 Feb 2015, 06:08

Schreib doch das DockWin um auf INI... dann kannst du mit den AHK-INI-Funktionen das Ganze viel besser verwalten?!
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Verwendung von Dateiinhalten

25 Feb 2015, 06:19

Auf INI umstellen will ich eigentlich gar nicht... Könnte man aber machen... Sofern es mit dem File ansich nicht geht.
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Verwendung von Dateiinhalten

25 Feb 2015, 06:25

Zumindest wäre die Verwaltung um ein vielfaches einfacher.
Und da DockWin nicht gerade groß ist, sollte die Umschreibung auf .ini nicht besonders schwer werden.
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
strobo
Posts: 125
Joined: 30 Sep 2013, 15:24

Re: Verwendung von Dateiinhalten

25 Feb 2015, 07:16

Wie kann ich die Datei nun innerhalb dieser Werte um z. B. eine Zeile erweitern oder eine bestimmte Zeile ersetzen bzw. löschen?
Das ist es was ich nicht verstehe...
Das fileobject hat keine methode zum einfügen/ersetzen/löschen, es überschreibt nur. Wenn du eine Zeile (nicht die letzte) mit z.b. längerem Title ersetzt, überschreibst du den Anfang der nächsten Zeile und die ganze Datei ist kaputt. Deswegen lieber ganz einlesen und als string bearbeiten.


Ini Datei wär schon eine Verbesserung, das Format ist aber dreidimensional (ini ist 2D) und man will bestimmt auch iwo an die x, y, width, ... Werte rankommen. Deswegen sollte man, wenn man schon dabei ist, gleich auf json(, xml, ...) oder
http://ahkscript.org/boards/viewtopic.p ... 14e#p30915
wechseln.
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Verwendung von Dateiinhalten

25 Feb 2015, 07:44

Nun ja, Du kannst die Datei doch mit jedem beliebigen Editor editieren.
Es gibt Fenster wie Lync z. B. die verändern ihren Titel je nachdem mit wem man zuletzt kommuniziert hat. Sowas soll ergänzt werden. Sollte der Fenstertitel schon vorhanden sein werden jedoch nur die Werte dazu überschrieben bzw. diese Zeile wird ersetzt.
Verstehe ich nicht! So riskierst Du doch, dass in der Datei Leichen von irgendwann einmal offenen Fenstern erhalten bleiben. Wozu soll das gut sein?
Ich will die SECTION nicht löschen und neu schreiben.
Du brauchst sie ja nicht zu schreiben. Das erledigt ja das Skript. Und für das Löschen kannst Du eine abgewandelte Version Deiner Suchroutine verwenden:
  • Variable Anhängen auf True setzen.
  • Datei per Loop, Read, ... einlesen, wenn die Variable Anhängen auf True steht, eingelesenen Zeilen um `r`n ergänzen und an eine Variable anhängen.
  • Wenn die eingelesene Zeile mit der gesuchten Section übereinstimmt, Variable Anhängen auf False setzen und nicht anhängen.
  • Wenn die Variable Anhängen auf False steht und eine leere Zeile gelesen wird, Variable Anhängen auf True setzen und nicht anhängen.
Als Ergebnis hat Du dann die Datei ohne die alte Section in einer Variablen. Wenn Du dann das Flag in FileOpen() auf w setzt, kannst Du erst einmal den alten Inhalt schreiben und dann die aktualisierte Section anhängen lassen.
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Verwendung von Dateiinhalten

25 Feb 2015, 07:58

strobo wrote:Ini Datei wär schon eine Verbesserung, das Format ist aber dreidimensional (ini ist 2D) und man will bestimmt auch iwo an die x, y, width, ... Werte rankommen. Deswegen sollte man, wenn man schon dabei ist, gleich auf json(, xml, ...) oder
http://ahkscript.org/boards/viewtopic.p ... 14e#p30915
wechseln.
Oder einfach für jeden Monitor eine .ini Datei und der 'Käs' ist gegessen ;)
Monitor_1.ini

Code: Select all

[Dock Win]
Monitor=1
Monitor_Primary=1

[Mozilla Firefox]
x=76
y=0
w=1283
h=728

[Microsoft Excel]
x=120
y=0
w=1246
h=728
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Verwendung von Dateiinhalten

25 Feb 2015, 08:54

Hach je... Ok dann bau ich mir was eigenes da rein.
Schade das die File geschichte nicht fertig gedacht ist...
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Verwendung von Dateiinhalten

25 Feb 2015, 08:56

Schade das die File geschichte nicht fertig gedacht ist...
Ist sie schon. Sie kann allerdings nicht wissen, was sich der geneigte Benutzer so denkt. ;)
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Verwendung von Dateiinhalten

25 Feb 2015, 09:19

Also eine Filefunktion die eine bestimmte Zeile die man ja angeben kann durch string xyz ersetzt hätte man doch einbauen können... oder meinste nicht?

file.replace(line,string)
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Verwendung von Dateiinhalten

25 Feb 2015, 09:22

Vielleicht ist in der TF.ahk library (github TF) was vorhanden was du gebrauchen kannst.

Allerdings würde ich dir zwecks einfachere Verwaltung immer noch vorschlagen das Ganze auf .ini um zu stellen.
(IniRead, IniWrite, IniDelete)
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
User avatar
fump2000
Posts: 313
Joined: 04 Oct 2013, 17:31

Re: Verwendung von Dateiinhalten

25 Feb 2015, 09:59

Ui das sieht aber vielversprechend aus :)

Danke für den Hinweis!
strobo
Posts: 125
Joined: 30 Sep 2013, 15:24

Re: Verwendung von Dateiinhalten

25 Feb 2015, 10:20

Ich glaub da gibts libraries, die dich da unterstützen können, TF (?), string-things irgendwie so hiessen die.
Ist mein deutsch zu schlecht? :D

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 32 guests