ListView Frage'n

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

effel
Posts: 542
Joined: 16 Jan 2018, 13:34

ListView Frage'n

14 Oct 2020, 02:17

Hallo, wie kann ich erreichen, dass das Bild, welches ich in der Spalte FileNameArr[counter[A_Index]] 'einmal' anklicke, in einer Rahmenlosen GUI an der Maus klebt. Wie ein Tooltip. Geht sowas?

Code: Select all

#SingleInstance force
#NoEnv
SetKeyDelay 20
SetTitleMatchMode, 2


MapsPic =
(
E29EA86D3DE41EBA638759CD2057D5C5;https://www.google.com/maps/vt/data=-V9-TK0q6WAaz3IsV0GA0ycLYcOMQ0PNNJEBUA_q3uRXBE7ewg9PGjtxTWmuevN_hAz23l4WgP6IFdB-vocHhp9VpY1XHnAH4NH8xm0tzABYaxJeJi6TbfDh_jQk7JSg6y5P2ddetR6FS0jrTxuEnTA5yLH3RkoJqxPKDNJPt_M
4D5BA5807538F20F22447CB2865FC894;https://www.google.com/maps/vt/data=X6du77TUdb5oN-hIZJc3eN_TOwi2TTF5GZR8t3Z_ml-K2x1_5geCYW7zaRjANtrlk5WL6RY4bgoX7bBrCTwmEbZiuTnlPjr6pT6VkFOuvZWh-2-cssREgGUXMi2AS1Cu-Gs0O0_MAmHEKBcA30h3vUS0K2Af4Yk5UZS8NtNheNw
5C1548941B721514241F1196B1974030;https://www.google.com/maps/vt/data=hq9tQMju8dpo52cxinRgt_hsA2-KmGEOsUaQD2lykQkwuTvknFAiCfEpgUj8MSL9olWcyCRgQW9Q2L1b3b8RsXn3MZZcSIUR9942BlDTRhKko6rww_BM2bBRluhIdwPKyKTOPU-Ic_9FwoFPK1dptpauBBOIUHAgbrigeAzKy10
)


MapsCal :=
(
"E29EA86D3DE41EBA638759CD2057D5C5;https://www.google.com/maps/place/50%C2%B019'54.0%22N+6%C2%B056'24.6%22E
4D5BA5807538F20F22447CB2865FC894;https://www.google.com/maps/place/50%C2%B019'58.8%22N+6%C2%B056'22.2%22E
5C1548941B721514241F1196B1974030;https://www.google.com/maps/place/50%C2%B019'58.2%22N+6%C2%B056'21.6%22E"
)


FileNameOriginal =
(
E29EA86D3DE41EBA638759CD2057D5C5;C:\Users\Administrator\Desktop\GPS Foto Content\original\017.JPG
4D5BA5807538F20F22447CB2865FC894;C:\Users\Administrator\Desktop\GPS Foto Content\original\018.JPG
5C1548941B721514241F1196B1974030;C:\Users\Administrator\Desktop\GPS Foto Content\original\021.JPG
)


KoordinatenFuerSort :=
(
"E29EA86D3DE41EBA638759CD2057D5C5;https://www.google.com/search?q=50%C2%B019'54.0%22N+6%C2%B056'24.6%22E;[email protected]
4D5BA5807538F20F22447CB2865FC894;https://www.google.com/search?q=50%C2%B019'58.8%22N+6%C2%B056'22.2%22E;[email protected]
5C1548941B721514241F1196B1974030;https://www.google.com/search?q=50%C2%B019'58.2%22N+6%C2%B056'21.6%22E;[email protected]"
)


FileZiel =
(
E29EA86D3DE41EBA638759CD2057D5C5;C:\Users\Administrator\Desktop\GPS Foto Content\2011\Juni\3\2011.Juni.3--07.07.22--017.JPG
4D5BA5807538F20F22447CB2865FC894;C:\Users\Administrator\Desktop\GPS Foto Content\2011\Juni\3\2011.Juni.3--07.13.16--018.JPG
5C1548941B721514241F1196B1974030;C:\Users\Administrator\Desktop\GPS Foto Content\2011\Juni\3\2011.Juni.3--07.15.40--021.JPG
)

  

	MapsPicArr := Object()
	counter := []
	loop, Parse, % MapsPic, `n, `r 
	{	
	Arr:= StrSplit(A_LoopField, ";")
;	if Arr.Length()=2	
	MapsPicArr[Arr[1]] := (Arr[2] ? Arr[2] : Arr[1])
	counter.Push(Arr[1])
	}

	MapsCallArr := Object()
	loop, Parse, % MapsCal, `n, `r
	{	
	Arr:= StrSplit(A_LoopField, ";")
	MapsCallArr[Arr[1]] := (Arr[2] ? Arr[2] : Arr[1])
	}

	FileNameArr := Object()
	loop, Parse, % FileNameOriginal, `n, `r
	{	
	Arr:= StrSplit(A_LoopField, ";")
	FileNameArr[Arr[1]] := (Arr[2] ? Arr[2] : Arr[1])
	}

	KoordinatenFuerSortaArr := Object()
	loop, Parse, % KoordinatenFuerSort, `n, `r
	{	
	Arr:= StrSplit(A_LoopField, ";")
	KoordinatenFuerSortaArr[Arr[1]] := (Arr[2] ? Arr[2] : Arr[1])
	}

	KoordinatenFuerSortbArr := Object()
	loop, Parse, % KoordinatenFuerSort, `n, `r
	{	
	Arr:= StrSplit(A_LoopField, ";")
	KoordinatenFuerSortbArr[Arr[1]] := (Arr[3] ? Arr[3] : Arr[1])
	}

	FileZielArr := Object()
	loop, Parse, % FileZiel, `n, `r
	{	
	Arr:= StrSplit(A_LoopField, ";")
	FileZielArr[Arr[1]] := (Arr[2] ? Arr[2] : Arr[1])
	}



	Loop % counter.MaxIndex()
	MsgBox % "ID:`n" counter[A_Index] "`n`n" 
		. "Maps Pic URL:`n" MapsPicArr[counter[A_Index]] "`n`n" 
		. "Maps Navi URL:`n" MapsCallArr[counter[A_Index]] "`n`n" 
		. "KoordinatenA:`n" KoordinatenFuerSortaArr[counter[A_Index]] "`n`n" 
		. "KoordinatenB:`n" KoordinatenFuerSortbArr[counter[A_Index]] "`n`n" 
		. "Quelle:`n" FileNameArr[counter[A_Index]] "`n`n" 
		. "Quelle FileName:`n" yFileName(FileNameArr[counter[A_Index]]) "`n`n" 
		. "Ziel FileName:`n" yFileName(FileZielArr[counter[A_Index]]) "`n`n" 
		. "Ziel:`n" FileZielArr[counter[A_Index]] "`n`n" 


	yFileName(x){
	x := StrSplit(x, "\")
	While, x.MaxIndex() 
	Return x.Pop()
	}


	Gui, Add, ListView, w1500 r20 gActionListView, ID|GEO|FileName Quelle|FileName Ziel|BildMap
	Loop % counter.MaxIndex()
	  LV_Add("", counter[A_Index]
		, KoordinatenFuerSortbArr[counter[A_Index]]
		, yFileName(FileNameArr[counter[A_Index]])
		, yFileName(FileZielArr[counter[A_Index]])
		, MapsPicArr[counter[A_Index]])
	LV_ModifyCol()
	Gui, Show, , Bilder GPS Data

ActionListView:
if (A_GuiEvent = "DoubleClick")
{
    LV_GetText(BildUrl, A_EventInfo)
;MsgBox % A_EventInfo "`n" MapsPicArr[BildUrl]
Run % MapsPicArr[BildUrl]
Sleep, 2000
Run % FileNameArr[BildUrl]
}
return

GuiClose:
ExitApp

Return
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ListView Frage'n

14 Oct 2020, 03:00

Moin,

wozu soll das dienen?
effel
Posts: 542
Joined: 16 Jan 2018, 13:34

Re: ListView Frage'n

14 Oct 2020, 03:09

Hallo, ich scanne meine Bilder und speichere die GPS Daten, diese nutze ich um bei Google das dazu passende MapsBild abzurufen.

data=LEwfhVFcYL3ljcj5L0HaAsCj4cGRsNnDWdtDB8V-2lkIxcnapR-SkIUS91D1Qvw9_UvLTmspFvZvtpxjdNCS1VICiquXngsRRvI_Xq_eJA1DCVoKsILWPMRvaQnRxSeOF4wfTmg_6snUeO51ILAP8IEWnSRXtizj4g (1).png
data=LEwfhVFcYL3ljcj5L0HaAsCj4cGRsNnDWdtDB8V-2lkIxcnapR-SkIUS91D1Qvw9_UvLTmspFvZvtpxjdNCS1VICiquXngsRRvI_Xq_eJA1DCVoKsILWPMRvaQnRxSeOF4wfTmg_6snUeO51ILAP8IEWnSRXtizj4g (1).png (152.32 KiB) Viewed 1388 times

Bevor ich klicke, wäre es toll wenn ich das Foto, welches sich auf meiner Platte befindet sehen kann

Dabei kam mir der Gedanke ob es auch so funktioniert, dass das Bild nur entweder mit einmal Klick oder wenn ich die Maus nur über eine der Zeilen halte, wie beschrieben erscheinen kann
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ListView Frage'n

14 Oct 2020, 03:15

Also nur anzeigen, nicht bewegen?
effel
Posts: 542
Joined: 16 Jan 2018, 13:34

Re: ListView Frage'n

14 Oct 2020, 03:17

Was halt geht. Das war nur ein schneller Gedanke wobei ich dachte hier Verbündete zu finden 😊

Es wäre minimalistischer es ohne den MS Viewer zu machen, ahk like
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ListView Frage'n

14 Oct 2020, 03:53

Also, Du willst das für eine bestimmte Zeile im ListView das in der Spalte in FileName Quelle abgelegte Bild anzeigen?
(Ich muss immer mal wieder kurz weg.)
effel
Posts: 542
Joined: 16 Jan 2018, 13:34

Re: ListView Frage'n

14 Oct 2020, 03:56

FileName Quelle wäre gut. Bist du im Stress?
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ListView Frage'n

14 Oct 2020, 04:00

Nein, kein Stress, ich melde mich etwas später wieder.
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ListView Frage'n

15 Oct 2020, 04:41

Moin,

jetzt ist es 'etwas später'. ;)

