ListView Frage'n

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: ListView Frage'n

Re: ListView Frage'n

Post by just me » 13 Nov 2020, 05:09

Moin,

ich gehe mal davon aus, dass Du den ListViews auch ein +LV0x00010000 verpasst hast. Sonst würde mich wundern, warum sich etwas geeändert haben sollte. Ein Tab/Tab2/Tab3 Control kann mit dieser Option nichts anfangen. In AHK 1.1 wird dieser 'Fehler' aber stillschweigend ignoriert.

DropDownList und ComboBox Controls unterstützen keine Mehrfachauswahl. Das mag daran liegen, dass die Auswahl in einem separaten einzeiligen Bereich angezeigt wird. Einfache ListBox Controls können das aber.

Wenn ich mir Dein letztes Beispiel so anschaue, verwendest Du wirklich vvVarname und ggLabel bei der Definition der Steuerelemente? Für mich sieht das immer merkwürdig aus und drängt den Eindruck auf, dass jemand vergessen hat, das v wegzulassen. In jedem Fall sollte der Block

Code: Select all

GuiControlGet, vPersonen,, vPersonen
GuiControlGet, vOrte,, vOrte
GuiControlGet, vEreignisse,, vEreignisse
GuiControlGet, vGegenstaende,, vGegenstaende
GuiControlGet, vFileAssociation,, vFileAssociation
GuiControlGet, vUrlaub,, vUrlaub
überflüssig sein. Das hat das

Code: Select all

Gui, Submit, nohide
bereits erledigt Und wenn der Controlname und der Name der Ausgabevariablen identisch sind, reicht ein

Code: Select all

GuiControlGet, vOrte

Re: ListView Frage'n

Post by effel » 12 Nov 2020, 16:35

just me wrote:
09 Nov 2020, 05:16
+LV0x00010000
Danke Just Me, meine Tab Config:

Code: Select all

Gui, Add, Tab3, w%tWW% h%tHH% Buttons +LV0x00010000 gTab3 vResizeTab, Allgemein|Ansicht|Fotos labeln||Label verwalten|Suchen|Exportieren|Importieren|Einstellungen
Seit ich es so einstellte läuft es täglich und einwandfrei.


Kann ich in einer DDL mit der Maus eine Auswahl treffen und dabei z.B. die Strg + Maustaste auswerten?

Ich möchte damit erreichen, dass wenn ich mit Strg+Click auf ein Kind klicke, damit dann alle Kinder, Tick Trick und Track im ListView geladen werden.

m2.jpg
m2.jpg (90.77 KiB) Viewed 118 times

Code: Select all

gUrlaub:
gPersonen:
gOrte:
gEreignisse:
gGegenstaende:
gFileAssociation:

Gui, Submit, nohide

Gui, ListView, ListViewName1
AktuelleListView1Auswahl := AusWahlFeldHolen(3)
Gui, ListView, ListViewName2
AktuelleListView2Auswahl := AusWahlFeldHolen(3)

GuiControlGet, vPersonen,, vPersonen
GuiControlGet, vOrte,, vOrte
GuiControlGet, vEreignisse,, vEreignisse
GuiControlGet, vGegenstaende,, vGegenstaende
GuiControlGet, vFileAssociation,, vFileAssociation
GuiControlGet, vUrlaub,, vUrlaub

Gui, ListView, ListViewName3
If !InStr(vPersonen,"...")
LV_Add("", SessionID, "Personen", vPersonen)

If !InStr(vOrte,"...")
LV_Add("", SessionID, "Orte", vOrte)

If !InStr(vEreignisse,"...")
LV_Add("", SessionID, "Ereignisse", vEreignisse)

If !InStr(vGegenstaende,"...")
LV_Add("", SessionID, "Gegenstaende", vGegenstaende)

If !InStr(vFileAssociation,"...")
LV_Add("", SessionID, "FileAssociation", vFileAssociation)

If !InStr(vUrlaub,"...")
LV_Add("", SessionID, "Urlaub", vUrlaub)


ResetLabelAuswahl()


