Verbinde eine Funktion mit $GUI_EVENT_PRIMARYUP. Darin fragst du das geklickte (selektierte) Item ab - mit _GUICtrlTreeView_GetSelection(). Mit _GUICtrlTreeView_GetText() kannst du dir den Text des Item ausgeben lassen.
Beiträge von BugFix
-
-
Ob man sowas tatsächlich braucht - darüber läßt sich sicher streiten

Im Forum gab es diese Fragestellung und ich habe das nun in eine UDF gepackt: ToolTip per Maus verschieben.Edit 16.05.2014: Bsp. erweitert
ToolTipMove.au3 (v.01)
[autoit]#Region - TimeStamp
[/autoit] [autoit][/autoit] [autoit]
; 2014-05-15 13:55:54 v 0.1
#EndRegion - TimeStamp#cs =========================================================== Funktionen =====
[/autoit] [autoit][/autoit] [autoit]_TTMove_StartUp()
[/autoit] [autoit][/autoit] [autoit]
Initialisiert die UDF_TTMove_ShutDown() ( optional )
[/autoit] [autoit][/autoit] [autoit]
Freigeben der Ressourcen - automatisch bei Programmende_TTMove_RegisterTip()
[/autoit] [autoit][/autoit] [autoit]
Registrieren eines ToolTips für die UDF_TTMove_UnRegisterTip()
[/autoit] [autoit][/autoit] [autoit]
ToolTip aus der Registrierung entfernen==================================================================================
[/autoit] [autoit][/autoit] [autoit]#ce
[/autoit] [autoit][/autoit] [autoit]#include-once
[/autoit] [autoit][/autoit] [autoit]
#include <WinAPI.au3>
#include <WindowsConstants.au3>OnAutoItExitRegister('__TTMove_Exit')
[/autoit] [autoit][/autoit] [autoit]
Global Const $__HC_ACTION = 0Global $__oTTTitle
[/autoit] [autoit][/autoit] [autoit]
Global $__hStub_MouseProc
Global $__hmod
Global $__hHook
Global $fLeftPressDown, $fMoveFunc _TTMove_StartUp()
[/autoit] [autoit][/autoit] [autoit]
$__oTTTitle = ObjCreate('Scripting.Dictionary')
$__hStub_MouseProc = DllCallbackRegister("__TTMove_MouseProc", "long", "int;wparam;lparam")
$__hmod = _WinAPI_GetModuleHandle(0)
$__hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($__hStub_MouseProc), $__hmod)
$fLeftPressDown = False
$fMove = False
EndFuncFunc _TTMove_ShutDown()
[/autoit] [autoit][/autoit] [autoit]
$__oTTTitle = 0
$__hmod = 0
__TTMove_Exit()
EndFuncFunc _TTMove_RegisterTip($_sTitle)
[/autoit] [autoit][/autoit] [autoit]
If Not $__oTTTitle.Exists($_sTitle) Then
$__oTTTitle.Add($_sTitle, 1)
Return 1
Else
Return 0
EndIf
EndFuncFunc _TTMove_UnRegisterTip($_sTitle)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
If $__oTTTitle.Exists($_sTitle) Then
$__oTTTitle.Remove($_sTitle)
Return 1
Else
Return 0
EndIf
EndFunc; == internal Functions
[/autoit] [autoit][/autoit] [autoit]Func __TTMove_GetHwnd()
[/autoit] [autoit][/autoit] [autoit]
For $tip In $__oTTTitle.Keys
If WinExists($tip) Then
Return WinGetHandle($tip)
EndIf
Next
Return 0
EndFuncFunc __TTMove_MouseProc($nCode, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $event, $info, $iX, $iY
$info = DllStructCreate("int X;int Y;dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo", $lParam)
$iX = DllStructGetData($info, 1)
$iY = DllStructGetData($info, 2)
$mouseData = DllStructGetData($info, 3)
If $nCode < 0 Then Return _WinAPI_CallNextHookEx($__hHook, $nCode, $wParam, $lParam)
If $nCode = $__HC_ACTION Then
Switch $wParam
Case $WM_MOUSEMOVE
__TTMove_MoveWnd(__TTMove_GetHwnd(), $iX, $iY)
Case $WM_LBUTTONDOWN
If __TTMove_MoveWnd(__TTMove_GetHwnd(), $iX, $iY, True) = 1 Then $fLeftPressDown = True
Case $WM_LBUTTONUP
If __TTMove_MoveWnd(__TTMove_GetHwnd(), $iX, $iY) = 1 Then
$fLeftPressDown = False
$fMove = False
EndIf
EndSwitch
EndIf
Return _WinAPI_CallNextHookEx($__hHook, $nCode, $wParam, $lParam)
EndFuncFunc __TTMove_MoveWnd($_hToolTip, $_x, $_y, $_fSet=False)
[/autoit] [autoit][/autoit] [autoit]
If $_hToolTip = 0 Then Return 0
Local $aPos = WinGetPos($_hToolTip)
Local Static $xLast, $yLast
If $_fSet Then
If $_x < $aPos[0] Or $aPos[0]+$aPos[2] < $_x Or $_y < $aPos[1] Or $aPos[1]+$aPos[3] < $_y Then Return 0
$xLast = $_x
$yLast = $_y
$fMove = True
Return 1
EndIf
If Not $fMove Then Return 0
Local $xDiff = ($_x) - ($xLast)
Local $yDiff = ($_y) - ($yLast)
$xLast = $_x
$yLast = $_y
WinMove($_hToolTip, '', $aPos[0]+($xDiff), $aPos[1]+($yDiff))
Return 1
EndFuncFunc __TTMove_Exit()
[/autoit]
_WinAPI_UnhookWindowsHookEx($__hHook)
DllCallbackFree($__hStub_MouseProc)
EndFunc ;==>OnAutoItExitBeispiel
[autoit]#include 'ToolTipMove.au3'
[/autoit] [autoit][/autoit] [autoit]HotKeySet('^!{F9}', '_exit') ; Ctrl+Alt+F9 zum Beenden
[/autoit] [autoit][/autoit] [autoit]
HotKeySet('^!{F10}', '_switchTip') ; Ctrl+Alt+F10 -- wechselt zwischen Tip#1 und Tip#2
HotKeySet('^!{F11}', '_unregister') ; Ctrl+Alt+F11 -- UnRegister Tip#1 - nur noch Tip#2 verschiebbarGlobal $sToolTip1 = "Das ist ein Test-Tool-Tipp [1]"
[/autoit] [autoit][/autoit] [autoit]
Global $sToolTip2 = "Das ist ein Test-Tool-Tipp [2]"_TTMove_StartUp()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_TTMove_RegisterTip($sToolTip1)
_TTMove_RegisterTip($sToolTip2)ToolTip($sToolTip1)
[/autoit] [autoit][/autoit] [autoit]While True
[/autoit] [autoit][/autoit] [autoit]
Sleep(50)
WEndFunc _switchTip()
[/autoit] [autoit][/autoit] [autoit]
Local Static $aTip[2] = [$sToolTip1,$sToolTip2]
Local Static $iCurr = 0
ToolTip('')
$iCurr = BitXOR($iCurr,1)
ToolTip($aTip[$iCurr])
EndFuncFunc _unregister()
[/autoit] [autoit][/autoit] [autoit]
_TTMove_UnRegisterTip($sToolTip1)
EndFuncFunc _exit()
[/autoit]
Exit
EndFunc -
Du kannst den Tooltip durch Klicken & Ziehen bewegen, indem du MouseDown / MouseMove / MouseUp verwendest um bei diesen Aktionen den ToolTip zu bewegen, wenn diese Mausaktionen auf der Tooltipfläche stattfinden:
Spoiler anzeigen
[autoit]#include <WinAPI.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
OnAutoItExitRegister('OnAutoItExit')Global Const $HC_ACTION = 0
[/autoit] [autoit][/autoit] [autoit]
Global $hStub_MouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
Global $hmod = _WinAPI_GetModuleHandle(0)
Global $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod)
Global $fLeftPressDown = False, $fMove = FalseHotKeySet('^!{F9}', '_exit') ; Ctrl+Alt+F9 zum Beenden
[/autoit] [autoit][/autoit] [autoit]Global $fActive = False
[/autoit] [autoit][/autoit] [autoit]
Global $hToolTipGlobal $sTitleToolTip = "Das ist ein Test" ; zwingend als Variable anlegen, um den richtigen Tooltip zu treffen
[/autoit] [autoit][/autoit] [autoit]ToolTip($sTitleToolTip)
[/autoit] [autoit][/autoit] [autoit]While True
[/autoit] [autoit][/autoit] [autoit]
$hToolTip = _GetToolTipHwnd()
If Not $fActive Then
If $hToolTip <> 0 Then $fActive = True
Else
If Not $hToolTip Then $fActive = False
EndIf
Sleep(50)
WEndFunc _GetToolTipHwnd()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
If WinExists($sTitleToolTip) Then
Return WinGetHandle($sTitleToolTip)
Else
Return 0
EndIf
EndFuncFunc _exit()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFuncFunc _MouseProc($nCode, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $event, $info, $iX, $iY
$info = DllStructCreate("int X;int Y;dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo", $lParam)
$iX = DllStructGetData($info, 1)
$iY = DllStructGetData($info, 2)
$mouseData = DllStructGetData($info, 3)
If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
If $nCode = $HC_ACTION Then
Switch $wParam
Case $WM_MOUSEMOVE
_ToolTipMove($iX, $iY)
Case $WM_LBUTTONDOWN
If _ToolTipMove($iX, $iY, True) = 1 Then $fLeftPressDown = True
Case $WM_LBUTTONUP
If _ToolTipMove($iX, $iY) = 1 Then
$fLeftPressDown = False
$fMove = False
EndIf
EndSwitch
EndIf
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFuncFunc _ToolTipMove($_x, $_y, $_fSet=False)
[/autoit] [autoit][/autoit] [autoit]
If $hToolTip = 0 Then Return 0
Local $aPos = WinGetPos($hToolTip)
Local Static $xLast, $yLast
If $_fSet Then
If $_x < $aPos[0] Or $aPos[0]+$aPos[2] < $_x Or $_y < $aPos[1] Or $aPos[1]+$aPos[3] < $_y Then Return 0
$xLast = $_x
$yLast = $_y
$fMove = True
Return 1
EndIf
If Not $fMove Then Return 0
Local $xDiff = ($_x) - ($xLast)
Local $yDiff = ($_y) - ($yLast)
$xLast = $_x
$yLast = $_y
WinMove($hToolTip, '', $aPos[0]+($xDiff), $aPos[1]+($yDiff))
Return 1
EndFuncFunc OnAutoItExit()
[/autoit]
_WinAPI_UnhookWindowsHookEx($hHook)
DllCallbackFree($hStub_MouseProc)
EndFunc ;==>OnAutoItExit -
Das Hochzählen und Überwachen der Variable $UnZipTime mittels AdlibRegister kannst du dir ersparen. Das geht eleganter mit einer Static-Variablen:
Spoiler anzeigen
[autoit];~ global $UnZipTime=0
[/autoit] [autoit][/autoit] [autoit]Func Unzip($path,$tempPath=@TempDir)
[/autoit] [autoit][/autoit] [autoit]
Local Static $UnZipTime = 0
$UnZipTime += 1
If $UnZipTime = 30 Then
$UnZipTime = 0
ProcessClose("7zG.exe")
Return SetError(1,0,-1)
EndIf
;~ AdlibRegister(observateZip(),1000)
_7ZipProgress("7zG.exe", $path, $tempPath, false)
If @error Then Return SetError(2,@error,0) ; Fehler von _7ZipProgress() als @extended-value
;~ AdlibUnRegister(observateZip())
Return 1
EndFuncFunc zip($path,$OutPath)
[/autoit] [autoit][/autoit] [autoit]
$ar=StringSplit($OutPath,".")
_7ZipProgress($s7ZipEXE, $path, $OutPath, True, $ar[UBound($ar)-1])
return 1
EndFunc;~ Func observateZip()
[/autoit] [autoit][/autoit] [autoit]
;~ $UnZipTime+=1
;~ if $UnZipTime=30 then
;~ ProcessClose("7zG.exe")
;~ endif
;~ EndFunc; .....
[/autoit]
In der Funktion _7ZipProgress() machst du eine Fehlerbehandlung aber ohne Return
- ich nehme an, einfach vergessen.Spoiler anzeigen
[autoit]While ProcessExists($iPID)
[/autoit]
$aProcessStats = ProcessGetStats($iPID, 1)
If $aProcessStats = 0 Then
;~ SetError(3, Default, 0) <<<<== so passiert nix
Return SetError(3, Default, 0) ;<<<<== sicher so gemeint
EndIf
Sleep($iUpdateRate)
WEnd -
Vielleicht erfüllt das hier schon deinen Zweck: Listview-Datenbank-Beispiel
Wenn es richtige DB-Funktionalität haben soll, würde ich aber auf SQLite zurückgreifen. -
Schau dir mal mit dem AutoIt-Window-InfoTool das Fenster genau an. Ist evtl. die CLASS auslesbar? Dann kannst du dir den Zugriff über den Titel schenken und die CLASS verwenden. Ansonsten kannst du mit der Option "WinTitleMatchMode" festlegen, dass auch Teile des Fenstertitels zur Erkennung genügen. Ich vermute ein Teil des Fensternamens wird immer identisch sein.
-
Ich kann das Problem nicht reproduzieren. Ein Kopieren eines Dictionary in eine andere Variable funktioniert tadellos:
[autoit]
[/autoit][autoit][/autoit][autoit]
$oDict = ObjCreate("Scripting.Dictionary")$oDict.Add('A',1)
[/autoit][autoit][/autoit][autoit]
$oDict.Add('B',2)
$oDict.Add('C',3)
$oDict.Add('D',4)$oDictCopy = $oDict
[/autoit][autoit][/autoit][autoit]For $k in $oDictCopy.Keys
[/autoit][autoit][/autoit][autoit]
ConsoleWrite($k & @TAB & $oDictCopy.Item($k) & @LF)
Next#cs -- OUTPUT
[/autoit]
A 1
B 2
C 3
D 4
#ce -
Ich würde kalte Luft ansaugen lassen. Wenn du die Lüftung in ein geschlossenes System bekommst, kannst du die warme Luft zusätzlich auch ausblasen.
Nur warme Luft rausblasen ist wenig effektiv, wenn das System offen ist. Dann würdest du die gesamte Raumluft bewegen (müssen), sind etliche Kubikmeter.
Besser über einen dezidierten Querschnitt kalte Luft ansaugen und direkt dem Gerät zuführen. Die anschließend erwärmte Luft eignet sich im Winter gut als Zusatzheizung
-- im Sommer schwitzt du dann halt etwas mehr 
-
Ich bin mir nicht sicher, aber versuchs mal ohne das ; am Ende. Bei Sqlite wird das auch nicht benötigt.
Es ist niemals verkehrt, eine Sequenz mit dem Semikolon zu terminieren. Zu einem Fehler führt das nicht. Unerheblich ob es "gebraucht" wird (wenn mehr als ein Befehl ausgeführt wird, ist es sowieso zwingend), ist es einfach auch guter Stil Befehlsfolgen immer zu terminieren. -
Kennst du die Abluftkanäle für Küchen/Bad/WC? Sind aus Plastik meist rechteckiger Querschnitt (ca. 6x10 cm), gibt es aber auch in Schlauchform.
Holt euch sowas als Frischluftzufuhr. Eine Seite direkt an die Gebäudeaussenwand/-Tür mit 'nem groben Staubfilter vor (den ihr dann aber auch regelmäßig säubert ;)) und an der anderen Seite steht der Beamer und saugt seine Luft, evtl. noch einen Lüfter zum besseren Ansaugen in den Kanal.
Dann sollten Überhitzungen passé sein. -
Wie ich das sehe, verwendest du als variable Daten Adressen. Da ist es doch günstiger, wenn du dein Dokument auch mit entsprechenden Datenfeldern ausstattest. Dann kannst du die Datenfelder direkt setzen ohne Suchen & Ersetzen.
Wenn du sowas noch nicht gemacht hast - schau dir in Word die Serienbrief-Funktion an und lass das mal mit dem Wizzard ausführen. Das sollte beim Verständnis helfen. -
Wäre mir neu, dass SQL-Datenbanken (egal welcher Dialekt) numerische Datenfelder in Stringsortierung ausgeben.
-
Neue Funktionen, INSERT überarbeitet.
s. Startpost -
Kleiner Nachtrag:
Wenn du deine Objekte elegant an den Zellen ausrichten möchtest, kannst du das so tun:
Spoiler anzeigen
[autoit]$oForm = $oExcel.ActiveSheet.OLEObjects.Add("Forms.TextBox.1")
[/autoit]
With $oForm
.Left=$oExcel.ActiveSheet.Range("D10").Left ; Ausrichtung an linkem Rand von "D10"
.Top=$oExcel.ActiveSheet.Range("D10").Top ; Ausrichtung an oberem Rand von "D10"
.Width=90.75
.Height=15.75
.Link=False
.DisplayAsIcon=False
.Select
EndWith -
Wenn du mehrere OLE-Objekte hinzufügst, musst du diese aber dann direkt ansprechen:
Spoiler anzeigen
[autoit]$oForm = $oExcel.ActiveSheet.OLEObjects.Add("Forms.TextBox.1")
[/autoit]
With $oForm
.Left=399.75
.Top=259.5
.Width=90.75
.Height=15.75
.Link=False
.DisplayAsIcon=False
.Select
EndWith -
Du mußt die Parameter auf die erstellte Box anwenden.
[autoit]
Die Zellauswahl ist übrigens ohne Nutzen, die Box wird an der übergebenen Position fixiert, völlig egal ob da E10 oder A5 ist.
$oExcel.ActiveSheet.OLEObjects.Add("Forms.TextBox.1")
[/autoit]
With $oExcel.ActiveSheet.OLEObjects
.Left=399.75
.Top=259.5
.Width=90.75
.Height=15.75
.Link=False
.DisplayAsIcon=False
.Select
EndWith -
Suchen & Ersetzen geht mit Standardfunktion ausschließlich im Body.
Um im gesamten Dokument (Header, Footer, Textfeld, etc. pp.) zu Suchen & Ersetzen mußt du durch alle Bestandteile des Dokuments iterieren und darauf Suchen&Ersetzen anwenden.
Wie es geht, ist hier beschrieben.Der Einfachheit halber würde ich das auch als Makro erstellen und nur das Makro aus AutoIt heraus aufrufen (mit Übergabe Such-/ Ersetztext). Denn dieser VBA-Code enthält in der Sub "SearchAndReplaceInStory" die Zeile
.Execute Replace:=wdReplaceAll
Das blaue ist der Problemteil. Die MSDN-Beschreibung zu Range.Find.Execute läßt offen, welches die Defaultwerte sind. Wenn ich in AutoIt diese Methode aufrufe, muß ich alle Parameter übergeben (VBA braucht nur den/die gewünschten angeben). Deshalb brauche ich die Standardwerte.
Aber das könnte man sicher auch hinfrickeln. Probier einfach mal. -
Ja klar ersetzt du die kpl. Kopfzeile, ist doch der einfachste Weg:
- Kopfzeile alt auslesen
- wie gewollt zu neuer Kopfzeile ändern
- Kopfzeile neu schreiben -
Gefällt mir.

Ließe sich auch eine tabellenartige Struktur generieren?
Hintergrund: Ich habe eine Rechnungs-Software geschrieben, die Daten zum Druck aus einer SQLite-DB bezieht. Bisher schreibe ich diese Daten aus der DB in eine formatierte Excel-Tabelle, und drucke diese über einen PDF-Printer in eine PDF-Datei. Wenn ich mir den Schritt mit dem Excel sparen könnte, wäre das natürlich viel eleganter.
Der Rechnungsaufbau ist wie üblich (Firmenkopf; Adressfeld; Feld mit Datum/Sachbearbeiter etc.; Zeile mit RE-Nr.; tabellarisch: Lieferungen/Leistungen, Anzahl, Netto, Brutto; Zahlungsinformationen; Fußzeile mit Konto- u. Steuerinfo).
Es sind also etwas fixer Text und fest positionierte Felder, die mit wechselnden Inhalten versorgt werden müssen. Könnte AuPDF das stemmen? -
Naja. Mein PC ist auch online, und per Ping erreichbar... Trotzdem läuft nicht zwangsläufig ein HTTP-Server.
Das ist Haarspalterei. Du wirst ja wohl nicht versuchen dich mit einem Host zu verbinden, auf dem gar kein http-Server läuft. (..obwohl, chess - dir traue ich so manches zu
)