Darüber bin ich auch schon gestolpert, sowie du von der reinen GUI-Fläche auf ein Control wechselst bekommst du keine Infos mehr von WM_MOUSEMOVE.
Im Moment habe ich keine Idee, wie man das elegant lösen kann.
Beiträge von BugFix
-
-
Evtl. Aufrufkonvention beachten? ('cdecl' statt Standard 'stdcall')
-
Es ist als grenzwertig zu betrachten und ermöglicht einen Verstoß gegen die AGB des Betreibers.
Insofern: CLOSED -
-
[autoit]
Func __o_StartUp($hG)
[/autoit]
Local $aParameters = _($oGraph.StartUp_Parameters)
_GDIPlus_Startup()
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($aParameters[1])
Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphic)
Global $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
EndFuncNa, die 3 Globalen Variablen hast du doch bereits am Skriptanfang deklariert! Hier dann nur den Wert zuweisen, ohne "Global".

-
-
-
Hi,
ich habe gerade mit der AutoitObject UDF ein Problem.
Ich möchte ByRef-Parameter in einer Methode einsetzen. Innerhalb der Methode funktioniert das noch ordentlich, aber die ByRef-Variable selbst wird nicht geändert obwohl der ByRef-Parameter im Aufruf (der ja nur einen Verweis auf die ByRef-Variable darstellt) den richtigen Wert annimmt.
Wo hängt der Hammer? :wacko:Edit: Habe es jetzt parallel im EN-Forum gepostet.
Spoiler anzeigen
[autoit]#include <AutoItObject.au3>
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Startup()
[/autoit] [autoit][/autoit] [autoit]; == Problematik:
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
; Eine unveränderliche Funktion ("_SomeFunc") soll über ein Objekt für diese Funktion aufrufbar sein.
; Die Funktion kann ByRef-Parameter enthalten. Die ByRef-Funktionalität muss gewährleistet bleiben.$oTest = _CreateObjFunc('Test')
[/autoit] [autoit][/autoit] [autoit]$a1 = 5
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('Return Methode = ' & $oTest.Meth($a1, 3, 5) & ' [OK]' & @LF)
ConsoleWrite('ByRef "$a1" nach Aufruf = ' & $a1 & ' [FALSCH]' & @LF) ; == obwohl Parameter $a1 in der Methode geändert wurde bleibt $a1 unverändert im Wert;------------------------------------- OBJECT ------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]
Func _CreateObjFunc($_sName)
Local $oSelf = _AutoItObject_Create()
_AutoItObject_AddMethod($oSelf, 'Meth', "_Meth")
Return $oSelf
EndFuncFunc _Meth(ByRef $oSelf, ByRef $A, $B=1, $C=1)
[/autoit] [autoit][/autoit] [autoit]
Local $vRet = _SomeFunc($A, $B, $C) ; == $A ist ByRef
Local $iErr = @error
ConsoleWrite('ByRef "$A" in Methode = ' & $A & ' [OK]' & @LF) ; == $A wurde ByRef geändert -- OK
Return SetError($iErr,0,$vRet)
EndFunc
;---------------------------------------------------------------------------------------------------Func _SomeFunc(ByRef $A, $B=1, $C=1)
[/autoit]
$A += $B + $C
Return $A
EndFunc -
Anscheinend wurde das in dieser Excel-Sheet so definiert oder was auch immer, aber definitv benutzt werden weniger.
Eventuell sind ja bis an das Ende Formeln kopiert? Dann ist die Zelle auch nicht leer, also "used". -
Hast du meine Beiträge überhaupt gelesen
Selbstverständlich.
Und nachdem er das Skript postete hast du gesagt, dass Global nicht nötig sei und nicht verwendet werden sollte. Dann hättest du konsequenterweise auch sagen müssen, dass er keinerlei Variablen im Hauptskript verwenden soll (da undeklariert auch Global)
-- Denn genau das ist die logische Konsequenz deiner Aussage in Bezug auf das gezeigte Skript. 
-
Da ich das Thema gerade in einem Thread wieder entdeckt hatte hier mal ein Weg, wie man Variablen in lokalem Namensraum ablegen kann und doch Globalen Zugriff erlangt.
Inwiefern es wirklich sinnvoll ist Globale Variablen zu meiden sei mal völlig dahingestellt. Dazu wurden schon Diskussionen ergebnisoffen im EN-Forum geführt.Das Bsp. ist denke ich selbsterklärend:
Spoiler anzeigen
[autoit]_A(2,3) ; = Summe + 6
[/autoit] [autoit][/autoit] [autoit]
_A(4,4) ; = Summe + 16
_A(5,4) ; = Summe + 20
ConsoleWrite('Summe: ' & _ManageVars('Summe') & @LF)
_B(5,3) ; = Summe + 2
_B(12,3) ; = Summe + 9
ConsoleWrite('Summe: ' & _ManageVars('Summe') & @LF)Func _A($a, $b)
[/autoit] [autoit][/autoit] [autoit]
Local $Summe = _ManageVars('Summe') ; == Wert abfragen
If @error Then ; == $Summe wurde noch nicht verwendet - noch ohne Wert
_ManageVars('Summe', False, $a * $b) ; == Wert setzen
Else
_ManageVars('Summe', False, $Summe + $a * $b)
EndIf
EndFuncFunc _B($a, $b)
[/autoit] [autoit][/autoit] [autoit]
Local $Summe = _ManageVars('Summe')
If @error Then
_ManageVars('Summe', False, $a - $b)
Else
_ManageVars('Summe', False, $Summe + ($a - $b))
EndIf
EndFunc;===============================================================================
[/autoit]
; Function Name....: _ManageVars
; Description......: Verwaltung von global anwendbaren Variablen in Lokalem Namespace
; Parameter(s).....: $_sVar Variablenname (mit oder ohne "$")
; .................: $_fGet "True" (Standard) fragt Wert ab, "False" um Wert zu setzen
; .................: $_vVal Wenn Wert gesetzt wird, der Variablenwert
; Return Value(s)..: (nur bei Get) Erfolg Der Variablenwert
; .................: Fehler 0 @error=1 angefragte Variable noch nicht hinterlegt
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _ManageVars($_sVar, $_fGet=True, $_vVal=0)
Local Static $oVars = ObjCreate("Scripting.Dictionary")
If $_fGet Then
If $oVars.Exists($_sVar) Then
Return $oVars.Item($_sVar)
Else
Return SetError(1,0,0)
EndIf
Else
If $oVars.Exists($_sVar) Then
$oVars.Item($_sVar) = $_vVal
Else
$oVars.Add($_sVar, $_vVal)
EndIf
EndIf
EndFunc ;==>_ManageVars -
2. Global ist hier nicht nötig und sollte nicht benutzt werden.
Woraus ziehst du diesen Schluß?
Wenn du in AutoIt eine Variable erstellst ohne speziellen Namespace wird diese automatisch als Global behandelt.Zitat von AutoIt HilfeA variable's scope is controlled by when and how you declare the variable. If you declare a variable at the start of your script and outside any functions it exists in the Global scope
[autoit]
Folgende Situation im Hauptskript ist vom Namensraum daher absolut identisch:
[/autoit]
$Variable1 = "Wert"
Global $Variable2 = "Wert"Ich stimme dir zu, dass die Anwendung Globaler Variablen möglichst minimiert sein soll (wobei die Meinungen dazu auch weit auseinandergehen, ich hatte einen Thread aus dem EN-Forum dazu mal hier im Forum eingebracht). Seit der Möglichkeit mit Static-Variablen zu arbeiten ist dieses auch wesentlich einfacher geworden. Ich habe das z.T. so gelöst, dass ich in einer Verwaltungs-Funktion alle global erforderlichen Variablen statisch lokal ablege und mit entsprechendem Aufrufparameter den Wert einer jeweiligen Variable abfrage oder setze. So kann man die Variablen ausschließlich im Localen Namespace halten und trotzdem im gesamten Skript darauf zugreifen. Wenn das Skript allerdings sehr auf Geschwindigkeit orientiert ist, werden wohl die ms zum Abfragen/Setzen schon wieder zu viel sein.