MsgBox,,, % "Ereignisse:`t" Ereignisse "`n"
			. "GuiControlGet:`n`n" 
			. "LabelPersonen`t`t" LabelPersonen "`t" vPersonen "`n" 
			. "LabelOrte`t`t" LabelOrte "`t" vOrte "`n" 
			. "LabelEreignisse`t`t" LabelEreignisse "  `t" vEreignisse "`n" 
			. "LabelGegenstaende`t" LabelGegenstaende "`t" vGegenstaende "`n" 
			. "LabelFileAssociation`t`t" LabelFileAssociation " `t" vFileAssociation "`n`n" 
			. "LabelUrlaub`t`t" LabelUrlaub " `t" vUrlaub "`n`n" 
			. "AktuelleListView1Auswahl: " AktuelleListView1Auswahl "`n"
			. "AktuelleListView2Auswahl: " AktuelleListView2Auswahl "`n"
			. "A_EventInfo:`t" A_EventInfo "`n"
			. "ErrorLevel:`t" ErrorLevel "`n"
			. "X:`t" IDPersonen "`n"
			. "Y:`t" Y "`n"
			. "A_GuiX:`t" A_GuiX "`n"
			. "A_GuiY:`t" A_GuiY "`n"
			. "A_GuiEvent:`t" A_GuiEvent "`n"
			; . "A_LineFile:`t" A_LineFile "`n"
			. "A_LineNumber:`t" A_LineNumber "`n"
			. "A_ThisFunc:`t" A_ThisFunc "`n"
			. "A_ThisLabel:`t" A_ThisLabel "`n"
			. "AusWahlFeldHolen(1):`t" AusWahlFeldHolen(1) "`n"
			. "AusWahlFeldHolen(2):`t" AusWahlFeldHolen(2) "`n"
			. "AusWahlFeldHolen(3):`t" AusWahlFeldHolen(3) "`n"
		;	. AusWahlFeldHolen(1) " - " AusWahlFeldHolen(2) " - " AusWahlFeldHolen(3) "`n"
			. "LV_GetCount():`t" LV_GetCount() "`n"
			. "LV_GetText():`t" LV_GetText(null,3) "`n"
			. "LV_GetCount(Column):`t" LV_GetCount("Column"), 1
Return

Re: ListView Frage'n

Post by just me » 09 Nov 2020, 05:16

Hallo effel!
effel wrote:hallo Just Me, danke das war der Fehler, ...
Dann war es nicht Dein Fehler.

Wenn es Dir nicht zu viel Mühe bereitet, kannst Du mal versuchen, auf Tab3 zurückzugehen und den ListViews den extended list-view style +LV0x00010000 (LVS_EX_DOUBLEBUFFER) zuzuweisen? Wenn der Fehler damit verschwindet, wäre es ein praktikabler Workaround.

Re: ListView Frage'n

Post by effel » 09 Nov 2020, 03:23

ich habs... https://autohotkey.com/board/topic/32212-how-to-select-a-tab-i-created-in-my-gui/

GuiControl , Choose , systabcontrol321 , 2

Re: ListView Frage'n

Post by effel » 08 Nov 2020, 17:51

hallo Just Me, danke das war der Fehler,

ich habe auf tab2 umgestellt und nun funktioniert es wie gewünscht.

Eine Frage noch

wie kann ich durch klick auf einen Button den Tab wechseln, also das gleiche wie auf den gewünschten Tab klicken?

Re: ListView Frage'n

Post by just me » 08 Nov 2020, 05:03

Moin effel,

auf den Abbildungen sehe ich nur, dass den ListView-Controls die Rahmen und teilweise die Hintergrundfarbe fehlen. Ich kann mich schwach daran erinnern, so etwas schon mal gesehen zu haben. Es hat meiner Meinung nach damit zu tun, dass unter bestimmten Bedingungen nicht alle Teile des Controls neu gezeichnet werden. Wenn Du ein Tab3-Control hast, könntest Du mal versuchen, ob dieser Fehler mit Tab2/Tab auch auftritt.

Re: ListView Frage'n

Post by effel » 07 Nov 2020, 11:30

Danke Just Me, GUI ist sehr umfangreich. Darüber könnte man eine ganze Abhandlung schreiben. Dank der Hilfe auf Github konnte ich meinen Code bisher ohne weitere Fragen bearbeiten.

Jetzt habe ich ab und zu ein GUI-defekt.
Wenn ich die GUI aus der Taskleiste wieder hervor klicke, verliert die Listview Elemente.

b.jpg
b.jpg (57.72 KiB) Viewed 276 times

