Beiträge von BugFix
-
-
ich wüsste nicht wie so man das als Bot bezeichnen soll
OK, wenn du das nicht weißt, ist mir das auch wurscht - es steht in unseren Forenregeln und ist somit bindend.[CLOSED]
-
..der Mauszeiger soll zeilenweise den Monitor abgrasen.

Ich komm vor Lachen n icht in' Schlaf.
1. stinkt eindeutig nach Bot
2. Wir haben noch Überschlagsrechnung in der Schule gelernt. Scheint heute nicht mehr in zu sein. Also rechne mal selbst: n-Pixel-Breite * n-Pixel-Höhe * (gutmütig geschätzt) 1ms-je-Überprüfung ergäbe für einen einmaligen Scan meines Monitors >30 sec.
Saugute Performance, da du das sicher "kontinuierlich" ausführen willst.Also: Erkläre dich was das werden soll, sonst hängt sofort ein Schloß hiervor!
-
Hi,
meine Aktivitäten im OOP Bereich sind eher bescheiden. Ich schreibe ja viele Erweiterungen für SciTE in Lua. Dort kann ich mit Objekten arbeiten. Nun habe ich eine grundlegende Frage, die nicht sprachbezogen ist, sondern sich eher grundsätzlich auf das Objektverständnis bezieht:
Kann ich der Property eines Objektes den Aufruf einer Methode desselben Objektes zuweisen?
Ich habe mal ein fiktives Bsp. erstellt, das mein Problem verdeutlicht:
Spoiler anzeigen
Code
Alles anzeigen-- Mein Objekt "calc": Property "val" und Methoden "double", "half", "pow2", "sqrt" local calc = { val = 0, double = function(self) self.val = self.val*2 return self.val end, half = function(self) self.val = self.val/2 return self.val end, pow2 = function(self) self.val = math.pow(self.val, 2) return self.val end, sqrt = function(self) self.val = math.sqrt(self.val) return self.val end, } -- Wert setzen calc.val = 12 -- verdoppeln, Wert ausgeben print('verdoppelt', calc:double() ) -- halbieren, Wert ausgeben print('halbiert', calc:half() ) -- Quadrat bilden, Wert ausgeben print('quadriert', calc:pow2() ) -- Quadratwurzel ziehen, Wert ausgeben print('2te Wurzel', calc:sqrt() ) --[[ Output verdoppelt 24 halbiert 12 quadriert 144 2te Wurzel 12 ]]
Das funktioniert also wie gewollt.
Da die Methoden aber kein Argument erfordern würde ich den Funktionsaufruf gerne an Properties zuweisen.
Also in der Form: "HALF = calc:half()"
Somit hätte ich statt des Aufrufs "calc:half()" den Aufruf "calc.HALF".
Aber im Objekt selbst kann ich so nicht auf andere Methoden dieses Objekts zugreifen. "calc" wird mir dann als unbekannter Globaler Index markiert. Dasselbe passiert bei Verwendung von "self".
Erlauben Objekte überhaupt solche Re-Referenzierung und falls ja: Wie müsste ich syntaktisch vorgehen?
..Oder versuche ich hier die Quadratur des Kreises?
P.S. Es geht mir nicht darum, wie man es anders lösen könnte (Lösungen habe ich dafür), sondern ob es so realisierbar ist oder nicht.

-
Zitat von Krabat
nur mit den String Funktionen wie du sagtest wird man das nicht hinbekommen
Nun unterschätze mal die Stringfunktionen nicht. Es gibt fast nichts, was man nicht mit ihnen lösen könnte. Es ist nur manchmal etwas aufwändiger und bedarf mehrerer Einzelschritte.
Ohne dass ich mich jetzt in das Problem vertieft habe, wage ich mal kess die Behauptung: Es geht locker ohne Regexp mit den nativen Stringfunktionen.
-
Verwende doch AutoItObject. Für solche Strukturen sind Objekte einfacher im Handling. Und da es diese UDF gibt, wär es doch schön, wenn sie auch ab und an zur Anwendung kommt.

