1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BugFix

Beiträge von BugFix

  • Mit Mausclick in TreeviewItem eine Aktion auslösen (GUIOnEventMode)

    • BugFix
    • 16. Oktober 2013 um 20:10

    Schau mal in die Hilfe zu _GuiCtrlTreeView_Create, Func WM_NOTIFY -- da findest du was du brauchst

  • Mauszeiger

    • BugFix
    • 15. Oktober 2013 um 20:23
    Zitat von DumdiDum

    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]

  • Mauszeiger

    • BugFix
    • 15. Oktober 2013 um 20:09

    ..der Mauszeiger soll zeilenweise den Monitor abgrasen. :rofl:
    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. :D 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!

  • Objekt-Problem: Kann ich einer Property den Aufruf einer Methode dieses Objektes zuweisen?

    • BugFix
    • 15. Oktober 2013 um 10:37

    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
    -- 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
    ]]
    Alles anzeigen


    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? :whistling:

    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. ;)

  • Text aus .reg-Datei in variable schreiben.

    • BugFix
    • 13. Oktober 2013 um 22:17
    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. :D

  • Verschachteltes Scripting.Dictionary Objekt nicht unabhängig

    • BugFix
    • 13. Oktober 2013 um 10:12

    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
    Edit: Dazu hier mal ein kurzes Bsp. (Beachten: Da Struktur zur Anwendung kommt dürfen in den Feldbezeichnern Umlaute und ß nicht vorkommen!)

    [autoit]

    #include 'StructureList.au3'
    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')

    [/autoit][autoit][/autoit][autoit]

    _StrucList_AddIndex($Fuhrpark, -1, 'Ford_09|VF08152788A36|HH VX-546|Ford|Mondeo|Diesel|HLW-40|schwarz-metallic|14560|23500.50|18575.20|4635.35')
    _StrucList_AddIndex($Fuhrpark, -1, 'Audi_01|XZ457822BVG27|HH ZT-827|Audi|Quattro|Diesel|HLW-30|silbergrau-metallic|14580|31400.30|27327.15|4928.20')

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite('Anzahl Fahrzeuge im Fuhrpark: ' & _StrucList_Count($Fuhrpark) & @LF)
    ConsoleWrite('Auflistung nach Index (Alias-Name): ' & _StrucList_GetIndices($Fuhrpark, ';') & @LF)
    ConsoleWrite('Ölsorte von Ford_09: ' & _StrucList_GetValue($Fuhrpark, 'Ford_09', 'Oel') & @LF)

    [/autoit]
  • Wie Kann ich diesen Script im Hintergrund ausführen?

    • BugFix
    • 12. Oktober 2013 um 15:53

    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 aus xls mit ADO geht leer aus

    • BugFix
    • 12. Oktober 2013 um 12:23

    Datum ist Excel-intern eine Formel und muss deshalb als .Formula abgefragt werden, nicht als .Value

  • Tree in DB abspeichern und wieder auslesen

    • BugFix
    • 4. Oktober 2013 um 20:11

    Schön, dann setze bitte den Thread auf "Gelöst" (Startpost editieren, Präfix: gelöst)

  • Tree in DB abspeichern und wieder auslesen

    • BugFix
    • 4. Oktober 2013 um 18:28
    Zitat von MaDeBuVie

    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

  • TreeviewOrder.au3 -- Treeview Inhalt in Datei speichern und aus Datei laden

    • BugFix
    • 4. Oktober 2013 um 18:23

    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


    OrdnungsNummer|Item-Text

    Code
    0|Autos
    0.1|Oldies
    0.1.1|Ford
    0.1.1.1|Capri
    0.1.2|Opel
    0.1.2.1|Manta
    0.2|Neu
    0.2.1|Ford
    0.2.1.1|Fiesta
    0.2.1.2|Mondeo
    0.2.2|Opel
    0.2.2.1|Insignia
    0.2.3|BMW
    0.2.3.1|3er
    0.2.3.1.1|blau
    0.2.3.1.2|silber
    0.2.3.2|8er
    Alles 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]


    #include <GuiTreeView.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>
    #include "TreeviewOrder.au3"

    [/autoit] [autoit][/autoit] [autoit]

    Global $aTreeview
    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)

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("Test", 350, 215)
    $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()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    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

    [/autoit]


    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]


    #Region - TimeStamp
    ; 2013-12-04 09:05:03 v 0.3
    #EndRegion - TimeStamp

    [/autoit] [autoit][/autoit] [autoit]

    #include-once
    #include <GuiTreeView.au3>
    #include <Array.au3>
    #cs ============================================================================= F U N C T I O N S =============================

    [/autoit] [autoit][/autoit] [autoit]

    • _GUICtrlTreeView_CreateItemFromOrderFile
    Erstellt Treeview Item aus einer Datei gemäß der gespeicherten Ordnung

    [/autoit] [autoit][/autoit] [autoit]

    • _GUICtrlTreeView_GetItemOrder
    Liest die Ordnungsreihenfolge der Einträge eines Treeview in einen speicherbaren String (Standard) oder in ein Array

    [/autoit] [autoit][/autoit] [autoit]

    #ce =============================================================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    #Region - Helper Functions
    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 ;==>__GetItemArray

    [/autoit] [autoit][/autoit] [autoit]

    Func __OrderNumber($_sOrder, $_fIncrease=True, $_fNextSub=False)
    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

    [/autoit]


    DL bisher: 34

    Dateien

    TreeviewOrder[0.3].au3 6,41 kB – 361 Downloads
  • Tree in DB abspeichern und wieder auslesen

    • BugFix
    • 4. Oktober 2013 um 17:41
    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.

  • Tree in DB abspeichern und wieder auslesen

    • BugFix
    • 4. Oktober 2013 um 17:20

    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.

  • Tree in DB abspeichern und wieder auslesen

    • BugFix
    • 3. Oktober 2013 um 20:48

    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") erstellt


    Edit: 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>
    #include <GuiTreeView.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    #cs Datei mit Tree-Struktur
    Parent-Name; Item-Name

    [/autoit] [autoit][/autoit] [autoit]

    ;Autos // erster Eintrag, somit kein Parent
    Autos;Ford
    Ford;Fiesta
    Ford;Mondeo
    Autos;Opel
    Opel;Manta
    Opel;Insignia
    Autos;BMW
    BMW;3er
    3er;blau
    3er;silber
    BMW;8er
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    Global $File = @ScriptDir & '\Tree.txt'
    Global $hTV

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("Test", 350, 215)
    $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()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $btNew
    ; == Dialog NEU
    Case $btFile
    _Load()
    Case $btWrite
    _WriteTreeToFile()
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Load()
    Local $aFromFile = _ReadFile2TreeArray()
    For $i = 0 To UBound($aFromFile) -1
    _GuiCtrlTreeView_NewItem($hTV, $aFromFile[$i][1], $aFromFile[$i][0])
    Next
    _GUICtrlTreeView_Expand($hTV)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ReadFile2TreeArray()
    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
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _WriteTreeToFile()
    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)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlTreeView_NewItem($_hWnd, $_sText, $_sParentUnique='')
    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

    [/autoit]
  • Standard-Datei-Öffnen-Dialoge steuern

    • BugFix
    • 3. Oktober 2013 um 17:02

    Warum verwendest du nicht

    [autoit]

    FileOpenDialog

    [/autoit]

    ?(

  • Tree in DB abspeichern und wieder auslesen

    • BugFix
    • 3. Oktober 2013 um 16:52

    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]


    #include <GUIConstantsEx.au3>
    #include <GuiTreeView.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    #cs Datei mit Tree-Struktur
    Parent-Name; Item-Name

    [/autoit] [autoit][/autoit] [autoit]

    ;Autos // erster Eintrag, somit kein Parent
    Autos;Ford
    Autos;Opel
    Autos;BMW
    Ford;Fiesta
    Ford;Mondeo
    Opel;Manta
    Opel;Insignia
    BMW;3er
    BMW;8er
    #ce

    [/autoit] [autoit][/autoit] [autoit]

    Global $File = @ScriptDir & '\Tree.txt'
    Global $hTV

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("Test", 350, 215)
    $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()

    [/autoit] [autoit][/autoit] [autoit]

    Global $aFromFile = _ReadFile2TreeArray()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $btNew
    ; == Dialog NEU
    Case $btFile
    _Load()
    Case $btWrite
    _WriteTreeToFile()
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Load()
    $aTVHandle = _FillTreeFromArray()
    _GUICtrlTreeView_Expand($hTV)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ReadFile2TreeArray()
    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
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _FillTreeFromArray()
    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
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _WriteTreeToFile()
    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)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetSubs($_hItem, $_sParent)
    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

    [/autoit]
  • Picbox Move - Kartenspiel

    • BugFix
    • 3. Oktober 2013 um 10:27

    Kartenspiel? -- Schau mal hier: https://autoit.de/index.php?page…74248#post74248

  • Tree in DB abspeichern und wieder auslesen

    • BugFix
    • 3. Oktober 2013 um 10:20
    Zitat von MaDeBuVie

    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.

  • NomadMemory & getbaseaddress

    • BugFix
    • 1. Oktober 2013 um 17:10

    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.

  • Tree in DB abspeichern und wieder auslesen

    • BugFix
    • 1. Oktober 2013 um 09:48

    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?

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™