Wenn ich dann den Tab wechsele und wieder zurückkehre, ist der Fehler behoben.

a.jpg
a.jpg (48.57 KiB) Viewed 276 times

Re: ListView Frage'n

Post by just me » 30 Oct 2020, 04:55

Moin,

GuiDropFiles():
In AHK 1.1 gibt es sowohl in der Subroutine als auch der Funktion die Variable A_GuiControl. Wenn Du dem Button einen Namen gibst, wie z.B. vBtnWeiter, kannst Du für die Prüfung diesen Namen nutzen:

Code: Select all

GuiDropFiles(GuiHwnd, DateiArray, ElementHwnd, X, Y) {
	If (A_GuiControl = "BtnWeiter") {
		...
	}
}


r Option:
Diese Option kann nur beim Erstellen des Controls genutzt werden. Spätere Änderungen funktionieren nur noch per h Option. Ich verstehe immer noch nicht, unter welchen Umständen Du die Größe ändern willst.

Re: ListView Frage'n

Post by effel » 29 Oct 2020, 17:13

so gehts...

If (x >= 532 And x <= 604 And y >= 56 And y <= 122)

Re: ListView Frage'n

Post by effel » 29 Oct 2020, 13:09

ich schon wieder,
ich möchte eine Datei auf die Koordinate des Buttons "Weiter" dropen, die MsgBox erscheint aber auch im gelben Bereich

Code: Select all