Das Anzeigen einer (unterstützten) Bilddatei in einem AHK-Fenster ist keine Herausforderung. Interessanter ist, wie Du Dir den Ablauf vorstellst.
Bei welcher Aktion und für welche Dauer soll das Bild angezeigt werden?
Welche weiteren Aktionen sollen per ListView gesteuert werden?

Microsoft hat die ListView-Controls für die Verwendung im Explorer mit dokumentierten und wahrscheinlich auch nicht dokumentierten Funktionen überfrachtet und auch immer mal wieder am Standardverhalten geschraubt. Für eine Skriptsprache wie AHK können sie recht 'anstrengend' sein.
effel
Posts: 542
Joined: 16 Jan 2018, 13:34

Re: ListView Frage'n

15 Oct 2020, 17:48

just me wrote:
15 Oct 2020, 04:41
Interessanter ist, wie Du Dir den Ablauf vorstellst.
Bei welcher Aktion und für welche Dauer soll das Bild angezeigt werden?
Welche weiteren Aktionen sollen per ListView gesteuert werden?
Die Idee ist nicht neu, man sieht es oft als übertrieben fetten Tooltip mit Hilfstexten, wenn man die Maus über Elemente der Anbieter Gui 'bewegt'

Bewegt man die Maus zum nächsten Element, wird sofort der Kontext zu der neuen Mouse-Under-Position angezeigt.... und so stellte ich es mir bei dem ListView vor, wenn ich mit der Maus über einer Zeile bin, dann gibt es nur ein Bild welches damit assoziiert ist...

...und für die Zeit die ich auf der Zeile verweile, soll das Bild [verkleinert?] rahmenlos nahe dem Mauszeiger oder der Zeile angezeigt werden.

Wie schon erwähnt, war das nur ein schneller Gedanke, aber ich habe hier schon Pferde kotzen gesehen, daher finde ich hier ist jede Frage berechtigt. sorry das ist ein kölscher Ausdruck und trägt nichts negatives
Wenn das mit dem Mouse-hovern zu kompiliert ist, klicken wir halt auf die gemeinte Zeile 😉
Für eine Skriptsprache wie AHK können sie recht 'anstrengend' sein.
Wenn es anstrengend wird, mache ich den Rechner aus

Zwischen der ersten Frage und A_Now sind weitere Fragen aufgetaucht.

Der folgende Code darf nur als Lernstück gelesen werden, viele Variablen und Arrays existieren obwohl sie nicht genutzt werden, weil ich im Verlauf erkannte, das es auch anders/einfacher geht

Mit der Erstellung von diesem Code habe ich verstanden wie Arrays gehandhabt werden, der Groschen ist quasie gefallen.

Wenn man n Arrays mit einer jeweils eindeutigen ID verknüpft, kann man sie in Relation zueinander auswerten.

Auch das sowas funktioniert war neu für mich:

Code: Select all

