handle Expression von Control ID unterscheiden

  • Hey,
    ich hab ein Dictionary in denen ich handles und control ids speicher. Das handle steht allerdings als expression im dictionary, z.B. (expression: 1705444 handle: 0x001A05E4). Wie kann ich nun eine expression 1705444 von einer control id 142 unterscheiden.

    Ich dachte die Funktion Hwnd($hwnd) würde ausreichen, da eigentlich Hwnd 0 zurückgibt, wenn $hwnd eine id ist, aber jetzt ist es vorgekommen, das er eine id 143 (also Hwnd(143 )) irgendwie als expression erkannt hat und er mir ein handle zurückgibt. Gibts da eine eindeutigere Methoden die zwischen expression und id unterscheidet?

    Danke!

  • Hi,

    Zitat

    Ich dachte die Funktion Hwnd($hwnd) würde ausreichen,

    wenn ICH nicht weiter weiss, dann konsultiere ich die Hilfe. Dazu gebe ich in diesem Fall einfach *hwnd* (die Sternchen sind wichtig! ) im Reiter SUCHEN in das obere Eingabefeld bei den Suchbegriffen ein. Bei den Checkboxen unten hake ich nur "Nur Titel suchen" an, und nach einem beherzten Hieb auf den "Themen auflisten" Button erscheint....tadaaaaa....die Liste mit den relevanten Treffern, aktuell sind es bei mir drei in meiner aktuellen englischen, und zwei Treffer in der sehr guten deutschen Hilfe zur 3.3.8.1
    Nur allein mit Blick in diese Liste wäre MEINE Frage zu diesem Thema gelöst!

    Ich gehe jetzt einfach mal davon aus, dass du nicht in der Lage warst, die Hilfe effektiv zu benutzen. Es reicht nämlich nicht, dass du "dachtest", dass die von dir gewählte Funktion ausreicht, bzw. das gewünschte Ergebnis liefert ;)

  • BugFix : Bin zufällig auf eine Diskussion von uns gestolpert, da war das Problem (bug) mit den dictionaries schon bekannt.

    Zitat

    So wie es aussieht kann das Dictionary keine handles speichern? Ich bekomme von der Funktion _Ex_CreateCtrl beispielsweise folgendes handle zurück: 0x007604AE.
    Wenn ich mir dann das Dictionary Item anschaue steht folgendes drin: 6424530

    Zitat

    Das stimmt. Die einzige Schwäche des Dictionary Objektes. :huh:

    Aber warum willst du kein Array verwenden? Ich sehe hier eigentlich keine besonderen Vorteile beim Einsatz des Dictionary.

    Andy: Ich kann dir nicht folgen, sehe dort keine Funktion, die mir weiterhilft? Ich bräuchte eine Funktion, wie IsID oder so, die mir dann 0 oder 1 zurückgibt?

  • Nutzt du ein 64-Skript?
    Wenn ja könnte es über VarGetType() gehen.
    Die ID ist einfach ein normaler Integer - es müsste hierfür Int32 rauskommen.
    Pointer auf einem 64 Bit System sind (welch Wunder) 64 Bit lang.
    Ein Handle ist nichts weiter als ein Pointer und wird, wenn es im Dictionary als Integer behandelt wird, als Int64 behandelt.

    Die eigentliche Frage ist aber eher: Wie kommt es zu so einer Situation wo man selbst in ein Dictionary sowohl ID's als auch Handles speichern will und nachträglich ermitteln möchte welcher Typ das einmal war?

  • Such mal in der Hilfe nach Arrays ;)

    Und btw. wegen des 1. Zitate: Zuerst hast du eine hexadezimale Zahl, dann eine dezimale. Kommt somit aufs gleiche raus.

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Arrays sind scheisse, sowas benutzt man, wenn die Daten die man speichern will keine struktur haben, wie z.B. eine Zahlenreihe.

    AspirinJunkie: Benutzte x86 Skript
    BugFix : Das wäre dann redundant, keine schöne Lösung.

    Hab jetzt alles ausprobiert: ($aParams[$i] = Parameter, entweder id oder decimal of handle)

    [autoit]

    Local $pHwnd = Ptr($aParams[$i])
    Local $hex = HWnd($aParams[$i])

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

    ConsoleWrite("value: " & $aParams[$i] & " fuction: " & $oData("sFunction") & " param: " & $i+1 & " ptr: " & $pHwnd & " isid: " & _WinAPI_GetDlgCtrlID($hex) & "is hwnd_ptr: " & IsHWnd($pHwnd) & " is hwnd_expr: " & IsHWnd($hex) & " is hwnd_var: " & IsHWnd($aParams[$i]) & @CRLF)

    [/autoit]

    Ausgabe:

    Zitat

    value: 5440730 fuction: _Updates_ItemsAll param: 1 ptr: 0x005304DA isid: 0 is hwnd_ptr: 1 is hwnd_expr: 1 is hwnd_var: 0
    value: 142 fuction: _Updates_ItemsAll param: 2 ptr: 0x0000008E isid: 0 is hwnd_ptr: 1 is hwnd_expr: 1 is hwnd_var: 0
    value: 7013890 fuction: _Updates_ItemsAll param: 3 ptr: 0x006B0602 isid: 138 is hwnd_ptr: 1 is hwnd_expr: 1 is hwnd_var: 0

    Muss man nicht verstehen, zeigt nur, dass man so wie ich es getestet habe, nicht zwischen dezimal zahl und id unterscheiden kann.
    Also ich weiß nicht weiter, gibt es deine keine Funktion die eine ID als ID identifiziert oder prüft, ob eine ID existiert?

  • Also ich weiß nicht weiter, gibt es deine keine Funktion die eine ID als ID identifiziert

    Es gibt keinen Datentyp "ID".
    Daher gibt es auch keine Funktion welche prüft ob ein Datum (ja das ist wirklich der Singular von Daten...) eine ID ist.
    Eine ControlID ist ein Integer - genauer gesagt ein 32 Bit Integer.

    Das Dictionary wandelt außerdem Zeigertypen (wie z.B. ein Handle) in Integer wenn sie hinzugefügt werden.
    Daher sind beide vom gleichen Datentyp und so per se nicht mehr unterscheidbar.

    Ich wiederhole mal daher meine Frage: Wie kommt man in eine Situation wo man nicht vorher weiß mit welchem Datentyp man es zu tun bekommt?
    Was willst du machen und warum ist es nur so erreichbar?

    In Foren trifft man sehr oft das sogenannte XY-Problem an:
    Das bedeutet:

    • Ein User möchte X erreichen.
    • Er glaubt die Lösung des Problems wäre Y.
    • Da es dabei Probleme gibt stellt er eine Frage Y betreffend aber ohne X zu erwähnen.
    • Effektiver wäre für Ihn aber die Fragestellung: Ich möchte X erreichen dazu habe ich schon Y probiert aber noch immer nicht das gewünschte erreicht.


    Deine Handle-Erkennung in Dictionaries ist dein Y.
    Dein X kennen wir hingegen nicht.

  • Ja hast ja recht mein Freund, ich weiß auch, das es noch andere Lösungen gibt: Ich benutzte diese Funktion hier:

    http://www.autoit.de/index.php?page=Thread&threadID=25132

    Damit kann ich Controls, eine Funktion mit mehreren Parametern zuweisen. Hab die Funktion von Zeitriss insoweit abgeändert, dass ich statt ein Array ein Dict benutze.
    So habe ich in meinem Dictionaries sowohl IDs als auch Handles.

    Ich habs jetzt mit If Not GuiCtrlGetHandle() gelöst, ist ja nur bei IDs 1., aber naja.

    EDIT: War mir doch zu dirty, habe jetzt im Sinne von Zeitriss wieder Arrays verwendet, gefällt mir nach paar Optimierungen so eigentlich ganz gut.

    Einmal editiert, zuletzt von Trolleule1337 (1. August 2014 um 18:19)

    • Offizieller Beitrag

    Arrays sind scheisse, sowas benutzt man, wenn die Daten die man speichern will keine struktur haben, wie z.B. eine Zahlenreihe.


    Na da muß ich mal ganz energisch widersprechen.
    Ich speichere natürlich auch strukturierte Daten in Arrays. Und das ist absolut unproblematisch und auch schnell.
    Da greift wohl eher der Spruch: "Wat der Bua nich kennt, dat fritt er nich" ;)

  • Zitat

    Andy: Ich kann dir nicht folgen, sehe dort keine Funktion, die mir weiterhilft? Ich bräuchte eine Funktion, wie IsID oder so, die mir dann 0 oder 1 zurückgibt?


    in deinem Startpost schreibst du

    Zitat

    aber jetzt ist es vorgekommen, das er eine id 143 (also Hwnd(143 )) irgendwie als expression erkannt hat und er mir ein handle zurückgibt.

    aha,

    [autoit]

    IsHWnd

    [/autoit]

    identifiziert definitiv ein Handle.
    Das reicht aus, um alle nicht-Handles zu identifizieren.

    Aber das gesamte Problem existiert nur, weil du nicht einfach einen Marker an oder vor deine Zahlen hängst. Damit identifizierst du so ziemlich alles, was sich in Zahlen kodieren lässt.
    H012345 ist für jeden ersichtlich ein Handle
    D25081978 ist ein Datum
    KW33 ist eine Kalenderwoche
    uswusf.
    Da du ohnehin VOR dem Speichern den Datentyp (sic) weisst, häng einfach einen Typidentifizierer davor.

    Es soll Programmierer geben, die identifizieren auf diese Art und Weise sämtliche Variablen 8)