GuiDropFiles(GuiHwnd, DateiArray, ElementHwnd, X, Y) {
    for i, Datei in DateiArray
	if x between 532 and 604 and y between 56 and 122 ; weiter button
;	if (x between 532 and 602) && (y between 56 and 122)
;	if ((x between 532 and 604) and (y between 56 and 122))
	{
        MsgBox Datei %i% ist:`n%Datei%`n%x%`n%y%`n%GuiHwnd%`n%ElementHwnd%
;	clipboard := x "`n" y "`n"
	}
}
/*
532=x oben links
604=x oben rechts
56=y oben rechts
122=y unten rechts
Gui, Add, Button, x532 y29 w70 h70 gACTION_1, Weiter
*/
2020-10-29 at 18.14.20.jpeg
2020-10-29 at 18.14.20.jpeg (43.54 KiB) Viewed 330 times

Re: ListView Frage'n

Post by effel » 28 Oct 2020, 13:04

Ich habe mich leider zu verworren ausgedrückt, sorry aber das passiert schon mal.

Ich wollte nur wissen wie ich eine einmal mit Gui, Add, ListView, w500 r%GuiRow% gMeineListView... festgelegte GuiRow Variable nachträglich verändern kann, bzw. ob das überhaupt geht.


zu GuiRows := GpsDetails.Count() + FileDetails.Count() bleibt nur zu sagen, das mir grade die Worte fehlen 😊

Ich hatte das Pferd von hinten aufgezäumt, weil der Grundgedanke war der Ternary zu GuiRow := (GuiRows>40?40:GuiRows+1)
und nicht das zählen. Da sah ich viele Bäume und wenig Wald.

Code: Select all


	GpsDetails := GetGpsData(QuellDatei)
	FileDetails := GetFileDetails(QuellDatei, GetDetailIndex(PropNames))
	GuiRows := GpsDetails.Count() + FileDetails.Count()
	GuiRow := (GuiRows>40?40:GuiRows+1) ; MaximaleMengeSpalten

	Gui, Margin, 2, 2
	Gui, Add, ListView, w500 r%GuiRow% gMeineListView vvMeineListView2 vListViewName1 Grid cBlack BackgroundFFDD99, ID|PropName|PropValue
	Gui, ListView, ListViewName1

	for i, x in FileDetails
	{
	%i% := x
	SaveAll .= SessionID ";" StrReplace(i, A_Space, "") ";" x "`n"
	LV_Add("", SessionID, i, x)
	}

	for i, x in GpsDetails
	{
	%i% := x
	SaveAll .= SessionID ";" StrReplace(i, A_Space, "") ";" x "`n"
	LV_Add("", SessionID, i, x)
	}

	LV_Add("", SessionID, "ID", SessionID) ; GuiRow +1

	if (xLongitude(Longitude)) and (xLatitude(Latitude))
	{
	Längengrad  := xLongitude(Longitude)
	Breitengrad := xLatitude(Latitude)

	LV_Add("", SessionID, "Längengrad", xLongitude(Longitude)) ; GuiRow +1
	LV_Add("", SessionID, "Breitengrad", xLatitude(Latitude)) ; GuiRow +1
	LV_Add("", SessionID, "GoogleMaps", "https://www.google.com/maps/place/" GoogleLatLong(Latitude, Longitude)) ; GuiRow +1
	LV_Add("", SessionID, "Openata", openataLatLong(Latitude, Longitude)) ; GuiRow +1
	Opencagedata := "https://api.opencagedata.com/geocode/v1/xml?roadinfo=1&pretty=1&q=" GoogleLatLong(Latitude, Longitude) "&key=" OpencagedataKey "&language=de&pretty=1"
	LV_Add("", SessionID, "Opencagedata", Opencagedata) ; GuiRow +1
	SaveAll .= (SessionID ";" "Openata" ";" openataLatLong(Latitude, Longitude)) "`n"
	SaveAll .= (SessionID ";" "Längengrad" ";" xLongitude(Longitude)) "`n"
	SaveAll .= (SessionID ";" "Breitengrad" ";" xLatitude(Latitude)) "`n"
	SaveAll .= (SessionID ";" "GoogleMaps" ";" "https://www.google.com/maps/place/" GoogleLatLong(Latitude, Longitude)) "`n"
	}

	Sort, SaveAll
	FileDelete, % SessionID ".txt"
	FileAppend, % SaveAll, % SessionID ".txt"
	;run % SessionID ".txt"

	LV_ModifyCol(2, "sort")
	LV_ModifyCol()
;	LV_ModifyCol(1, 230)
	LV_ModifyCol(1, 30)
	LV_ModifyCol(2, 130)
	LV_ModifyCol(3, 310)
	Menu, MeinKontextmenue, Add, Öffnen, Oeffnen
	Menu, MeinKontextmenue, Add, Copy, Copy
;	Gui, Show, h800 w1479, FileInfos: %GuiRows%  -  ID: %SessionID%
	Gui, Show, w1479, FileInfos: %GuiRows%  -  ID: %SessionID%

Return

; ....


;--------------
xLatitude(Byref Latitude){
	xLatitude      := StrSplit(Latitude, A_Space, ",")
	xLatitudeArr   := StrSplit(xLatitude.3, ".")

	Breitengrad :=    Ceil(xLatitude.1) "." 
			. Ceil(xLatitude.2)
			. xLatitudeArr.1
			. SubStr(xLatitudeArr.2, 1, 1)
Return Breitengrad
}

;--------------
xLongitude(Byref Longitude){
	xLongitude     := StrSplit(Longitude, A_Space, ",")
	xLongitudeArr  := StrSplit(xLongitude.3, ".")

	Laengengrad :=    Ceil(xLongitude.1) "." 
			. Ceil(xLongitude.2)
			. xLongitudeArr.1
			. SubStr(xLongitudeArr.2, 1, 1)
Return Laengengrad
}


Wenn GPS Daten vorhanden sind, erzeuge ich den link zur Maps Webseite oder z.B. zu api.opencagedata.com.

Das sind aktuell GuiRow +5

Die XML Antwort von opencagedata hat nochmal etliche Infos, welche ich noch auslesen möchte, für all diese neuen Daten muss ich nachträglich die GuiRow´s ändern.

Und die Daten von api.opencagedata.com sind nicht Statisch. Je nach Location kommen schon mal doppelt so viele Daten zurück.

Wenn das zu stressig wird, baue ich den Code so um das es passt, aber wenn mein Wunschgedanke war, dass es nur ein Einzeiler ist mit dem ich die Rows in einer ListView nachträglich ändern kann

Ich wünsche euch allen einen schönen Abend

2020-10-28 at 19.21.49.jpeg
2020-10-28 at 19.21.49.jpeg (103.02 KiB) Viewed 347 times

Re: ListView Frage'n

Post by just me » 28 Oct 2020, 11:43

Moin,

Dein Problem bleibt für mich etwas unklar. Ich verstehe nicht, was Du da innerhalb der Funktionen zählst.

Code: Select all

GuiRows := GpsDetails.Count() + FileDetails.Count()
sollte die Anzahl der Zeilen korrekt liefern.

Die r (rows) Option kennt kein +1. Wenn Du 1 Zeile zugeben möchtest, musst Du die vorher zu GuiRows addieren oder für alle Optionen die Ausdrucksschreibweise verwenden.


Code: Select all

FileDetails := GetFileDetails(QuellDatei, GetDetailIndex(PropNames))
verstehe ich nicht. Nachdem Du oben bereits

Code: Select all

Details := GetDetailIndex(PropNames)
aufgerufen hast, sollte es

Code: Select all

FileDetails := GetFileDetails(QuellDatei, Details)
sein.

Re: ListView Frage'n

Post by effel » 27 Oct 2020, 17:26

doppelt gelöscht

Re: ListView Frage'n

Post by effel » 27 Oct 2020, 12:58

Hallo,

ich übergebe GuiRows mit Byref und zähle so die Ereignisse.

Muss jedoch die folgenden Adds mit-zählen und händig eintragen.

Besser wäre es wenn ich die Zeilen vor dem Gui Show nochmal ändern/aktualisieren könnte.


Auf https://ahkde.github.io/docs/commands/Gui.htm finde ich zu der r- Option nicht das passende

Für einen Tipp wäre ich dankbar 😁

Code: Select all

	GuiRows := 0
	GpsDetails := GetGpsData(QuellDatei, GuiRows)
	FileDetails := GetFileDetails(QuellDatei, GetDetailIndex(PropNames), GuiRows)

	GuiRow := (GuiRows>40?40:GuiRows+5) ; MindestMengeSpalten

	SaveAll .= SessionID ";" "ID" ";" SessionID "`n"
		Gui, Add, ListView, w500 r%GuiRow%+1 gMeineListView vvMeineListView2 vListViewName1 Grid cBlack BackgroundFFDD99, ID|PropName|PropValue

Re: ListView Frage'n

Post by effel » 25 Oct 2020, 20:00

Danke Just Me, jetzt läuft es unter einer Sekunde :-)