Alternativ könntest du auch mit Array & Struktur arbeiten: Symbiose: Array + Struktur
[autoit]
Edit: Dazu hier mal ein kurzes Bsp. (Beachten: Da Struktur zur Anwendung kommt dürfen in den Feldbezeichnern Umlaute und ß nicht vorkommen!)#include 'StructureList.au3'
[/autoit][autoit][/autoit][autoit]
Global $Fuhrpark = _StrucList_Create(-1, 'c;Alias', 'c;Identnummer', 'c;Kennzeichen', 'c;Fabrikat', 'c;Modell', 'c;Kraftstoff', 'c;Oel', 'c;Lackierung', 'i;Buchungskonto', 'f;EK', 'f;Zeitwert', 'f;Abschreibebetrag')_StrucList_AddIndex($Fuhrpark, -1, 'Ford_09|VF08152788A36|HH VX-546|Ford|Mondeo|Diesel|HLW-40|schwarz-metallic|14560|23500.50|18575.20|4635.35')
[/autoit][autoit][/autoit][autoit]
_StrucList_AddIndex($Fuhrpark, -1, 'Audi_01|XZ457822BVG27|HH ZT-827|Audi|Quattro|Diesel|HLW-30|silbergrau-metallic|14580|31400.30|27327.15|4928.20')ConsoleWrite('Anzahl Fahrzeuge im Fuhrpark: ' & _StrucList_Count($Fuhrpark) & @LF)
[/autoit]
ConsoleWrite('Auflistung nach Index (Alias-Name): ' & _StrucList_GetIndices($Fuhrpark, ';') & @LF)
ConsoleWrite('Ölsorte von Ford_09: ' & _StrucList_GetValue($Fuhrpark, 'Ford_09', 'Oel') & @LF) -
Bitte poste mir per PN den Auszug aus den AGB der Seite, wo ein automatisierter Zugang erlaubt wird, bzw. die dir vorliegende Erlaubnis des Seiteninhabers dafür.
Bis dahin bleibt der Thread geschlossen.Edit: OK, Ein automatisierter Zugang wird in den AGB nicht untersagt. - OFFEN
-
Datum ist Excel-intern eine Formel und muss deshalb als .Formula abgefragt werden, nicht als .Value
-
Schön, dann setze bitte den Thread auf "Gelöst" (Startpost editieren, Präfix: gelöst)
-
AutoIt3 Version 3.2.10.0
*Hust *Hust
AutoIt hat sich ab v3.3 massiv verändert, aktuell Stable ist 3.3.8.1 !!
Solltest du zwingend aktualisieren.
OS halte ich für nicht massgeblich (habe Win 7 Pro 64Bit).Ich habe dein Problem mal als Anlass für eine allgemeine Funktion genommen: TreeviewOrder.au3
-
Eine aktuelle Fragestellung im Forum hat mich dazu angeregt, diese Erweiterung für die Treeview Funktionen zu erstellen.
• _GUICtrlTreeView_CreateItemFromOrderFile
Erstellt Treeview Item aus einer Datei gemäß der gespeicherten Ordnung.
Root hat die Ornungsnummer "0". Childs unter Root bekommen "0.1", "0.2" ...
Deren Childs erhalten dann "0.1.1", "0.1.2", "0.2.1", "0.2.2" ... usw.• _GUICtrlTreeView_GetItemOrder
Liest die Ordnungsreihenfolge der Einträge eines Treeview in einen speicherbaren String (Standard), aus dem mit der vorigen Funktion ein Treeview wieder befüllt werden kann, oder in ein Array.Das ergibt dan z.B. folgenden String:
Spoiler anzeigen
Edit 04.12.2013:
2 Bugs gefixed
• Schreiben von nur 1 Item schlug fehl
• Item können jetzt folgende Zeichen enthalten: a-zA-Z0-9ßäöüÄÖÜ _,.+-|µ€§%$&Beispiel
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GuiTreeView.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
#include "TreeviewOrder.au3"Global $aTreeview
[/autoit] [autoit][/autoit] [autoit]
Global $File = @ScriptDir & '\OrderTree.txt'
If Not FileExists($File) Then FileWrite($File, _
"0|Autos" & @CRLF & _
"0.1|Oldies" & @CRLF & _
"0.1.1|Ford" & @CRLF & _
"0.1.1.1|Capri" & @CRLF & _
"0.1.2|Opel" & @CRLF & _
"0.1.2.1|Manta" & @CRLF & _
"0.2|Neu" & @CRLF & _
"0.2.1|Ford" & @CRLF & _
"0.2.1.1|Fiesta" & @CRLF & _
"0.2.1.2|Mondeo" & @CRLF & _
"0.2.2|Opel" & @CRLF & _
"0.2.2.1|Insignia" & @CRLF & _
"0.2.3|BMW" & @CRLF & _
"0.2.3.1|3er" & @CRLF & _
"0.2.3.1.1|blau" & @CRLF & _
"0.2.3.1.2|silber" & @CRLF & _
"0.2.3.2|8er" & @CRLF)$hGUI = GUICreate("Test", 350, 215)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$hTV = GUICtrlCreateTreeView(5, 5, 180, 200, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
$btFile = GUICtrlCreateButton('Load From File', 245, 45, 100, 20)
$btWrite = GUICtrlCreateButton('Write To File', 245, 85, 100, 20)
GUISetState()While 1
[/autoit]
Switch GUIGetMsg()
Case -3
Exit
Case $btFile
_GUICtrlTreeView_BeginUpdate($hTV)
$aTreeview = _GUICtrlTreeView_CreateItemFromOrderFile($File, $hTV)
_GUICtrlTreeView_Expand($hTV)
$hItem = _GUICtrlTreeView_GetFirstChild($hTV, $aTreeview[0][0])
_GUICtrlTreeView_Expand($hTV, $hItem, False)
While 1
$hItem = _GUICtrlTreeView_GetNextSibling($hTV, $hItem)
If $hItem = 0 Then ExitLoop
_GUICtrlTreeView_Expand($hTV, $hItem, False)
WEnd
_GUICtrlTreeView_EndUpdate($hTV)
Case $btWrite
Local $sWrite = _GUICtrlTreeView_GetItemOrder($hTV)
;~ ConsoleWrite($sWrite & @LF)
Local $fH = FileOpen($File, 2)
FileWrite($fH, $sWrite)
FileClose($fH)
EndSwitch
WEnd
Die Funktion zum Speichern des Treeview-Inhalts arbeitet rekursiv und ist somit in der Anzahl der lesbaren Treeview-Ebenen nur begrenzt durch das Rekursionsmaximum.
TreeviewOrder.au3 (v0.3)
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#Region - TimeStamp
; 2013-12-04 09:05:03 v 0.3
#EndRegion - TimeStamp#include-once
[/autoit] [autoit][/autoit] [autoit]
#include <GuiTreeView.au3>
#include <Array.au3>
#cs ============================================================================= F U N C T I O N S =============================• _GUICtrlTreeView_CreateItemFromOrderFile
[/autoit] [autoit][/autoit] [autoit]
Erstellt Treeview Item aus einer Datei gemäß der gespeicherten Ordnung• _GUICtrlTreeView_GetItemOrder
[/autoit] [autoit][/autoit] [autoit]
Liest die Ordnungsreihenfolge der Einträge eines Treeview in einen speicherbaren String (Standard) oder in ein Array#ce =============================================================================================================================
[/autoit] [autoit][/autoit] [autoit]; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name ..........: _GUICtrlTreeView_CreateItemFromOrderFile
; Description ...: Erstellt Treeview Item aus einer Datei gemäß der gespeicherten Ordnung
; Syntax ........: _GUICtrlTreeView_CreateItemFromOrderFile($_sFile, $_hWnd[, $_sDelim = -1])
; Parameters ....: $_sFile - Dateipfad.
; ...............: $_hWnd - Treeview Handle.
; ...............: $_sDelim - [optional] Trenner. Standard ist -1 = Opt("GUIDataSeparatorChar")
; ...............: $_sDelim trennt Ordnungsnummer von Itemtext
; Return values .: Erfolg Array [[Handle-Item, Ordnungsnummer, Item-Text]]
; ...............: Fehler 0 @error = 1: Datei lesen fehlgeschlagen
; ...............: = 2: Datei enthält keine Einträge
; Author ........: BugFix ( [email='bugfix@autoit.de'][/email] )
; ===============================================================================================================================
Func _GUICtrlTreeView_CreateItemFromOrderFile($_sFile, $_hWnd, $_sDelim=-1)
If $_sDelim = -1 Then $_sDelim = Opt("GUIDataSeparatorChar")
Local $sRead = FileRead($_sFile)
If @error Then Return SetError(1,0,0)
Local $aItem = StringRegExp($sRead, "([\d\.]*)" & $_sDelim & "([a-zA-Z0-9ßäöüÄÖÜ _,.+-|µ€§%$&]+)", 3)
If Not IsArray($aItem) Then Return SetError(2,0,0)
Local $n = 0, $aTree[UBound($aItem)/2][3] ; == [[Handle-Item, sOrder, Item-Text]]
Local $sOrderParent
For $i = 0 To UBound($aItem) -2 Step 2
$sOrderParent = __OrderNumber($aItem[$i], False)
Switch $sOrderParent
Case ''
$aTree[$n][0] = _GUICtrlTreeView_Add($_hWnd, 0, $aItem[$i+1])
Case Else
For $j = 0 To $n
If $aTree[$j][1] = $sOrderParent Then
$aTree[$n][0] = _GUICtrlTreeView_AddChild($_hWnd, $aTree[$j][0], $aItem[$i+1])
EndIf
Next
EndSwitch
$aTree[$n][1] = $aItem[$i] ; == sOrder
$aTree[$n][2] = $aItem[$i+1] ; == Item-Name
$n += 1
Next
Return $aTree
EndFunc ;==>_GUICtrlTreeView_CreateItemFromOrderFile; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name ..........: _GUICtrlTreeView_GetItemOrder
; Description ...: Liest die Ordnungsreihenfolge der Einträge eines Treeview in einen speicherbaren String (Standard)
; ...............: oder in ein Array
; ...............: Root hat die Ornungsnummer "0". Childs unter Root bekommen "0.1", "0.2" ...
; ...............: Deren Childs erhalten dann "0.1.1", "0.1.2", "0.2.1", "0.2.2" ... usw.
; Syntax ........: _GUICtrlTreeView_GetItemOrder($_hWnd[, $_fString = 1[, $_sDelim = -1]])
; Parameters ....: $_hWnd Handle des Treeview
; ...............: $_fString 1 (Standard): Ausgabe als String "OrdnungsNr TRENNER ItemText CRLF", 0 gibt Array zurück
; ...............: $_sDelim -1 (Standard): Trennzeichen von Opt(GUIDataSeparatorChar)
; Return values .: Erfolg String um Inhalte mit Ordnungsreihenfolge in Datei zu speichern oder
; ...............: Array [[Item-Handle, Ordnungsnummer, Item-Text]]
; Author ........: BugFix ( [email='bugfix@autoit.de'][/email] )
;================================================================================================================================
Func _GUICtrlTreeView_GetItemOrder($_hWnd, $_fString=1, $_sDelim=-1)
If $_sDelim = -1 Then $_sDelim = Opt("GUIDataSeparatorChar")
Local $iCount = _GUICtrlTreeView_GetCount($_hWnd)
If $iCount = 0 Then Return SetError(1,0,0)
Local $hItem = _GUICtrlTreeView_GetFirstItem($_hWnd), $sOrder = '0'
Local $aItem[$iCount][3] = [[$hItem, $sOrder, _GUICtrlTreeView_GetText($_hWnd, $hItem)]], $iCurrIndex = 1
If $iCount > 1 Then __GetItemArray($_hWnd, $hItem, $aItem, $iCurrIndex, $sOrder)
If Not $_fString Then Return $aItem
Local $sRet = ''
For $i = 0 To UBound($aItem) -1
$sRet &= $aItem[$i][1] & $_sDelim & $aItem[$i][2] & @CRLF
Next
Return $sRet
EndFunc ;==>_GUICtrlTreeView_GetItemOrder#Region - Helper Functions
[/autoit] [autoit][/autoit] [autoit]
Func __GetItemArray($_hWnd, $_hParent, ByRef $_aItem, ByRef $_iIndex, $_sOrderParent)
Local $sOrder = __OrderNumber($_sOrderParent, True, True)
Local $hItem = _GUICtrlTreeView_GetFirstChild($_hWnd, $_hParent)
$_aItem[$_iIndex][0] = $hItem
$_aItem[$_iIndex][1] = $sOrder
$_aItem[$_iIndex][2] = _GUICtrlTreeView_GetText($_hWnd, $hItem)
$_iIndex += 1
If _GUICtrlTreeView_GetChildCount($_hWnd, $hItem) > 0 Then
__GetItemArray($_hWnd, $hItem, $_aItem, $_iIndex, $sOrder)
EndIf
While 1
$hItem = _GUICtrlTreeView_GetNextSibling($_hWnd, $hItem)
If $hItem = 0 Then ExitLoop
$sOrder = __OrderNumber($sOrder)
$_aItem[$_iIndex][0] = $hItem
$_aItem[$_iIndex][1] = $sOrder
$_aItem[$_iIndex][2] = _GUICtrlTreeView_GetText($_hWnd, $hItem)
$_iIndex += 1
If _GUICtrlTreeView_GetChildCount($_hWnd, $hItem) > 0 Then
__GetItemArray($_hWnd, $hItem, $_aItem, $_iIndex, $sOrder)
EndIf
WEnd
EndFunc ;==>__GetItemArrayFunc __OrderNumber($_sOrder, $_fIncrease=True, $_fNextSub=False)
[/autoit]
If $_fIncrease Then ; == increase order number
If $_fNextSub Then Return $_sOrder & '.1'
Local $sLeft, $sRight, $iPos
$iPos = StringInStr($_sOrder, '.', 1, -1)
$sLeft = StringLeft($_sOrder, $iPos)
$sRight = StringTrimLeft($_sOrder, $iPos)
Return $sLeft & ($sRight +1)
Else ; == get parent order number
If $_sOrder = '0' Then Return ''
Local $iPos = StringInStr($_sOrder, '.', 1, -1)
Return StringLeft($_sOrder, $iPos -1)
EndIf
EndFunc ;==>__OrderNumber
#EndRegion - Helper Functions
DL bisher: 34 -
Zitat
Inder Beispieldatei einfach mit der Maus auf Fiesta clicken.(Im Anhang)
Habs getan - und es passiert: absolut nichts!
Der Code bietet auch nicht die Möglichkeit, dass durch Klick auf ein Item irgendwas passiert, da dieses Event mit keiner Aktion verknüpft ist. -
Also mit meinem Mustercode kann ich dieses Verhalten nicht nachvollziehen. Du musst also etwas daran geändert haben.
Zeig mal den Code, wo der Fehler nachvollziehbar auftritt. -
Da verstehe ich deine Frage nicht. Wenn du selbst ein neues Item erstellst, weißt du doch in welcher Ebene du es einfügen möchtest.
• User klickt auf Item, zu dem ein SubItem erstellt werden soll
• das Handle davon bekommst du dann mit $hSelected = _GUICtrlTreeView_GetSelection($hTV)
oder du legst per Skript fest zu welchem Item ein Child erstellt werden soll.
• _GUICtrlTreeView_GetText($hTV, $hSelected) gibt dir den Item-Text (kannst du meinem Code-Bsp. entnehmen, Fkt: _WriteTreeToFile() )
• dieses nutzt du dann um mit _GUICtrlTreeView_AddChild($hTV, $hSelected, "Item-Text") den neuen Eintrag zu erstellen
• wenn noch kein Eintrag vorhanden ist, wird der erste Eintrag mit _GUICtrlTreeView_Add($hTV, 0, "erstes-Item") erstelltEdit: Habe das nochmal bearbeitet. Das Speichern in der Reihenfolge der Item ist effizienter, auch das Erstellen. Schau dir einfach den Code an, deutlich kürzer und erlaubt beliebige Childtiefe.
Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GuiTreeView.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>#cs Datei mit Tree-Struktur
[/autoit] [autoit][/autoit] [autoit]
Parent-Name; Item-Name;Autos // erster Eintrag, somit kein Parent
[/autoit] [autoit][/autoit] [autoit]
Autos;Ford
Ford;Fiesta
Ford;Mondeo
Autos;Opel
Opel;Manta
Opel;Insignia
Autos;BMW
BMW;3er
3er;blau
3er;silber
BMW;8er
#ceGlobal $File = @ScriptDir & '\Tree.txt'
[/autoit] [autoit][/autoit] [autoit]
Global $hTV$hGUI = GUICreate("Test", 350, 215)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$TV = GUICtrlCreateTreeView(5, 5, 180, 200, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
$hTV = GUICtrlGetHandle($TV)
$btNew = GUICtrlCreateButton('New Item', 245, 5, 100, 20)
$btFile = GUICtrlCreateButton('Load From File', 245, 45, 100, 20)
$btWrite = GUICtrlCreateButton('Write To File', 245, 85, 100, 20)
GUISetState()While 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case -3
Exit
Case $btNew
; == Dialog NEU
Case $btFile
_Load()
Case $btWrite
_WriteTreeToFile()
EndSwitch
WEndFunc _Load()
[/autoit] [autoit][/autoit] [autoit]
Local $aFromFile = _ReadFile2TreeArray()
For $i = 0 To UBound($aFromFile) -1
_GuiCtrlTreeView_NewItem($hTV, $aFromFile[$i][1], $aFromFile[$i][0])
Next
_GUICtrlTreeView_Expand($hTV)
EndFuncFunc _ReadFile2TreeArray()
[/autoit] [autoit][/autoit] [autoit]
Local $sRead = FileRead($File)
If @error Then Return SetError(1,0,0)
Local $a = StringRegExp($sRead, '(\w+)*;(\w+)', 3)
If Not IsArray($a) Then Return SetError(2,0,0)
Local $aTree[UBound($a)/2][2], $n = 0
For $i = 0 To UBound($a) -2 Step 2
$aTree[$n][0] = $a[$i] ; == Parent-Name
$aTree[$n][1] = $a[$i+1] ; == Item-Name
$n += 1
Next
Return $aTree
EndFuncFunc _WriteTreeToFile()
[/autoit] [autoit][/autoit] [autoit]
Local $sWrite = '', $sParent, $hItem = _GUICtrlTreeView_GetFirstItem($hTV)
If $hItem <> 0 Then
$sWrite &= ';' & _GUICtrlTreeView_GetText($hTV, $hItem) & @CRLF
While 1
$hItem = _GUICtrlTreeView_GetNext($hTV, $hItem)
If $hItem = 0 Then ExitLoop
$sParent = _GUICtrlTreeView_GetText($hTV, _GUICtrlTreeView_GetParentHandle($hTV, $hItem))
$sWrite &= $sParent & ';' & _GUICtrlTreeView_GetText($hTV, $hItem) & @CRLF
WEnd
EndIf
Local $fH = FileOpen($File, 2)
FileWrite($fH, $sWrite)
;~ ConsoleWrite($sWrite & @LF)
EndFuncFunc _GuiCtrlTreeView_NewItem($_hWnd, $_sText, $_sParentUnique='')
[/autoit]
Local $hItem
If $_sParentUnique = '' Then
Return _GUICtrlTreeView_Add($_hWnd, 0, $_sText)
Else
$hItem = _GUICtrlTreeView_GetFirstItem($_hWnd)
If _GUICtrlTreeView_GetText($_hWnd, $hItem) = $_sParentUnique Then
Return _GUICtrlTreeView_AddChild($_hWnd, $hItem, $_sText)
Else
While 1
$hItem = _GUICtrlTreeView_GetNext($_hWnd, $hItem)
If $hItem = 0 Then ExitLoop
If _GUICtrlTreeView_GetText($_hWnd, $hItem) = $_sParentUnique Then
Return _GUICtrlTreeView_AddChild($_hWnd, $hItem, $_sText)
EndIf
WEnd
EndIf
EndIf
EndFunc -
Warum verwendest du nicht
[autoit]FileOpenDialog
[/autoit]
-
So, hab dir mal eine Lösung erstellt.
Du musst die Daten natürlich so speichern, dass die Struktur ersichtlich ist. Für ein Treeview heisst das: Wer ist das Parent zum Item.
Das Bsp. liest aus folgender Datei (Zuordnung: Parent-Name; Item-Name) :Code;Autos Autos;Ford Autos;Opel Autos;BMW Ford;Fiesta Ford;Mondeo Opel;Manta Opel;Insignia BMW;3er BMW;8er
Die Funktionen kann man natürlich auch so gestalten, dass sie auch auf tiefere Ebenen zugreifen. Muss man dann rekursiv lösen. Für die Variante reicht das aber so.
Das Abspeichern der Item-Handle ist für dieses 2-Ebenen Treeview nicht erforderlich, da diese beim Erstellen neu zugewiesen werden und eine Unterscheidung anhand des Item-Textes möglich ist. Ein Treeview strukturiert sich nach: Root-Parent-(Siblings v. Parent)-Child-(Siblings v. Child).. usw.
Diese Struktur musst du beim Auslesen des Trees auch erfassen und in deiner Datei/DB hinterlegen. Du kannst es, wie in meinem Bsp., so machen, dass du die Einträge in der Reihenfolge der Ebenen erfasst, oder hintereinanderweg ausliest und die Zuordnung Parent-Child speicherst. Aufwändiger wird es, wenn ein Item-Text mehrfach in verschiedenen Zweigen auftauchen kann. In diesem Fall ist das Abspeichern des Handle zum Item-Text nötig.Eine Funktion zum Neuerstellen habe ich hier jetzt nicht eingebunden, das lief bei dir ja bereits.
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>#cs Datei mit Tree-Struktur
[/autoit] [autoit][/autoit] [autoit]
Parent-Name; Item-Name;Autos // erster Eintrag, somit kein Parent
[/autoit] [autoit][/autoit] [autoit]
Autos;Ford
Autos;Opel
Autos;BMW
Ford;Fiesta
Ford;Mondeo
Opel;Manta
Opel;Insignia
BMW;3er
BMW;8er
#ceGlobal $File = @ScriptDir & '\Tree.txt'
[/autoit] [autoit][/autoit] [autoit]
Global $hTV$hGUI = GUICreate("Test", 350, 215)
[/autoit] [autoit][/autoit] [autoit]
$TV = GUICtrlCreateTreeView(5, 5, 180, 200, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
$hTV = GUICtrlGetHandle($TV)
$btNew = GUICtrlCreateButton('New Item', 245, 5, 100, 20)
$btFile = GUICtrlCreateButton('Load From File', 245, 45, 100, 20)
$btWrite = GUICtrlCreateButton('Write To File', 245, 85, 100, 20)
GUISetState()Global $aFromFile = _ReadFile2TreeArray()
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case -3
Exit
Case $btNew
; == Dialog NEU
Case $btFile
_Load()
Case $btWrite
_WriteTreeToFile()
EndSwitch
WEndFunc _Load()
[/autoit] [autoit][/autoit] [autoit]
$aTVHandle = _FillTreeFromArray()
_GUICtrlTreeView_Expand($hTV)
EndFuncFunc _ReadFile2TreeArray()
[/autoit] [autoit][/autoit] [autoit]
Local $sRead = FileRead($File)
If @error Then Return SetError(1,0,0)
Local $a = StringRegExp($sRead, '(\w+)*;(\w+)', 3)
If Not IsArray($a) Then Return SetError(2,0,0)
Local $aTree[UBound($a)/2][2], $n = 0
For $i = 0 To UBound($a) -2 Step 2
$aTree[$n][0] = $a[$i] ; == Parent-Name
$aTree[$n][1] = $a[$i+1] ; == Item-Name
$n += 1
Next
Return $aTree
EndFuncFunc _FillTreeFromArray()
[/autoit] [autoit][/autoit] [autoit]
Local $aHwnd[UBound($aFromFile)][2]
Local $hRoot, $hParent, $hItem
For $i = 0 To UBound($aFromFile) -1
If $aFromFile[$i][0] = '' Then ; == erster Eintrag - Root
$hRoot = _GUICtrlTreeView_Add($hTV, 0, $aFromFile[$i][1])
$aHwnd[0][0] = $aFromFile[$i][1] ; == Text Root
$aHwnd[0][1] = $hRoot ; == Handle Root
ElseIf $aFromFile[$i][0] = $aFromFile[0][1] Then ; == Root ist übergeordnet, Item wird Child des Root und selbst dann Parent für Childs
$hItem = _GUICtrlTreeView_AddChild($hTV, $hRoot, $aFromFile[$i][1])
$aHwnd[$i][0] = $aFromFile[$i][1] ; == Text Item
$aHwnd[$i][1] = $hItem ; == Handle Item
Else ; == andere Item sind dann in der nächsten Unterebene
For $j = 0 To UBound($aHwnd) -1
If $aFromFile[$i][0] = $aHwnd[$j][0] Then ; == übergeordnetes Item suchen
$hParent = $aHwnd[$j][1] ; == dessen Handle übernehmen
ExitLoop
EndIf
Next
$hItem = _GUICtrlTreeView_AddChild($hTV, $hParent, $aFromFile[$i][1])
$aHwnd[$i][0] = $aFromFile[$i][1] ; == Text Item
$aHwnd[$i][1] = $hItem ; == Handle Item
EndIf
Next
Return $aHwnd
EndFuncFunc _WriteTreeToFile()
[/autoit] [autoit][/autoit] [autoit]
Local $sWrite = '', $sSubs = ''
Local $hRoot = _GUICtrlTreeView_GetFirstItem($hTV), $sRoot, $sItem
If $hRoot <> 0 Then
$sRoot = _GUICtrlTreeView_GetText($hTV, $hRoot)
$sWrite &= ';' & $sRoot & @CRLF
Local $n = _GUICtrlTreeView_GetChildCount($hTV, $hRoot), $hChild
Local $m, $hSub, $hItem
If $n > 0 Then
$hChild = _GUICtrlTreeView_GetFirstChild($hTV, $hRoot)
$sWrite &= $sRoot & ';' & _GUICtrlTreeView_GetText($hTV, $hChild) & @CRLF
$sSubs &= _GetSubs($hChild, _GUICtrlTreeView_GetText($hTV, $hChild)) ; == alle SubItem hiervon auslesen
If $n > 1 Then
For $i = 2 To $n
$hChild = _GUICtrlTreeView_GetNextSibling($hTV, $hChild)
$sItem = _GUICtrlTreeView_GetText($hTV, $hChild)
$sWrite &= $sRoot & ';' & $sItem & @CRLF
$sSubs &= _GetSubs($hChild, $sItem) ; == alle SubItem hiervon auslesen
Next
EndIf
EndIf
EndIf
$sWrite &= $sSubs
Local $fH = FileOpen($File, 2)
FileWrite($fH, $sWrite)
;~ ConsoleWrite($sWrite & @LF)
EndFuncFunc _GetSubs($_hItem, $_sParent)
[/autoit]
Local $hSub, $sSub = ''
$m = _GUICtrlTreeView_GetChildCount($hTV, $_hItem)
If $m > 0 Then
$hSub = _GUICtrlTreeView_GetFirstChild($hTV, $_hItem)
$sSub &= $_sParent & ';' & _GUICtrlTreeView_GetText($hTV, $hSub) & @CRLF
If $m > 1 Then
For $j = 2 To $m
$hSub = _GUICtrlTreeView_GetNextSibling($hTV, $hSub)
$sSub &= $_sParent & ';' & _GUICtrlTreeView_GetText($hTV, $hSub) & @CRLF
Next
EndIf
EndIf
Return $sSub
EndFunc -
Kartenspiel? -- Schau mal hier: https://autoit.de/index.php?page…74248#post74248
-
Fehlen doch noch weitere Informationen?
Wie bereits gesagt, habe ich kein Access und kann nicht mit deinem Testcode probieren. Erstell doch mal einen überall lauffähigen Code, der dein Problem beinhaltet. -
Bevor ich den Thread close, sag mal noch für welchen "sinnvollen" Einsatz du das benötigst.
Du sagst selbst, dass du von Dll keine Ahnung hast. Dann spreche ich dir auch jede Befähigung ab, die 0,1 % sinnvoller Anwendungen der NomadMemory.au3 auszuführen. -
Ich habe den Code nicht im Detail betrachtet, könnte mangels Access DB eh nichts testen.
Aber Folgendes:
1.
Es ist wenig sinnvoll, bei jedem neuen Item die Datenbank zu öffnen, Item einzufügen und DB wieder zu schließen.
Stelle am Anfang die Verbindung zur DB her und beende diese beim Schließen des Programms, z.B. in einer autom. Funktion (OnAutoItExitRegister).2.
Du solltest auch das Child nur einmalig am Programmstart erstellen und es dann mit SHOW/HIDE anzeigen oder ausblenden.Und an welcher Stelle verhält sich das Programm denn anders als von dir erwartet? Hast du die entsprechenden Variablen dann auch dir mal in die Konsole ausgeben lassen um zu wissen, was wann hängt?