For PropName, PropValue In Props
	{
	%PropName% := PropValue
Aktuell stehe ich vor der Aufgabe, eine GUI zu erstellen. Ein ListView alleine reicht nicht aus, um die Daten die ich Mittlerweile aus einem jpeg lesen kann auszuwerten.

Einmal habe ich nicht verstanden wie ich mehrere ListView in einer Gui verwalten kann. Etliche Versuche Gui, 1:default zu platzieren schlugen fehl.

Dann würde ich gerne in der Spalte ganz rechts, die mit dem Bild Link, anstatt dem Link ein Pic einfügen
2020-10-15 at 22.35.49.jpeg
2020-10-15 at 22.35.49.jpeg (18.19 KiB) Viewed 1288 times
. Hierbei komme ich auch nicht weiter.

Und jetzt eine Verständnisfrage, wenn die Gui mit Daten gestartet ist, wie werden die angezeigten Gui Werte neu geschrieben?...

...ich habe z.B. mit %PropName% := PropValue alle Variablen mit Daten gefüllt, wie bringe ich diese vielleicht aktualisierten Werte auf den Schirm?

z.B. eine ComboBox, wie ersetze ich deren Inhalt durch neuen Content... wie gesagt wenn die Gui schon gestartet ist, bis dahin komme ich grade so, mir gehts um das aktualisieren.

Vielen Dank fürs lesen


Ohne ein Pic in C:\Users\Administrator\Desktop\GPS Foto Content\original\017.JPG wird der Code nicht laufen, darum habe ich die Antwort der MsgBox mit eingefügt

Code: Select all

#SingleInstance force
#NoEnv
SetKeyDelay 20
SetTitleMatchMode, 2


MapsPic =
(
E29EA86D3DE41EBA638759CD2057D5C5;https://www.google.com/maps/vt/data=-V9-TK0q6WAaz3IsV0GA0ycLYcOMQ0PNNJEBUA_q3uRXBE7ewg9PGjtxTWmuevN_hAz23l4WgP6IFdB-vocHhp9VpY1XHnAH4NH8xm0tzABYaxJeJi6TbfDh_jQk7JSg6y5P2ddetR6FS0jrTxuEnTA5yLH3RkoJqxPKDNJPt_M
)


MapsCal :=
(
"E29EA86D3DE41EBA638759CD2057D5C5;https://www.google.com/maps/place/50%C2%B019'54.0%22N+6%C2%B056'24.6%22E"
)


FileNameOriginal =
(
E29EA86D3DE41EBA638759CD2057D5C5;C:\Users\Administrator\Desktop\GPS Foto Content\original\017.JPG
)

;4D5BA5807538F20F22447CB2865FC894;C:\Users\Administrator\Desktop\GPS Foto Content\original\018.JPG
;5C1548941B721514241F1196B1974030;C:\Users\Administrator\Desktop\GPS Foto Content\original\021.JPG


KoordinatenFuerSort :=
(
"E29EA86D3DE41EBA638759CD2057D5C5;https://www.google.com/search?q=50%C2%B019'54.0%22N+6%C2%B056'24.6%22E;[email protected]"
)


FileZiel =
(
E29EA86D3DE41EBA638759CD2057D5C5;C:\Users\Administrator\Desktop\GPS Foto Content\2011\Juni\3\2011.Juni.3--07.07.22--017.JPG
)

  

	MapsPicArr := Object()
	counter := []
	loop, Parse, % MapsPic, `n, `r ; E29EA86D3DE41EBA638759CD2057D5C5;https://www.google.com/maps/vt/data=-V9-TK0q6WAaz3IsV0GA0ycLYcOMQ0PNNJEBUA_q3uRXBE7ewg9PGjtxTWmuevN_hAz23l4WgP6IFdB-vocHhp9VpY1XHnAH4NH8xm0tzABYaxJeJi6TbfDh_jQk7JSg6y5P2ddetR6FS0jrTxuEnTA5yLH3RkoJqxPKDNJPt_M
	{	
	Arr:= StrSplit(A_LoopField, ";")
;	if Arr.Length()=2	
	MapsPicArr[Arr[1]] := (Arr[2] ? Arr[2] : Arr[1])
	counter.Push(Arr[1])
	ID := Arr[1]
	}
;/*
	MapsCallArr := Object()
	loop, Parse, % MapsCal, `n, `r ; E29EA86D3DE41EBA638759CD2057D5C5;https://www.google.com/maps/place/50%C2%B019'54.0%22N+6%C2%B056'24.6%22E
	{	
	Arr:= StrSplit(A_LoopField, ";")
	MapsCallArr[Arr[1]] := (Arr[2] ? Arr[2] : Arr[1])
	}

	FileNameArr := Object()
	loop, Parse, % FileNameOriginal, `n, `r ; E29EA86D3DE41EBA638759CD2057D5C5;C:\Users\Administrator\Desktop\GPS Foto Content\original\017.JPG
	{	
	Arr:= StrSplit(A_LoopField, ";")
	FileNameArr[Arr[1]] := (Arr[2] ? Arr[2] : Arr[1])
	}

	KoordinatenFuerSortaArr := Object()
	loop, Parse, % KoordinatenFuerSort, `n, `r ; E29EA86D3DE41EBA638759CD2057D5C5;https://www.google.com/search?q=50%C2%B019'54.0%22N+6%C2%B056'24.6%22E;[email protected]
	{	
	Arr:= StrSplit(A_LoopField, ";")
	KoordinatenFuerSortaArr[Arr[1]] := (Arr[2] ? Arr[2] : Arr[1])
	}

	KoordinatenFuerSortbArr := Object()
	loop, Parse, % KoordinatenFuerSort, `n, `r ; E29EA86D3DE41EBA638759CD2057D5C5;https://www.google.com/search?q=50%C2%B019'54.0%22N+6%C2%B056'24.6%22E;[email protected]
	{	
	Arr:= StrSplit(A_LoopField, ";")
	KoordinatenFuerSortbArr[Arr[1]] := (Arr[3] ? Arr[3] : Arr[1])
	}

	FileZielArr := Object()
	loop, Parse, % FileZiel, `n, `r ; E29EA86D3DE41EBA638759CD2057D5C5;C:\Users\Administrator\Desktop\GPS Foto Content\2011\Juni\3\2011.Juni.3--07.07.22--017.JPG
	{	
	Arr:= StrSplit(A_LoopField, ";")
	FileZielArr[Arr[1]] := (Arr[2] ? Arr[2] : Arr[1])
	}
;*/
	GetGpsDataALLArr := Object()
	GetGpsDatazArr := Object()
	GetGpsDatayArr := Object()
	GetGpsDataxArr := Object()
	loop, Parse, % FileNameOriginal, `n, `r ; E29EA86D3DE41EBA638759CD2057D5C5;C:\Users\Administrator\Desktop\GPS Foto Content\original\017.JPG
	{	
	Arr:= StrSplit(A_LoopField, ";")
	Props := GetGpsData((Arr[2] ? Arr[2] : Arr[1]))
	For PropName, PropValue In Props
	{
	%PropName% := PropValue
	GetGpsDataxArr[Arr[1]] .= (PropName ? PropName : Arr[1])  "`n"
	GetGpsDatayArr[Arr[1]] .= (PropValue ? PropValue : Arr[1]) "`n"
;	GetGpsDatazArr[Arr[1]] .= (PropName ? PropName : Arr[1]) ": " (PropValue ? PropValue : Arr[1]) "`n"
	GetGpsDataALLArr[Arr[1]] .= (PropName ? PropName : Arr[1]) ": " (PropValue ? PropValue : Arr[1])  "`n"
	}}

	GetAllDetailszArr := Object()
	GetAllDetailsyArr := Object()
	GetAllDetailsxArr := Object()
	loop, Parse, % FileNameOriginal, `n, `r ; E29EA86D3DE41EBA638759CD2057D5C5;C:\Users\Administrator\Desktop\GPS Foto Content\original\017.JPG
	{	
	Arr:= StrSplit(A_LoopField, ";")
	Props := GetAllDetails((Arr[2] ? Arr[2] : Arr[1]))
	For PropName, PropValue In Props
	{
	%PropName% := PropValue
	GetAllDetailsxArr[Arr[1]] .= (PropName ? PropName : Arr[1])  "`n"
	GetAllDetailsyArr[Arr[1]] .= (PropValue ? PropValue : Arr[1]) "`n"
;	GetAllDetailszArr[Arr[1]] .= (PropName ? PropName : Arr[1]) ": " (PropValue ? PropValue : Arr[1]) "`n"
	GetGpsDataALLArr[Arr[1]] .= (PropName ? PropName : Arr[1]) ": " (PropValue ? PropValue : Arr[1])  "`n"
	}}


;---------------------------------------------------------------------------------------------------------------------------------------------
/*
	Loop % counter.MaxIndex()
	MsgBox % "ID:`n" counter[A_Index] "`n`t" 
		. "Maps Pic URL:`n" MapsPicArr[counter[A_Index]] "`n`t" 
		. "Maps Navi URL:`n" MapsCallArr[counter[A_Index]] "`n`t" 
		. "KoordinatenA:`n" KoordinatenFuerSortaArr[counter[A_Index]] "`n`t" 
		. "KoordinatenB:`n" KoordinatenFuerSortbArr[counter[A_Index]] "`n`t" 
		. "Quelle:`n" FileNameArr[counter[A_Index]] "`n`t" 
		. "Quelle FileName:`n" yFileName(FileNameArr[counter[A_Index]]) "`n`t" 
		. "Ziel FileName:`n" yFileName(FileZielArr[counter[A_Index]]) "`n`t" 
		. "Ziel:`n" FileZielArr[counter[A_Index]] "`n`n" 
		. GetGpsDataALLArr[counter[A_Index]] "`n"
	;	. GetAllDetailszArr[counter[A_Index]] "`n"
	;	. GetGpsDatazArr[counter[A_Index]] "`n"
		. "Aufnahmedatum: " Aufnahmedatum
*/
/*
Ergebnis der MsgBox:
---------------------------
FotoContentGpsSortiert V3 .ahk
---------------------------
ID:
E29EA86D3DE41EBA638759CD2057D5C5
	Maps Pic URL:
https://www.google.com/maps/vt/data=-V9-TK0q6WAaz3IsV0GA0ycLYcOMQ0PNNJEBUA_q3uRXBE7ewg9PGjtxTWmuevN_hAz23l4WgP6IFdB-vocHhp9VpY1XHnAH4NH8xm0tzABYaxJeJi6TbfDh_jQk7JSg6y5P2ddetR6FS0jrTxuEnTA5yLH3RkoJqxPKDNJPt_M
	Maps Navi URL:
https://www.google.com/maps/place/50%C2%B019'54.0%22N+6%C2%B056'24.6%22E
	KoordinatenA:
https://www.google.com/search?q=50%C2%B019'54.0%22N+6%C2%B056'24.6%22E
	KoordinatenB:
[email protected]
	Quelle:
C:\Users\Administrator\Desktop\GPS Foto Content\original\017.JPG
	Quelle FileName:
017.JPG
	Ziel FileName:
2011.Juni.3--07.07.22--017.JPG
	Ziel:
C:\Users\Administrator\Desktop\GPS Foto Content\2011\Juni\3\2011.Juni.3--07.07.22--017.JPG

Latitude: 50.000000, 19.000000, 54.000000
LatitudeDenominator: 1, 1, 10000
LatitudeNumerator: 50, 19, 539999
LatitudeRef: N
Longitude: 6.000000, 56.000000, 24.600000
LongitudeDenominator: 1, 1, 10000
LongitudeNumerator: 6, 56, 245999
LongitudeRef: E
Abmessungen: ‪2897 x 539‬
Art: Bild
Attribute: A
Aufnahmedatum: ‎03.‎06.‎2011 ‏‎07:07
Ausrichtung: Normal
Besitzer: User\Administrator
Bewertung: Nicht bewertet
Bittiefe: 24
Breite: ‎2897 Pixel
Computer: User (dieser PC)
Dateierweiterung: .JPG
Dateiname: 017.JPG
Elementtyp: JPG-Datei
Erfassungsdatum: ‎03.‎06.‎2011 ‏‎07:37
ErkannterTyp: Bild
Erstelldatum: 11.10.2020 02:03
EXIFVersion: 221
FreierSpeicherplatz: 669 MB
Freigabestatus: Privat
Freigegeben: Nein
Gesamtgröße: 28,2 GB
Größe: 289 KB
HorizontaleAuflösung: ‎72 dpi
Höhe: ‎539 Pixel
LetzterZugriff: 15.10.2020 08:30
Name: 017.JPG
Ordner: original (C:\Benutzer\Administrator\Desktop\GPS Foto Content)
Ordnername: original
Ordnerpfad: C:\Benutzer\Administrator\Desktop\GPS Foto Content\original
Pfad: C:\Benutzer\Administrator\Desktop\GPS Foto Content\original\017.JPG
Programmname: Photosynth
Typ: JPG-Datei
Verknüpfungsstatus: Nicht aufgelöst
VertikaleAuflösung: ‎72 dpi
VerwendeterSpeicherplatz: ‎97%
Änderungsdatum: 03.06.2011 07:07


---------------------------
OK   
---------------------------
*/


	yFileName(x){
	x := StrSplit(x, "\")
	While, x.MaxIndex() 
	Return x.Pop()
	}

;/*
	Gui, Add, ListView , w650 r20 gActionListView, ID|Erfassungsdatum|GEO|FileName Quelle|Programmname|BildMap
	Gui +Resize
ImageListID := IL_Create(10)  ; Erstellt eine ImageList für 10 kleine Symbole.
LV_SetImageList(ImageListID)  ; Weist die obige ImageList der aktuellen ListView zu.
IL_Add(ImageListID, "shell32.dll", 59) 
;Loop 10  ; Fügt Reihen in die ListView ein (für jedes Symbol eine Reihe).
;    LV_Add("Icon" . 59, 59, "n/a")
;Gui, Add, Button, Default gButtonOrdnerLaden, Ordner laden
;Gui, Add, Button, x+20 gButtonLeeren, Liste leeren
;Gui, Add, Button, x+20, Ansicht wechseln
	Loop % counter.MaxIndex()
	  LV_Add("", counter[A_Index]
		, Erfassungsdatum
		, KoordinatenFuerSortbArr[counter[A_Index]]
		, yFileName(FileNameArr[counter[A_Index]])
		, Programmname
	;	, yFileName(FileZielArr[counter[A_Index]])
		, MapsPicArr[counter[A_Index]])
	LV_ModifyCol()
	LV_ModifyCol(1, 0)
	LV_ModifyCol(2, 100)
	LV_ModifyCol(3, 130)
	LV_ModifyCol(4, 170)
	LV_ModifyCol(5, 170)
	LV_ModifyCol(6, 50)
	Gui, Show, , Bilder GPS Data


ButtonLeeren:
ButtonOrdnerLaden:
Return

;*/

/*
;	res := GetGpsDataDetails(MapsPicArr["E29EA86D3DE41EBA638759CD2057D5C5"])


;https://ahkde.github.io/docs/commands/ListView.htm#LV_GetText
;https://ahkde.github.io/docs/commands/ListView.htm
Loop % LV_GetCount()
{
    LV_GetText(AbgerufenerText, A_Index)
    if InStr(AbgerufenerText, "beliebiger Filtertext")
        LV_Modify(A_Index, "Select")  ; Markiert jede Reihe, die im ersten Feld den Filtertext enthält.
;------------------
Gui +LastFound
Loop % LV_GetCount("Column")
{
    SendMessage, 4125, A_Index - 1, 0, SysListView321  ; 4125 ist LVM_GETCOLUMNWIDTH.
    MsgBox Die Spalte %A_Index% hat eine Breite von %ErrorLevel%.
}
;------------------
Reihennummer := 0  ; Veranlasst den ersten Schleifendurchlauf, die Suche am Anfang der Liste zu beginnen.
Loop
{
    Reihennummer := LV_GetNext(Reihennummer)  ; Setzt die Suche bei der nächsten Reihe fort.
    if not Reihennummer  ; Oben wurde null zurückgegeben, also gibt es keine weiteren ausgewählten Reihen.
        break
    LV_GetText(Text, Reihennummer)
    MsgBox Die nächste ausgewählte Reihe ist #%Reihennummer%, die im ersten Feld "%Text%" enthält.
}
;------------------
;Das nächste Beispiel ist eine alternative Methode, mit der man herausfinden kann, ob eine bestimmte Reihennummer abgehakt ist:

Gui +LastFound
SendMessage, 4140, Reihennummer - 1, 0xF000, SysListView321  ; 4140 ist LVM_GETITEMSTATE. 0xF000 ist LVIS_STATEIMAGEMASK.
IstAbgehakt := (ErrorLevel >> 12) - 1  ; Setzt IstAbgehakt auf 1 (true), wenn Reihennummer abgehakt ist, ansonsten auf 0 (false).
;------------------
;LV_GetText
;Ruft den Text ab, der auf der angegebenen Reihennummer und Spaltennummer zu finden ist, und speichert ihn in AusgabeVar.

LV_GetText(AusgabeVar, Reihennummer , Spaltennummer)
;------------------
;------------------
*/


ActionListView:
if (A_GuiEvent = "DoubleClick")
{
    LV_GetText(BildUrl, A_EventInfo)
;MsgBox % A_EventInfo "`n" MapsPicArr[BildUrl]
Run % MapsPicArr[BildUrl]
Sleep, 2000
Run % FileNameArr[BildUrl]
}

if (A_GuiEvent = "^DoubleClick")
{
    LV_GetText(BildUrl, A_EventInfo)
Run % FileNameArr[BildUrl]
}
return

GuiContextMenu:  ; Startet, wenn man einen Rechtsklick macht oder die MENÜ-Taste drückt.
if (A_GuiControl != "MeineListView")  ; Diese Überprüfung ist optional. Sie zeigt das Menü nur an, wenn Klicks innerhalb der ListView gemacht werden.
    return
; Zeigt das Menü bei den Koordinaten A_GuiX und A_GuiY an. Diese Koordinaten
; sind auch dann korrekt, wenn der Benutzer die MENÜ-Taste drückt:
Menu, MeinKontextmenü, Show, %A_GuiX%, %A_GuiY%
return

GuiClose:
ExitApp

Return
;GuiControl, -Redraw, MeineListView
;GuiControl, +Redraw, MeineListView
;-------------------------------------------
GetAllDetails(filePath) {
	MaxGap := 320 ; max 320
	AllDetailsArr := Object()
	SplitPath,% filePath, fileName, dirPath
	Folder := ComObjCreate("Shell.Application").NameSpace(dirPath)
	FolderItem	:= Folder.ParseName(fileName)
	Gap := 0
	While (Gap < MaxGap)
		If (Value := Folder.GetDetailsOf(FolderItem, A_Index - 1))
			{
			If InStr(Value, "Verfügbar")
			Continue
			xPropName := StrReplace(Folder.GetDetailsOf(0, A_Index - 1), A_Space, "-")
			xPropName := RegExReplace(xPropName,"(*UCP)[^\w\h\.]") ; wichtig, sonst Fehler bei [%PropName% := PropValue]
			AllDetailsArr[xPropName] := Value
;			AllDetailsArr[Folder.GetDetailsOf(0, A_Index - 1)] := Value
			props .= Folder.GetDetailsOf(0, A_Index - 1) ": " Value " `n "
;			props .= A_Index - 1 " :`t" Folder.GetDetailsOf(0, A_Index - 1) ":`t" Value " `n "
;			props .= A_Index - 1 " : " Value " `n ", Gap := 0
			}
	  Else
		 Gap++
;	Return props
	Return AllDetailsArr
	}
;-------------------------------------------


GetGpsData(FilePath) {
   Local
   ; Namespace: "System.GPS."


   Static GpsProps := ["Altitude"                  , "AltitudeDenominator"       , "AltitudeNumerator"
                     , "AltitudeRef"               , "AreaInformation"           , "Date"
                     , "DestBearing"               , "DestBearingDenominator"    , "DestBearingNumerator"
                     , "DestBearingRef"            , "DestDistance"              , "DestDistanceDenominator"
                     , "DestDistanceNumerator"     , "DestDistanceRef"           , "DestLatitude"
                     , "DestLatitudeDenominator"   , "DestLatitudeNumerator"     , "DestLatitudeRef"
                     , "DestLongitude"             , "DestLongitudeDenominator"  , "DestLongitudeNumerator"
                     , "DestLongitudeRef"          , "Differential"              , "DOP"
                     , "DOPDenominator"            , "DOPNumerator"              , "ImgDirection"
                     , "ImgDirectionDenominator"   , "ImgDirectionNumerator"     , "ImgDirectionRef"
                     , "Latitude"                  , "LatitudeDecimal"           , "LatitudeDenominator"
                     , "LatitudeNumerator"         , "LatitudeRef"               , "Longitude"
                     , "LongitudeDecimal"          , "LongitudeDenominator"      , "LongitudeNumerator"
                     , "LongitudeRef"              , "MapDatum"                  , "MeasureMode"
                     , "ProcessingMethod"          , "Satellites"                , "Speed"
                     , "SpeedDenominator"          , "SpeedNumerator"            , "SpeedRef"
                     , "Status"                    , "Track"                     , "TrackDenominator"
                     , "TrackNumerator"            , "TrackRef"                  , "VersionID"]


   SplitPath, FilePath, FileName , FileDir
   If (FileDir = "")
      FileDir := A_WorkingDir
   Props := {}
   If (SFI := ComObjCreate("Shell.Application").NameSpace(FileDir).ParseName(FileName)) {
      For Each, PropName In GpsProps {
         PropVal := SFI.ExtendedProperty("System.GPS." . PropName)
         If IsObject(PropVal) {
            If (ComObjType(PropVal) & 0x2000) { ; VT_ARRAY
               Values := ""
               For Value In PropVal
                  Values .= Value . ", "
               Props[PropName] := RTrim(Values, ", ")
            }
         }
         Else If (PropVal <> "")
            Props[PropName] := PropVal
      }
   }
   Return Props
}
;-------------------------------------------

/*
	MsgBox % counter[1] "`n`n" MapsPicArr["E29EA86D3DE41EBA638759CD2057D5C5"]
	MsgBox % counter[2] "`n`n" MapsPicArr["4D5BA5807538F20F22447CB2865FC894"]
	MsgBox % counter[3] "`n`n" MapsPicArr["5C1548941B721514241F1196B1974030"]

	MsgBox % counter[1] "`n`n" MapsPicArr[counter[1]]
	MsgBox % counter[2] "`n`n" MapsPicArr[counter[2]]
	MsgBox % counter[3] "`n`n" MapsPicArr[counter[3]]


	Loop % Arr.Length()+1
	MsgBox % counter[A_Index] "`n`n" 
		. MapsPicArr[counter[A_Index]] "`n`n" 
		. MapsCallArr[counter[A_Index]] "`n`n" 
		. FileNameArr[Counter[A_Index]]
*/


just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ListView Frage'n

17 Oct 2020, 04:31

Moin,

das war eine unerwartet lange Antwort. Und die neu aufgekommenen Fragen sind auch nicht alle trivial. Ich will mal versuchen, die einfachen schnell zu beantworten. Der Rest bedarf einer weiteren Diskussion.

Einmal habe ich nicht verstanden wie ich mehrere ListView in einer Gui verwalten kann.
Das Prozedere ist hier beschrieben. Sämtliche LV_...() Funktionen arbeiten mit dem aktuellen Standard-ListView des aktuellen Standard-Gui-Fensters. Zu Beginn ist das zuletzt hinzugefügte ListView-Control der Standard-ListView. Das Standard-Fenster kann man mit Gui, Name:Default bestimmen. Den Standard-ListView bestimmt man mit Gui, ListView, ListViewName. Innerhalb einer Gui-Subroutine wird als Standard-Fenster automatisch das auslösende Fenster gesetzt. In der einem ListView-Control zugeordneten Routine geschieht das für den Standard-ListView leider nicht automatisch. Man muss ihn bei Bedarf 'händisch' setzen.

Dann würde ich gerne in der Spalte ganz rechts, die mit dem Bild Link, anstatt dem Link ein Pic einfügen ...
Bilder können nur in Form von Icons dargestellt werden, die einer dem ListView-Control zugewiesenen ImageList entnommen werden. Für die erste Spalte geht das mit den AHK-LV-Funktionen. Für die hinteren Spalten muss man auf Selbstgebasteltes zurückgreifen. Ich kann Dir dafür etwas zur Verfügung stellen.

... wie bringe ich diese vielleicht aktualisierten Werte auf den Schirm?
Für die Änderung des Inhalts von 'einfachen' Controls gibt es die Anweisung GuiControl. Eine ComboBox wird z.B. mit GuiControl, , ID, | geleert. Vorhandener Inhalt wird überschrieben, wenn der neuen Liste ein |-Zeichen vorangestellt ist (GuiControl, , ID, |%NeueListe%).


Das soll erst einmal genug sein. Die weiteren Themen kommen später. Mir stellt sich insbesondere die Frage, ob die Option mit dem 'schwebenden' Bilder-Tooltip wirklich gebraucht wird, wenn Du eine 'kompletteres' Gui-Fenster aufbaust.

Bis dann!
effel
Posts: 542
Joined: 16 Jan 2018, 13:34

Re: ListView Frage'n

17 Oct 2020, 23:39

just me wrote:
17 Oct 2020, 04:31
Mir stellt sich insbesondere die Frage, ob die Option mit dem 'schwebenden' Bilder-Tooltip wirklich gebraucht wird, wenn Du eine 'kompletteres' Gui-Fenster aufbaust.
Hallo just me,
vielen Dank für deine Ausführung, ich denke auch das es nicht sinnvoll ist an diese Option Zeit zu verschwenden.

Am Ende wird die Gui wohl etwas umfangreicher als ich es mir dachte

Im Moment sammele ich erstmal alle Daten zusammen, die man zu einem ausgelesenen Bild bekommen kann.

Der folgende Code liest eine Bilddatei aus und erstellt eine ListView, wenn GPS Daten enthalten sind, wird die Google Maps Seite zu den Koordinaten aufgerufen

Code: Select all

;https://opencagedata.com/api
OpencagedataKey:="HierDeinPersönlicherApiKey"

FileSelectFile, QuellDatei, , 3, Verzeichnis auswählen

SplitPath,% QuellDatei,,, FileExt

; bilder only
TrueFileExt := "|ani|bmp|gif|ico|jpe|jpeg|jpg|pcx|png|psd|tga|tif|tiff|wmf|"
	If TrueFileExt not contains |%FileExt%| ; bilddatei überprüfung 
	exitapp
	FileRead, File, %QuellDatei%        ; MD5 erzeugen
	FileGetSize, FileSize, %QuellDatei% ; MD5 erzeugen
	MD5Needle := Calc_MD5(&File,FileSize)   ; MD5 erzeugen
	xListeFiles := MD5Needle ";" QuellDatei
	

;FileDelete, xListeFiles.txt
;FileAppend, % xListeFiles, xListeFiles.txt
;Run xListeFiles.txt

	SessionIDArr  := Object()
	DefaultArr := Object()
	counter := []
	loop, Parse, % xListeFiles, `n, `r
	{	
	Arr:= StrSplit(A_LoopField, ";")
;	if Arr.Length()=2	
	SessionIDArr[Arr[1]] := Arr[1]
	DefaultArr[Arr[1]] := Arr[2]
	counter.Push(Arr[1])
	SessionID.Push(Arr[1])
	SessionID := Arr[1]
	}
;------
	Gui, Add, ListView , w600 r47, ID|PropName|PropValue
	GetGpsDataALLArr := Object()
	GetGpsDatazArr := Object()
	GetGpsDatayArr := Object()
	GetGpsDataxArr := Object()
	loop, Parse, % xListeFiles, `n, `r
	{	
	Arr:= StrSplit(A_LoopField, ";")
	GetGpsDataProps := GetGpsData((Arr[2] ? Arr[2] : Arr[1]))
	For PropName, PropValue In GetGpsDataProps
	{
	SessionID := Arr[1]
	%PropName% := PropValue
	LV_Add("", Arr[1], PropName, PropValue)
	GetGpsDataxArr[Arr[1]] .= (PropName ? PropName : Arr[1])  "`n"
	GetGpsDatayArr[Arr[1]] .= (PropValue ? PropValue : Arr[1]) "`n"
;	GetGpsDatazArr[Arr[1]] .= (PropName ? PropName : Arr[1]) ": " (PropValue ? PropValue : Arr[1]) "`n"
	GetGpsDataALLArr[Arr[1]] .= PropName ": " (PropValue ? PropValue : Arr[1]) "`n"
	; Ergebnis: E29EA86D3DE41EBA638759CD2057D5C5;PropName;PropValue "`n"
	GetGpsDataALLArr[Arr[1]] .= ("GoogleLatLong" ";" GoogleLatLong(Byref Latitude, Byref Longitude)) "`n"
	openataLatLong[Arr[1]] .= ("OpenataLatLong" ";" GoogleLatLong(Byref Latitude, Byref Longitude)) "`n"
	}}

;------
	GetAllDetailszArr := Object()
	GetAllDetailsyArr := Object()
	GetAllDetailsxArr := Object()
	loop, Parse, % xListeFiles, `n, `r
	{	
	Arr:= StrSplit(A_LoopField, ";")
	GetAllDetailsProps := GetAllDetails((Arr[2] ? Arr[2] : Arr[1]))
	For PropName, PropValue In GetAllDetailsProps
	{
	SessionID := Arr[1]
	%PropName% := PropValue
	LV_Add("", Arr[1], PropName, PropValue)
	GetAllDetailsxArr[Arr[1]] .= (PropName ? PropName : Arr[1])  "`n"
	GetAllDetailsyArr[Arr[1]] .= (PropValue ? PropValue : Arr[1]) "`n"
	; Ergebnis: E29EA86D3DE41EBA638759CD2057D5C5;PropName;PropValue "`n"
	GetGpsDataALLArr[Arr[1]] .= PropName ": " (PropValue ? PropValue : Arr[1]) "`n"
	}}
	LV_Add("", SessionIDArr[counter[1]], "ID", SessionIDArr[counter[1]])
	LV_Add("", SessionIDArr[counter[1]], "GoogleLatLong", GoogleLatLong(Byref Latitude, Byref Longitude))
	LV_Add("", SessionIDArr[counter[1]], "OpenataLatLong", openataLatLong(Byref Latitude, Byref Longitude))

	Gui +Resize
	LV_ModifyCol()
	LV_ModifyCol(1, 0)
	LV_ModifyCol(2, 150)
	LV_ModifyCol(3, 440)
	Gui, Show, , Bilder GPS Data

;MsgBox % SessionIDArr[counter[1]]
;MsgBox % DefaultArr[counter[1]]
;msgbox % GoogleLatLong(Byref Latitude, Byref Longitude)
;msgbox % openataLatLong(Byref Latitude, Byref Longitude)

;       https://api.opencagedata.com/geocode/v1/xml?q=-22.6792%2C+14.5272&key=YOUR-API-KEY&pretty=1
;Run, % "https://api.opencagedata.com/geocode/v1/xml?roadinfo=1&pretty=1&q=" GoogleLatLong(Byref Latitude, Byref Longitude) "&key=" OpencagedataKey "&language=de&pretty=1"
;Run, % "https://api.opencagedata.com/geocode/v1/xml?roadinfo=0&pretty=1&q=" openataLatLong(Byref Latitude, Byref Longitude) "&key=" OpencagedataKey "&language=de&pretty=1"
;Run, % "https://www.google.com/search?q=" GoogleLatLong(Byref Latitude, Byref Longitude)
Run, % "https://www.google.com/maps/place/" GoogleLatLong(Byref Latitude, Byref Longitude)
Return
;-------------------------------------------
GetAllDetails(FilePath) {
	MaxGap := 320 ; max 320
	AllDetailsArr := Object()
	SplitPath,% filePath, fileName, dirPath
	Folder := ComObjCreate("Shell.Application").NameSpace(dirPath)
	FolderItem	:= Folder.ParseName(fileName)
	Gap := 0
	While (Gap < MaxGap)
		If (Value := Folder.GetDetailsOf(FolderItem, A_Index - 1))
			{
			If InStr(Value, "Verfügbar") ; wichtig, sonst Fehler bei [%PropName% := PropValue]
			Continue ; wichtig, sonst Fehler bei [%PropName% := PropValue]
			xPropName := StrReplace(Folder.GetDetailsOf(0, A_Index - 1), A_Space, "")
			xPropName := RegExReplace(xPropName,"(*UCP)[^\w\h\.]") ; wichtig, sonst Fehler bei [%PropName% := PropValue]
			TrueProps := "|Erstelldatum|
				. |Größe|
				. |Elementtyp|
				. |Änderungsdatum|
				. |Letzter Zugriff|
				. |Attribute|
				. |Erkannter Typ|
				. |Art|
				. |Aufnahmedatum|
				. |Bewertung|
				. |Kameramodell|
				. |Abmessungen|
				. |Kamerahersteller|
				. |Programmname|
				. |Erfassungsdatum|
				. |Dateierweiterung|
				. |Dateiname|
				. |Bittiefe|
				. |Horizontale Auflösung|
				. |Breite|
				. |Vertikale Auflösung|
				. |Höhe|
				. |Freigegeben|
				. |Ordnername|
				. |Ordnerpfad|
				. |Ordner|
				. |Pfad|
				. |EXIF-Version|
				. |Belichtungsprogramm|
				. |Belichtungszeit|
				. |Blendenzahl|
				. |Blitzlichtmodus|
				. |Brennweite|
				. |ISO-Filmempfindlichkeit|
				. |Messmodus|
				. |Ausrichtung|
				. |Programmmodus|
				. |Weißausgleich|
				. |Freigabestatus|"
			schleuse := "|" Folder.GetDetailsOf(0, A_Index - 1) "|"
			If TrueProps not contains %schleuse%
			continue
			AllDetailsArr[xPropName] := Value
			props .= Folder.GetDetailsOf(0, A_Index - 1) " `n "
			}
	  Else
		 Gap++
	Return AllDetailsArr
	}
;--------
openataLatLong(Byref Latitude, Byref Longitude){
xLatitude := Latitude
xLongitude := Longitude
	Latitude :=  StrSplit(Latitude, A_Space, ",")
	Longitude := StrSplit(Longitude, A_Space, ",")
	LatitudeArr :=  StrSplit(Latitude.3, ".")
	Latitude3Arr := LatitudeArr.1 ";" LatitudeArr.2 ";" 
	LongitudeArr :=  StrSplit(Longitude.3, ".")
	Longitude3Arr := LongitudeArr.1 ";" LongitudeArr.2 ";" 

	openataBreitengrad :=    Ceil(Latitude.1) "."
			. Ceil(Latitude.2)
			. LatitudeArr.1
			. SubStr(LatitudeArr.2, 1, 1) "%2C+"  

	openataLaengengrad :=    Ceil(Longitude.1) "."
			. Ceil(Longitude.2)
			. LongitudeArr.1
			. SubStr(LongitudeArr.2, 1, 1)

Return openataBreitengrad openataLaengengrad
;MsgBox % GetGpsDataALLArr[SessionID]
}
;--------
GoogleLatLong(Byref Latitude, Byref Longitude){
xLatitude := Latitude
xLongitude := Longitude
	Latitude :=  StrSplit(xLatitude, A_Space, ",")
	Longitude := StrSplit(xLongitude, A_Space, ",")
	LatitudeArr :=  StrSplit(Latitude.3, ".")
	Latitude3Arr := LatitudeArr.1 ";" LatitudeArr.2 ";" 
	LongitudeArr :=  StrSplit(Longitude.3, ".")
	Longitude3Arr := LongitudeArr.1 ";" LongitudeArr.2 ";" 

	Breitengrad :=    Ceil(Latitude.1) "%C2%B0"
			. Ceil(Latitude.2) "'" 
			. LatitudeArr.1 "." 
			. SubStr(LatitudeArr.2, 1, 1) "%22N+"  

	Laengengrad :=    Ceil(Longitude.1) "%C2%B0"
			. Ceil(Longitude.2) "'" 
			. LongitudeArr.1 "." 
			. SubStr(LongitudeArr.2, 1, 1) "%22E"  

Return Breitengrad Laengengrad
;MsgBox % GetGpsDataALLArr[SessionID]
}
;-------------------------------------------
GetGpsData(FilePath) {
   Local
   ; Namespace: "System.GPS."
   Static GpsProps := ["Latitude" , "Longitude"]
   SplitPath, FilePath, FileName , FileDir
   If (FileDir = "")
      FileDir := A_WorkingDir
   Props := {}
   If (SFI := ComObjCreate("Shell.Application").NameSpace(FileDir).ParseName(FileName)) {
      For Each, PropName In GpsProps {
         PropVal := SFI.ExtendedProperty("System.GPS." . PropName)
         If IsObject(PropVal) {
            If (ComObjType(PropVal) & 0x2000) { ; VT_ARRAY
               Values := ""
               For Value In PropVal
                  Values .= Value . ", "
               Props[PropName] := RTrim(Values, ", ")
            }
         }
         Else If (PropVal <> "")
            Props[PropName] := PropVal
      }
   }
   Return Props
}
;-------------------------------------------
; https://autohotkey.com/board/topic/77408-md5-function-for-comparing-images/
Calc_MD5(_VarAddress, _VarSize){
	Static Hex = "123456789ABCDEF0"
	Ptr := A_PtrSize ? "Ptr" : "Uint"
	, VarSetCapacity(MD5_CTX,104,0)
	, DllCall("advapi32\MD5Init",Ptr,&MD5_CTX)
	, DllCall("advapi32\MD5Update",Ptr,&MD5_CTX,Ptr,_VarAddress,"UInt",_VarSize)
	, DllCall("advapi32\MD5Final",Ptr,&MD5_CTX)
	Loop,16
	N := NumGet( MD5_CTX,87+A_Index,"Char"), MD5 .= SubStr(Hex,N>>4,1) . SubStr(Hex,N&15,1)
	Return MD5
}

2020-10-18 at 06.32.16.jpeg
2020-10-18 at 06.32.16.jpeg (81.1 KiB) Viewed 1229 times

Mit einem API Key von https://opencagedata.com/api kommt allerdings noch einiges an Daten und Möglichkeiten dazu
Spoiler
Ich habe diese API schon früher für ein anderes Projekt genutzt, da brauchte ich jedoch nur wenige Informationen aus dem File.

Die Struktur des XML Files ist leider nicht immer gleich, wenn die Koordinaten auf eine Adresse zeigen, an der z.B. ein Ärztehaus, Botschaft oder Firmengelände wo mehrere große Firmen ansässig sind, werden erheblich mehr Standortdaten zurück gegeben.

Daher wäre es wohl sinnvoll einmal in diese große Runde zu fragen, ob es schon fertigen Code gibt, mit dem man die Daten des dynamischen XML Files einlesen kann
effel
Posts: 542
Joined: 16 Jan 2018, 13:34

Re: ListView Frage'n

18 Oct 2020, 06:28

BoBo wrote:
18 Oct 2020, 04:38
PS. wird GoogleLatLong/OpenataLatLong noch decoded?
Hallo BoBo, meinst du das?
Ich übergebe an google "https://www.google.com/maps/place/" GoogleLatLong(Byref Latitude, Byref Longitude)
;Ergebnis: https://www.google.com/maps/place/50%C2%B019'58.8%22N+6%C2%B056'21.0%22E
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: ListView Frage'n

18 Oct 2020, 08:40

JaNeIsKlar, doch du wirst die beiden von Google encodeten Links vor finaler Übergabe in das ListView-Control (also noch vor Anzeige in der Gui) wieder decodieren, oder?
effel
Posts: 542
Joined: 16 Jan 2018, 13:34

Re: ListView Frage'n

18 Oct 2020, 10:43

Hallo BoBo,
stehe volle Kanne auf dem Schlauch :roll:
ich hoffe du meinst......

Von Google bekomme ich in diesem Script weder Daten zum decodieren noch zum codieren.
Damit fange ich jetzt erst an, weil in der Maps Ansicht auch einige Daten zum extrahieren sind.

Ich lese nur mit Just Me´s Code die Daten der Bilder aus und aus diesen Daten generiere ich den Content den du in der Listview siehst.

Die Google Maps Seite kommt erst zum Schluss, weil ich dann die GPS Daten mit:

Code: Select all

GoogleLatLong(Byref Latitude, Byref Longitude){
xLatitude := Latitude
xLongitude := Longitude
	Latitude :=  StrSplit(xLatitude, A_Space, ",")
	Longitude := StrSplit(xLongitude, A_Space, ",")
	LatitudeArr :=  StrSplit(Latitude.3, ".")
	Latitude3Arr := LatitudeArr.1 ";" LatitudeArr.2 ";" 
	LongitudeArr :=  StrSplit(Longitude.3, ".")
	Longitude3Arr := LongitudeArr.1 ";" LongitudeArr.2 ";" 

	Breitengrad :=    Ceil(Latitude.1) "%C2%B0"
			. Ceil(Latitude.2) "'" 
			. LatitudeArr.1 "." 
			. SubStr(LatitudeArr.2, 1, 1) "%22N+"  

	Laengengrad :=    Ceil(Longitude.1) "%C2%B0"
			. Ceil(Longitude.2) "'" 
			. LongitudeArr.1 "." 
			. SubStr(LongitudeArr.2, 1, 1) "%22E"  
Return Breitengrad Laengengrad
bereitgestellt bekomme.

Jetzt geht es erstmal an die Daten die Google zu den Koordinaten zur Verfügung stellt

Beispiel: https://www.google.com/maps/place/50%C2%B019'58.8%22N+6%C2%B056'21.0%22E
dort findest du "Ahrweiler, 53520"

Code: Select all

;gurl := "https://www.google.com/maps/place/50%C2%B019'58.8%22N+6%C2%B056'21.0%22E"
;FileDelete, gurl.txt
;UrlDownLoadToFile, % gurl, gurl.txt
FileRead, gurl, gurl.txt
;MsgBox % gurl

Needle := FindHTMLString(gurl)
FileAppend, % needle, Findstring.txt
;MsgBox % needle

	FindHTMLString(xquelle){
	Bevor="50°19'58.8`\"N 6°56'21.0`\"E","
	Behind=","https://maps.google.
	xneedle:=xStr(xquelle,,Bevor,Behind)
MsgBox % Bevor "`n" Behind
MsgBox % xneedle
	Return xneedle
	}

/* ; Line:202
,["50°19'58.8\"N 6°56'21.0\"E","Ahrweiler, 53520","https://maps.google.com/maps/api/staticmap?center\u003d50.333%2C6.9391667\u0026zoom\u003d16\u0026size\u003d256x256\u0026language\u003den\u0026markers\u003d50.333%2C6.9391667\u0026sensor\u003dfalse\u0026client\u003dgoogle-maps-frontend\u0026signature\u003dWrd7WwH013gxGtBGMU4QGSnysgg",[256,256]
*/

xStr(ByRef H, C:=0, B:="", E:="",ByRef BO:=1, EO:="", BI:=1, EI:=1, BT:="", ET:="") {                           
Local L, LB, LE, P1, P2, Q, N:="", F:=0                 ; xStr v0.97 by SKAN on D1AL/D343 @ tiny.cc/xstr  
Return SubStr(H,!(ErrorLevel:=!((P1:=(L:=StrLen(H))?(LB:=StrLen(B))?(F:=InStr(H,B,C&1,BO,BI))?F+(BT=N?LB
:BT):0:(Q:=(BO=1&&BT>0?BT+1:BO>0?BO:L+BO))>1?Q:1:0)&&(P2:=P1?(LE:=StrLen(E))?(F:=InStr(H,E,C>>1,EO=N?(F
?F+LB:P1):EO,EI))?F+LE-(ET=N?LE:ET):0:EO=N?(ET>0?L-ET+1:L+1):P1+EO:0)>=P1))?P1:L+1,(BO:=Min(P2,L+1))-P1)  
}
Das will irgenwie nicht. ich glaube ich mache mal einen Tag Pause 🤣
effel
Posts: 542
Joined: 16 Jan 2018, 13:34

Re: ListView Frage'n

18 Oct 2020, 11:10

so gehts...
es lag am °
escapen nutzt wohl auch nichts

dann kann ich ja doch weitermachen 😉

Code: Select all

	FindHTMLString(xquelle){
	Bevor=56'21.0\"E","
	Behind=","https://maps.google.
	xneedle:=xStr(xquelle,,Bevor,Behind)
MsgBox % Bevor "`n" Behind
MsgBox % xneedle
	Return xneedle
	}
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: ListView Frage'n

19 Oct 2020, 06:25

Moin,

das Problem mit dem ° liegt daran, dass es in der Datei UTF-8 codiert ist (wie in Deiner Anfrage). Mit FileRead, gurl, *P65001 gurl.txt lässt sich das lösen.

Zur Funktion GetAllDetails() muss ich Folgendes anmerken:

Code: Select all

GetAllDetails(FilePath) {
	MaxGap := 320 ; max 320
	AllDetailsArr := Object()
	SplitPath,% filePath, fileName, dirPath
	Folder := ComObjCreate("Shell.Application").NameSpace(dirPath)
	FolderItem	:= Folder.ParseName(fileName)
	Gap := 0
	While (Gap < MaxGap)
	...
MaxGap habe ich mal erfunden, weil ich beim Testen festgestellt habe, dass die unterschiedlichen Windowsversionen unterschiedlich viele Eigenschaften liefern, deren konkrete Anzahl ich nicht abfragen konnte. Zwischendurch wurde auch immer mal wieder für einen Index kein Name zurückgeliefert. Die größte von mir erkannte 'Lücke' zwischen zwei Indices mit Namen war damals wohl 8 oder 10. Ich habe deshalb MaxGap (maximale Lücke) auf 12 gesetzt, um damit das Ende der Abfrageschleife bestimmen zu können. Der in Deiner Version enthaltene Wert von 320 macht keinen Sinn. Das ist die wohl immer noch aktuelle Anzahl der Eigenschaften.

Ansonsten weiß ich im Augenblick nicht, wo es konkret hingehen soll. Ich halte mich deshalb erst mal zurück.
effel
Posts: 542
Joined: 16 Jan 2018, 13:34

Re: ListView Frage'n

19 Oct 2020, 10:13

just me wrote:
19 Oct 2020, 06:25
MaxGap := 320 ; max 320
Hallo Just Me, danke für Deine Zeit. Ich habe eine andere Anordnung und wusste nicht wo ich in meinem Code das , Gap := 0 aus der Zeile props .= A_Index - 1 " : " Value " `n ", Gap := 0 wieder einpflegen muss.

Wenn ich den Wert mit dem aktuellen Code verringere, bekomme ich nicht mehr alle Daten angezeigt.

Vielleicht liegt es ja daran, dass das durchsuchen der Datei mit meinem LowCost Rechner 5 Sekunden dauert. 😒

Gestern habe ich beim stöbern folgenden Code gefunden und dachte das wäre die richtige Vorlage, um ListView zu lernen.
https://www.autohotkey.com/boards/viewtopic.php?p=358666#p358666
Hier einer meiner Versuche mit zwei ListView zu hantieren:

Code: Select all

Bilder := {Bild1a: "Bild1a.jpg"
		, Bild1b: "Bild1b.jpg"
		, Bild2a: "Bild2a.jpg"
		, Bild2b: "Bild2b.jpg"
		, Bild3a: "Bild3a.jpg"}

; erstelle Hilfs-Array mit zufälliger Reihenfolge
for key, value in Bilder 
{
	order .= key "`n"
	LV_Add("", key, value)
	Gui +Resize
	LV_ModifyCol()
	LV_ModifyCol(1, 200)
; msgbox % A_DefaultListView

}
order := RTrim(order, "`n") ; remove last one on the right
Sort order, Random
order := StrSplit(order, "`n")

; überprüfe zufällige Reihenfolge
for idx, elem in order
	Gui, Add, ListView , w600 r5, ID|aa|bb
	Gui, ListView, ListViewName2
	LV_Add("", idx, elem ".jpg")
	Gui +Resize
	LV_ModifyCol()
	LV_ModifyCol(1, 200)
	Gui, Show, , Bilder GPS Data

; msgbox % Bilder[elem]
; msgbox % A_DefaultListView
knapp vorbei ist auch daneben

Wie du sehen kannst, habe ich es noch nicht richtig verstanden aber es fühlt sich schon mal gut an 😊
effel
Posts: 542
Joined: 16 Jan 2018, 13:34

Re: ListView Frage'n

19 Oct 2020, 10:29

just me wrote:
19 Oct 2020, 06:25
das Problem mit dem ° liegt daran, dass es in der Datei UTF-8 codiert ist (wie in Deiner Anfrage). Mit FileRead, gurl, *P65001 gurl.txt lässt sich das lösen.
Das habe ich so gelöst:

Code: Select all

Laengengrad :=    Ceil(Longitude.1) Chr(176) 
			. Ceil(Longitude.2) "'" 
			. LongitudeArr.1 "." 
			. SubStr(LongitudeArr.2, 1, 1) "\" Chr(34) "E"  Chr(34) Chr(44) Chr(34)
just me wrote:
17 Oct 2020, 04:31
das war eine unerwartet lange Antwort.
Als Anfänger war es für mich immer am lehrreichsten, wenn der Verfasser seinen Post so ausführlich wie möglich beschreibt. Dann denke ich, es ist sicher nerviger wenn ich für alle Anliegen einen extra Topic öffne.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 25 guests