Code: Select all

;https://www.autohotkey.com/boards/viewtopic.php?p=359771#p359771
#SingleInstance force
#NoEnv
FileEncoding, UTF-8
SetKeyDelay 20
SetTitleMatchMode, 2

FileSelectFile, QuellDatei, , 3, Verzeichnis auswählen

PropNames := "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"

Details := GetDetailIndex(PropNames)

GetDetailIndex(PropNames) {
   Static MaxGap := 12
   Props := {}
   For I, V In StrSplit(PropNames, "|")
      Props[V] := ""
   Shell := ComObjCreate("Shell.Application")
   Folder := Shell.NameSpace(0)
   Details := []
   Gap := 0
   While (Gap < MaxGap) {
      PropIndex := A_Index - 1
      If (PropName := Folder.GetDetailsOf(0, PropIndex)) {
         If Props.HasKey(PropName)
            Details[PropIndex] := PropName
         Gap := 0
      }
      Else
         Gap++
   }
   Return Details
}

	SessionIDArr  := Object()
	FileRead, File, %QuellDatei%        ; MD5 erzeugen
	FileGetSize, FileSize, %QuellDatei% ; MD5 erzeugen
	MD5Needle := Calc_MD5(&File,FileSize)   ; MD5 erzeugen
	MD5FileVar := MD5Needle ";" QuellDatei
	Arr:= StrSplit(MD5FileVar, ";")
	SessionIDArr[Arr[1]] := Arr[1]
	SessionID := Arr[1]

GpsDetails := GetGpsData(QuellDatei)
FileDetails := GetFileDetails(QuellDatei, GetDetailIndex(PropNames))

Gui, Add, ListView, w500 r30 vListViewName1, ID|PropName|PropValue
Gui, ListView, ListViewName1

for i, x in FileDetails
{
SaveAll .= SessionID ";" StrReplace(i, A_Space, "") ";" x "`n"
LV_Add("", SessionID, i, x)
}

for i, x in GpsDetails
{
SaveAll .= SessionID ";" StrReplace(i, A_Space, "") ";" x "`n"
LV_Add("", SessionID, i, x)
}
FileDelete, % SessionID ".txt"
FileAppend, % SaveAll, % SessionID ".txt"

;run % SessionID ".txt"

	LV_ModifyCol()