-
-
Hast du vergessen _GUICtrlListView_Formatting_Startup aufzurufen?
Das Skript läuft problemlos unter XP u. Win7 32/64 Bit. Allerdings könnte es Probleme geben, wenn du es als 64Bit kompilieren willst - das dürfte schief gehen. -
2 Sachen
- kpl. Zeilen in einer Farbe einfärben geht mit nativen Funktionen. ID von GUICtrlCreateListViewItem auffangen und mit GUICtrlSetBkColor einfärben
- sollen einzelne Zellen unterschiedlich gefärbt werden, schau bitte hier -
misterspeed
Deine Lösung hat einen Haken: Du berücksichtigst nicht, dass die Taskbar 4 mögliche Positionen und unterschiedliche Maße haben kann. Hiermit kannst du Position und Maße abfragen.
-
Habe die Includes und die Schleife hinzugefügt.

-
Da hatte ich ein recht umfangreiches Skript fix und fertig, schön mit Rebar gestaltet. Schicke es meinem Kollegen und der fragt was das soll - nur in einer Ecke irgendwelche Button - sonst nix. (Ich habe Win7, er XP) Das habe ich dann mal in VirtualXP angesehen und tatsächlich: _GUICtrlRebar_AddBand() bleibt wirkungslos und somit landen alle Ctrl der Bänder an Pos 0,0 übereinander. :pinch:
Da Programme aber abwärtskompatibel zu XP sein sollten habe ich mir nun eine Rebar optisch nachgebaut (die Funktionalität ist natürlich nicht dabei). Dazu habe ich einfach Groups missbraucht. Man muss sie etwas vergewaltigen um sie dort anzuzeigen wo man will.
Denn die Group behält Platz für Beschriftung vor - ich möchte aber nur die reine Linie anzeigen. Aber schauts euch einfach an.
Das Skript hier verwendet allerdings Pfade für lokale Icondateien, entweder ihr ersetzt das mit eigenen Pfaden oder kommentiert es aus. Ist für die Rebarsimulation aber nicht wichtig.Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. Spoiler anzeigen
[autoit]#include <ButtonConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>$Gui = GUICreate("PB Log-To-Report", 609, 595)
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor(0xD3DAED)#Region - PseudoRebar
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateGroup('', 0, -7, 609, 34)
GUICtrlCreateLabel('Log-Datei', 16, 6, 80, 17)
$inLog = GUICtrlCreateInput('', 100, 3, 450, 20)
GUICtrlSendMsg($inLog, 0x1501, 0, " Log-Datei mit Button auswählen")
$btLogOpen = GUICtrlCreateButton('', 571, 2, 22, 22, $BS_ICON)
;~ GUICtrlSetImage(-1, $sPath & "log.ico")
GUICtrlSetTip(-1, "Pfad zur Logdatei auswählen")
GUICtrlCreateGroup("", -99, -99, 1, 1)GUICtrlCreateGroup('', 0, 20, 609, 34)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateLabel('Report-Datei', 16, 33, 80, 17)
$inReport = GUICtrlCreateInput('', 100, 31, 450, 20)
GUICtrlSendMsg($inReport, 0x1501, 0, " Speicherort Report-Datei mit Button auswählen")
$btReport = GUICtrlCreateButton('', 571, 30, 22, 22, $BS_ICON)
;~ GUICtrlSetImage(-1, $sPath & "report.ico")
GUICtrlSetTip(-1, "Speicherort für die Reportdatei festlegen")
GUICtrlCreateGroup("", -99, -99, 1, 1)GUICtrlCreateGroup('', 0, 47, 609, 35)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateLabel("Name Patient", 16, 62, 80, 17)
$inName = GUICtrlCreateInput('', 100, 59, 225, 20)
GUICtrlSendMsg($inName, 0x1501, 0, " optional: Patientenname / Identschlüssel")
GUICtrlCreateLabel("Gerät-SN", 335, 62, 60, 17)
$inGeraet = GUICtrlCreateInput('', 395, 59, 155, 20)
$btConfig = GUICtrlCreateButton('', 571, 58, 22, 22, $BS_ICON)
;~ GUICtrlSetImage(-1, $sPath & "config.ico")
GUICtrlSetTip(-1, "Programm Einstellungen")
GUICtrlCreateGroup("", -99, -99, 1, 1)GUICtrlCreateGroup('', 0, 75, 609, 35)
[/autoit] [autoit][/autoit] [autoit]
$btLogfileEvents = GUICtrlCreateButton("Daten Lesen", 16, 86, 82, 22)
GUICtrlSetColor(-1, 0x000080)
GUICtrlSetBkColor(-1, 0xD3DAED)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetTip(-1, "Nutzungsdaten aus Log-Datei auslesen")
GUICtrlCreateLabel('Datum von', 110, 90, 60, 17)
$cbFrom = GUICtrlCreateCombo("", 170, 86, 155, 22, BitOR($WS_VSCROLL,$CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlCreateLabel('Datum bis', 335, 90, 60, 17)
$cbTo = GUICtrlCreateCombo("", 395, 86, 155, 22, BitOR($WS_VSCROLL,$CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$btHelp = GUICtrlCreateButton('', 571, 86, 22, 22, $BS_ICON)
;~ GUICtrlSetImage(-1, $sPath & "help.ico")
GUICtrlSetTip(-1, "Hilfe")
GUICtrlCreateGroup("", -99, -99, 1, 1)GUICtrlCreateGroup('', 0, 103, 609, 35)
[/autoit] [autoit][/autoit] [autoit]
$btRangeSelect = GUICtrlCreateButton("Zeitraum Übernehmen", 16, 114, 130, 22)
GUICtrlSetColor(-1, 0x000080)
GUICtrlSetBkColor(-1, 0xD3DAED)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetTip(-1, "Detaildaten aus Von-Bis Zeitraum in Tabelle einlesen")
$btClear = GUICtrlCreateButton("Eingaben Löschen", 195, 114, 130, 22)
GUICtrlSetColor(-1, 0x000080)
GUICtrlSetBkColor(-1, 0xD3DAED)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetTip(-1, "Alle Eingaben löschen")
GUICtrlCreateLabel('Report', 335, 118, 55, 17)
$btPreviewReport = GUICtrlCreateButton("Vorschau", 395, 114, 90, 22)
GUICtrlSetColor(-1, 0x000080)
GUICtrlSetBkColor(-1, 0xD3DAED)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetTip(-1, "Report in Vorschau anzeigen")
$btCreateReport = GUICtrlCreateButton("Erstellen", 503, 114, 90, 22)
GUICtrlSetColor(-1, 0x000080)
GUICtrlSetBkColor(-1, 0xD3DAED)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetTip(-1, "Report erstellen und im Standard Editor öffnen")
GUICtrlCreateGroup("", -99, -99, 1, 1)
#EndRegion - PseudoRebarGUISetState()
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit]
Until GUIGetMsg() = -3 -
Ich weiß nicht ob es sinnvoll ist, sich mit dieser (zurückgezogenen) Beta auseinanderzusetzen. Im Moment weiß niemand wohin die Reise geht. Ich würde also erstmal abwarten was denn tatsächlich Einzug in die nächste Version hält.
-
Naja so weit ich weis ist autoit nicht multitasking faehig.
Das ist ein Spruch den ich schon von geschätzt hundert Leuten gehört habe. Und nur einer konnte mir eine Anwendung nennen, die ausschließlich mit echtem Multitasking lauffähig war.
Der Begriff Multitasking wird so oft einfach in den Raum geworfen, ohne zu hinterfragen ob man das überhaupt braucht. Insofern ist aus meiner Sicht Multitasking-Fähigkeit das allerletzte Kriterium zur Bewertung.