;	LV_ModifyCol(1, 230)
	LV_ModifyCol(1, 0)
	LV_ModifyCol(2, 150)
	LV_ModifyCol(3, 320)
	Gui, Show, , Bilder GPS Data
Return

GetFileDetails(FilePath, Details) {
   DetailsArr := {}
   SplitPath,% FilePath, FileName, FileDir
   Folder := ComObjCreate("Shell.Application").NameSpace(FileDir)
   FolderItem := Folder.ParseName(FileName)
   For PropIndex, PropName In Details
;      DetailsArr[PropName] := Folder.GetDetailsOf(FolderItem, PropIndex)
;      Alternativ:
       If (PropValue := Folder.GetDetailsOf(FolderItem, PropIndex))
       DetailsArr[PropName] := PropValue
   Return DetailsArr
}

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
}

Re: ListView Frage'n

Post by just me » 24 Oct 2020, 05:30

Hallo effel,

die Antwort hat etwas länger gebraucht als ursprünglich gedacht. Für das Auslesen der Dateieigenschaften habe ich mir Folgendes überlegt:

In einem ersten Schritt am Anfang des Skripts holst Du Dir einmal ein Array mit den Indices und Namen der ausgewählten Eigenschaften:

Code: Select all

PropNames := "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"
Details := GetDetailIndex(PropNames)
...
...
...
GetDetailIndex(PropNames) {
   Static MaxGap := 12
   Props := {}
   For I, V In StrSplit(PropNames, "|")
      Props[V] := ""
   Shell := ComObjCreate("Shell.Application")
   Folder := Shell.NameSpace(0)
   Details := []
   Gap := 0
   While (Gap < MaxGap) {
      PropIndex := A_Index - 1
      If (PropName := Folder.GetDetailsOf(0, PropIndex)) {
         If Props.HasKey(PropName)
            Details[PropIndex] := PropName
         Gap := 0
      }
      Else
         Gap++
   }
   Return Details
}

Dieses Array übergibst Du später an die Funktion zum Auslesen der Eigenschaften der Dateien:

Code: Select all

FileDetails := GetFileDetails(FilePath, Details)
...
...
...
GetFileDetails(FilePath, Details) {
   DetailsArr := {}
   SplitPath,% FilePath, FileName, FileDir
   Folder := ComObjCreate("Shell.Application").NameSpace(FileDir)
   FolderItem := Folder.ParseName(FileName)
   For PropIndex, PropName In Details
      DetailsArr[PropName] := Folder.GetDetailsOf(FolderItem, PropIndex)
      ; Alternativ:
      ; If (PropValue := Folder.GetDetailsOf(FolderItem, PropIndex))
      ;    DetailsArr[PropName] := PropValue
   Return DetailsArr
}

Re: ListView Frage'n

Post by just me » 21 Oct 2020, 05:37

Moin,

für Deinen Versuch wäre es angezeigt, den ListViews auch Variaben zuzuweisen:

Code: Select all

Gui, Add, ListView, w600 r5 vListViewName1, ID|aa|bb
Sonst läuft die Anweisung

Code: Select all

Gui, ListView, ListViewName1
einfach 'ins Leere'.

Nach dem Hinzufügen eines ListViews wird der automatisch zum Standard-ListView. Alle folgenden LV_...()-Funtionen beziehen sich ebenso automatisch auf dieses Control. Die Anweisung Gui, ListView, ... brauchst Du erst, wenn Du das später ändern willst.

Auf das Thema 'GetAllDetails()' komme ich später noch mal zurück.

Re: ListView Frage'n

Post by effel » 19 Oct 2020, 11:07

yeah versuch macht kluch

Code: Select all

	Gui, Add, ListView, w600 r5, ID|aa|bb
	Gui, ListView, ListViewName1


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
	Gui, Add, ListView , w600 r5, ID|aa|bb
	Gui, ListView, ListViewName2
for idx, elem in order
	LV_Add("", idx, elem ".jpg")
	Gui +Resize
	LV_ModifyCol()
	LV_ModifyCol(1, 200)
	Gui, Show, , Bilder GPS Data

; msgbox % Bilder[elem]
; msgbox % A_DefaultListView

Re: ListView Frage'n

Post by effel » 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.

Re: ListView Frage'n

Post by effel » 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 😊

Top