Auch von mir Alles Gute und ein Geschenk ![]()
[Blockierte Grafik: http://www.pittivomdorf.de/media/DIR_15001/euka.jpg]
Auch von mir Alles Gute und ein Geschenk ![]()
[Blockierte Grafik: http://www.pittivomdorf.de/media/DIR_15001/euka.jpg]
Opt("GUIOnEventMode", 1)
[/autoit]GUICtrlSetOnEvent (1, "go") ???
Schau mal hier: http://www.autoitscript.com/forum/index.php?showtopic=73993&hl=printer++remote - Vielleicht hilft das weiter.
Noch was: http://www.autoitscript.com/forum/index.php?showtopic=37367&hl=printer++remote
Belohnung sind Einhundertelftausendeinhundertelf Popups/Layer auf beliebiger Adresse. (Das sind über 100000 Besucher/Layereinblendungen)
Was soll man denn damit anfangen? ![]()
Hätte nicht mal für eines Verwendung. ![]()
Wie ermittele ich denn die nächste? Und kann man die Maus dann überhaupt noch bewegen wenn das in einer endlos-Schleife ist?
Sowas solltest du nicht in einer Schleife machen. Du mußt die entsprechenden MessageCodes verwenden (GUIRegisterMessage).
ZitatWie ermittele ich denn die nächste?
Wie wärs mit Rechnen? Bsp.: Du bist über Pos. x=224, y=312. Dein Raster ist 5x5. Dann einfach die Werte auf den nächsten 5-er runden. Also x=225, y=310.
Wie kann ich ein Hintergrundbild "wiederholen" lassen, so dass die ganze GUI bedeckt ist?
Verstehe nicht, was du mit Wiederholen meinst. Erklär mal genauer, was wann und warum geschieht (od. auch nicht).
Wie kann ich spezielle Punkte "magnetisch" machen, deren Koordinaten ich kenne?
Stichwort: Grid - Du hinterlegst ein Raster (5x5 od. 10x10 ....Pixel). Wenn du mit der Maus über der GUI bist vergleichst du Positionen und beim MOUSE_UP Event dockst du an die nächstgelegene Rasterposition.
Wie finde ich heraus, ob der Anwender in einem bestimmten Bereich herein geklickt hat?
Vergleichen Mausposition bei MOUSE_DOWN mit GUI-Koordinaten. (Such mal bei Skripten nach "Doppelklick für (fast) jedes Control", darin hatte ich Ähnliches genutzt.
Ist Drag&Drop möglich?
Du kannst es ermöglichen. Prüfen ob die entsprechenden Bedingungen erfüllt sind (so etwa: MOUSE_DOWN, Koordinate=Ctrl, MOUSE_MOVE, MOUSE_UP über erlaubten Koordinaten)
Schau dir mal das QR-Code Protokoll an, das könnte dir einen Weg zeigen.
So ist es z.B. in Notepad++ gelöst, per xml-Datei:
<NotepadPlus>
<UserLang name="AutoIt3" ext="au3 au2">
<Settings>
<Global caseIgnored="yes" />
<TreatAsSymbol comment="no" commentLine="no" />
<Prefix words1="no" words2="no" words3="no" words4="yes" />
</Settings>
<KeywordLists>
<Keywords name="Delimiters">"'0"'0</Keywords>
<Keywords name="Folder+"></Keywords>
<Keywords name="Folder-"></Keywords>
<Keywords name="Operators">- & ( ) * . / [ ] ^ { } + < = ></Keywords>
<Keywords name="Comment"> 1#cs 1#comments-start 2#ce 2#comments-end 0; 0;~ 0</Keywords>
<Keywords name="Words1">Abs ACos AdlibDisable AdlibEnable Asc ASin Assign ATan AutoItSetOption AutoItWinGetTitle AutoItWinSetTitle BitAND BitNOT BitOR BitShift BitXOR BlockInput Break Call CDTray Chr ClipGet ClipPut ConsoleWrite ControlClick ControlCommand ControlDisable ControlEnable ControlFocus ControlGetFocus ControlGetHandle ControlGetPos ControlGetText ControlHide ControlListView ControlMove ControlSend ControlSetText ControlShow Cos Dec DirCopy DirCreate DirGetSize DirMove DirRemove DllCall DllClose DllOpen DriveGetDrive DriveGetFileSystem DriveGetLabel DriveGetSerial DriveGetType DriveMapAdd DriveMapDel DriveMapGet DriveSetLabel DriveSpaceFree DriveSpaceTotal DriveStatus EnvGet EnvSet EnvUpdate Eval Exp FileChangeDir FileClose FileCopy FileCreateShortcut FileDelete FileExists FileFindFirstFile FileFindNextFile FileGetAttrib FileGetLongName FileGetShortcut FileGetShortName FileGetSize FileGetTime FileGetVersion FileInstall FileMove FileOpen FileOpenDialog FileRead FileReadLine FileRecycle FileRecycleEmpty FileSaveDialog FileSelectFolder FileSetAttrib FileSetTime FileWrite FileWriteLine FtpSetProxy GUICreate GUICtrlCreateAvi GUICtrlCreateButton GUICtrlCreateCheckbox GUICtrlCreateCombo GUICtrlCreateContextMenu GUICtrlCreateDate GUICtrlCreateDummy GUICtrlCreateEdit GUICtrlCreateGroup GUICtrlCreateIcon GUICtrlCreateInput GUICtrlCreateLabel GUICtrlCreateList GUICtrlCreateListView GUICtrlCreateListViewItem GUICtrlCreateMenu GUICtrlCreateMenuitem GUICtrlCreatePic GUICtrlCreateProgress GUICtrlCreateRadio GUICtrlCreateSlider GUICtrlCreateTab GUICtrlCreateTabItem GUICtrlCreateTreeView GUICtrlCreateTreeViewItem GUICtrlCreateUpdown GUICtrlDelete GUICtrlGetState GUICtrlRead GUICtrlRecvMsg GUICtrlSendMsg GUICtrlSendToDummy GUICtrlSetBkColor GUICtrlSetColor GUICtrlSetCursor GUICtrlSetData GUICtrlSetFont GUICtrlSetImage GUICtrlSetLimit GUICtrlSetOnEvent GUICtrlSetPos GUICtrlSetResizing GUICtrlSetState GUICtrlSetStyle GUICtrlSetTip GUIDelete GUIGetCursorInfo GUIGetMsg GUISetBkColor GUISetCoord GUISetCursor GUISetFont GUISetHelp GUISetIcon GUISetOnEvent GUISetState GUIStartGroup GUISwitch Hex HotKeySet HttpSetProxy InetGet InetGetSize IniDelete IniRead IniReadSection IniReadSectionNames IniWrite InputBox Int IsAdmin IsArray IsDeclared IsFloat IsInt IsNumber IsString Log MemGetStats Mod MouseClick MouseClickDrag MouseDown MouseGetCursor MouseGetPos MouseMove MouseUp MouseWheel MsgBox Number Opt Ping PixelChecksum PixelGetColor PixelSearch ProcessClose ProcessExists ProcessList ProcessSetPriority ProcessWait ProcessWaitClose ProgressOff ProgressOn ProgressSet Random RegDelete RegEnumKey RegEnumVal RegRead RegWrite Round Run RunAsSet RunWait Send SetError SetExtended Shutdown Sin Sleep SoundPlay SoundSetWaveVolume SplashImageOn SplashOff SplashTextOn Sqrt StatusbarGetText String StringAddCR StringFormat StringInStr StringIsAlNum StringIsAlpha StringIsASCII StringIsDigit StringIsFloat StringIsInt StringIsLower StringIsSpace StringIsUpper StringIsXDigit StringLeft StringLen StringLower StringMid StringReplace StringRight StringSplit StringStripCR StringStripWS StringTrimLeft StringTrimRight StringUpper Tan TimerDiff TimerInit ToolTip TrayTip UBound WinActivate WinActive WinClose WinExists WinGetCaretPos WinGetClassList WinGetClientSize WinGetHandle WinGetPos WinGetProcess WinGetState WinGetText WinGetTitle WinKill WinList WinMenuSelectItem WinMinimizeAll WinMinimizeAllUndo WinMove WinSetOnTop WinSetState WinSetTitle WinSetTrans WinWait WinWaitActive WinWaitClose WinWaitNotActive</Keywords>
<Keywords name="Words2">@AppDataCommonDir @AppDataDir @AutoItExe @AutoItVersion @CommonFilesDir @Compiled @ComputerName @ComSpec @CR @CRLF @DesktopCommonDir @DesktopDir @DesktopHeight @DesktopWidth @DesktopDepth @DesktopRefresh @DocumentsCommonDir @error @extended @FavoritesCommonDir @FavoritesDir @GUI_CtrlId @GUI_CtrlHandle @GUI_WinHandle @HomeDrive @HomePath @HomeShare @HOUR @InetGetActive @InetGetBytesRead @IPAddress1 @IPAddress2 @IPAddress3 @IPAddress4 @LF @LogonDNSDomain @LogonDomain @LogonServer @MDAY @MIN @MON @MyDocumentsDir @NumParams @OSBuild @OSLang @OSServicePack @OSTYPE @OSVersion @ProgramFilesDir @ProgramsCommonDir @ProgramsDir @ScriptDir @ScriptFullPath @ScriptName @SEC @StartMenuCommonDir @StartMenuDir @StartupCommonDir @StartupDir @SW_DISABLE @SW_ENABLE @SW_HIDE @SW_MAXIMIZE @SW_MINIMIZE @SW_RESTORE @SW_SHOW @SW_SHOWDEFAULT @SW_SHOWMAXIMIZED @SW_SHOWMINIMIZED @SW_SHOWMINNOACTIVE @SW_SHOWNA @SW_SHOWNOACTIVATE @SW_SHOWNORMAL @SystemDir @TAB @TempDir @UserProfileDir @UserName @WDAY @WindowsDir @WorkingDir @YDAY @YEAR #include</Keywords>
<Keywords name="Words3">else case to ExitLoop ContinueLoop ReDim exit then func endfunc while wend do until false true return if endif for next </Keywords>
<Keywords name="Words4">$</Keywords>
</KeywordLists>
<Styles>
<WordsStyle name="DEFAULT" styleID="11" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" />
<WordsStyle name="FOLDEROPEN" styleID="12" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" />
<WordsStyle name="FOLDERCLOSE" styleID="13" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="1" />
<WordsStyle name="KEYWORD1" styleID="5" fgColor="000080" bgColor="FFFFFF" fontName="" fontStyle="3" />
<WordsStyle name="KEYWORD2" styleID="6" fgColor="FF00FF" bgColor="FFFFFF" fontName="" fontStyle="1" />
<WordsStyle name="KEYWORD3" styleID="7" fgColor="0000FF" bgColor="FFFFFF" fontName="" fontStyle="1" />
<WordsStyle name="KEYWORD4" styleID="8" fgColor="800000" bgColor="FFFFFF" fontName="" fontStyle="1" />
<WordsStyle name="COMMENT" styleID="1" fgColor="008000" bgColor="FFFFFF" fontName="Courier New" fontStyle="0" fontSize="10" />
<WordsStyle name="COMMENT LINE" styleID="2" fgColor="008000" bgColor="FFFFFF" fontName="Courier New" fontStyle="0" fontSize="10" />
<WordsStyle name="NUMBER" styleID="4" fgColor="800080" bgColor="FFFFFF" fontName="Courier New" fontStyle="1" fontSize="10" />
<WordsStyle name="OPERATOR" styleID="10" fgColor="FF0000" bgColor="FFFFFF" fontName="" fontStyle="1" />
<WordsStyle name="DELIMINER1" styleID="14" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" />
<WordsStyle name="DELIMINER2" styleID="15" fgColor="808080" bgColor="FFFFFF" fontName="" fontStyle="0" />
<WordsStyle name="DELIMINER3" styleID="16" fgColor="000000" bgColor="FFFFFF" fontName="" fontStyle="0" />
</Styles>
</UserLang>
</NotepadPlus>
Alles anzeigen
Ist es möglich diese Buttons oben rechts in der Ecke (Minimieren, Maximieren, Schließen) nur auf Schließen zu beschränken (s. Koda sObjektinspektor z.B.)
Verwende als EX-Style: $WS_EX_TOOLWINDOW
Die Auswertung geht am Schnellsten mit SQLite. Ich hab das mal umgesetzt und gebe die Werte in die Console aus.
Du kannst auch statt _SQLite_Exec() mit _SQlite_Query() & _SQLite_FetchData() arbeiten. Dann erhältst du als Ergebnis ein Array von dem aus du die Werte in deine GUI eintragen kannst.
#include <SQLite.au3>
#include <SQLite.dll.au3>
Global $file = @ScriptDir & '\test.csv'
Global $aRow, $aCSV, $aSplit, $strSQL = ''
_SQLite_Startup()
_SQLite_Open() ; Datenbank (im Arbeitsspeicher) erstellen
; Tabelle erstellen
_SQLite_Exec(-1, "Create table tblTest (gruppe,m_name,schuetze,gender,result);")
; Werte eintragen
_FileReadToArray($file, $aCSV)
For $i = 1 To UBound($aCSV) -1
$aSplit = StringSplit($aCSV[$i], ';')
$strSQL &= "Insert into tblTest values ("
For $j = 1 To UBound($aSplit) -1
$strSQL &= "'" & $aSplit[$j] & "',"
Next
$strSQL = StringTrimRight($strSQL, 1)
$strSQL &= ");" & @CRLF
Next
_SQLite_Exec(-1, $strSQL)
; Grupenergebnisse
$strSQL = "SELECT gruppe,SUM(result) FROM tblTest WHERE gruppe != '' GROUP BY gruppe;"
_SQLite_Exec(-1, $strSQL, "_cb")
; Ergebnisse Gruppe 'Verein'
$strSQL = "SELECT * FROM tblTest WHERE gruppe = 'Verein' ORDER BY result DESC;"
_SQLite_Exec(-1, $strSQL, "_cb")
; Ergebnisse Gruppe 'Betrieb'
$strSQL = "SELECT * FROM tblTest WHERE gruppe = 'Betrieb' ORDER BY result DESC;"
_SQLite_Exec(-1, $strSQL, "_cb")
; Ergebnisse nach Geschlecht
; männlich
$strSQL = "SELECT schuetze,result FROM tblTest WHERE gender = 'm' ORDER BY result DESC;"
_SQLite_Exec(-1, $strSQL, "_cb")
; weiblich
$strSQL = "SELECT schuetze,result FROM tblTest WHERE gender = 'w' ORDER BY result DESC;"
_SQLite_Exec(-1, $strSQL, "_cb")
_SQLite_Close()
_SQLite_Shutdown()
Func _cb($aRow)
For $s In $aRow
ConsoleWrite($s & @TAB)
Next
ConsoleWrite(@LF)
EndFunc
Edit:
Ich hab dir mal eine Komplettlösung erstellt:
#include <GUIConstants.au3>
#Include <GuiListView.au3>
#include <File.au3>
#include <SQLite.au3>
#include <SQLite.dll.au3>
Global $file = @ScriptDir & '\test.csv'
Global $aRow, $aCSV, $aSplit, $strSQL, $aResult, $iRows, $iColumns
Global $hListView1, $hListView2, $hListView3
_SQLite_Startup()
_SQLite_Open() ; Datenbank (im Arbeitsspeicher) erstellen
_createTable()
Global $gui = GUICreate('Ergebnisse', 800, 400)
$btLoad = GUICtrlCreateButton('Lade CSV', 190, 35, 70, 20)
$ListView1 = GUICtrlCreateListView('Gruppe|Ergebnis', 520, 10, 270, 80)
$hListView1 = GUICtrlGetHandle($ListView1)
$ListView2 = GUICtrlCreateListView('Gruppe|Mannschaft|Schütze|Geschlecht|Ergebnis', 10, 100, 500, 290)
$hListView2 = GUICtrlGetHandle($ListView2)
$ListView3 = GUICtrlCreateListView('Schütze|Geschlecht|Ergebnis', 520, 100, 270, 290)
$hListView3 = GUICtrlGetHandle($ListView3)
_GUICtrlListView_SetColumnWidth($hListView1, 0, 210)
_GUICtrlListView_SetColumnWidth($hListView1, 1, $LVSCW_AUTOSIZE_USEHEADER )
_GUICtrlListView_SetColumnWidth($hListView2, 0, 120)
_GUICtrlListView_SetColumnWidth($hListView2, 1, 140)
_GUICtrlListView_SetColumnWidth($hListView2, 2, 115)
_GUICtrlListView_SetColumnWidth($hListView2, 3, 65)
_GUICtrlListView_SetColumnWidth($hListView2, 4, $LVSCW_AUTOSIZE_USEHEADER )
_GUICtrlListView_SetColumnWidth($hListView3, 0, 145)
_GUICtrlListView_SetColumnWidth($hListView3, 1, 65)
_GUICtrlListView_SetColumnWidth($hListView3, 2, $LVSCW_AUTOSIZE_USEHEADER )
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
_SQLite_Close()
_SQLite_Shutdown()
Exit
Case $btLoad
_GUICtrlListView_DeleteAllItems($hListView1)
_GUICtrlListView_DeleteAllItems($hListView2)
_GUICtrlListView_DeleteAllItems($hListView3)
If _SQLite_Exec(-1, "DELETE FROM tblTest;") = $SQLITE_OK Then
_readFromFile()
_getGroups()
_getGroup()
_getByGender()
Else
MsgBox(0, 'Fehler', 'Tabelle Löschen fehlgeschlagen.')
EndIf
EndSwitch
WEnd
Func _createTable() ; Tabelle erstellen
If _SQLite_Exec(-1, "CREATE TABLE [tblTest] (" & _
"gruppe VARCHAR[30] NULL," & _
"m_name VARCHAR[30] NULL," & _
"schuetze VARCHAR[30] NULL," & _
"gender BYTE[1] NULL," & _
"result INT NULL);") <> $SQLITE_OK Then MsgBox(0, 'Fehler', 'Tabelle erstellen fehlgeschlagen.')
EndFunc
Func _readFromFile() ; Werte eintragen
_FileReadToArray($file, $aCSV)
For $i = 1 To UBound($aCSV) -1
$aSplit = StringSplit($aCSV[$i], ';')
$strSQL &= "Insert into tblTest values ("
For $j = 1 To UBound($aSplit) -1
$strSQL &= "'" & $aSplit[$j] & "',"
Next
$strSQL = StringTrimRight($strSQL, 1)
$strSQL &= ");" & @CRLF
Next
If _SQLite_Exec(-1, $strSQL) <> $SQLITE_OK Then MsgBox(0, 'Fehler', 'Einfügen Werte fehlgeschlagen.')
EndFunc
Func _getGroups() ; Grupenergebnisse
$strSQL = "SELECT gruppe,SUM(result) FROM [tblTest] GROUP BY gruppe ORDER BY SUM(result) DESC;"
If _SQLite_GetTable2d (-1, $strSQL, $aResult, $iRows, $iColumns) = $SQLITE_OK Then
_GetData($ListView1)
EndIf
EndFunc
Func _getGroup() ; Ergebnisse nach Gruppen
$strSQL = "SELECT DISTINCT gruppe FROM [tblTest];"
If _SQLite_GetTable(-1, $strSQL, $aResult, $iRows, $iColumns) <> $SQLITE_OK Then Return
Local $array = $aResult
For $i = 2 To $array[0]
$strSQL = "SELECT * FROM [tblTest] WHERE gruppe = '" & $array[$i] & "' ORDER BY result DESC;"
If _SQLite_GetTable2d (-1, $strSQL, $aResult, $iRows, $iColumns) = $SQLITE_OK Then _
_GetData($ListView2)
If $i < $array[0] Then GUICtrlCreateListViewItem('=============|=============|============|======|=====', $ListView2)
Next
EndFunc
Func _getByGender() ; Ergebnisse nach Geschlecht
$strSQL = "SELECT DISTINCT gender FROM [tblTest];"
If _SQLite_GetTable(-1, $strSQL, $aResult, $iRows, $iColumns) <> $SQLITE_OK Then Return
Local $array = $aResult, $iCount = $iRows
For $i = 2 To 1 +$iCount
$strSQL = "SELECT schuetze,gender,result FROM [tblTest] WHERE gender = '" & $array[$i] & "' ORDER BY result DESC;"
If _SQLite_GetTable2d (-1, $strSQL, $aResult, $iRows, $iColumns) = $SQLITE_OK Then _
_GetData($ListView3)
If $i < $iCount+1 Then GUICtrlCreateListViewItem('============|======|=====', $ListView3)
Next
EndFunc
Func _GetData(ByRef $ListView) ; schreibe in ListView
If Not IsArray($aResult) Then Return
Local $sMsg = ''
For $i = 1 To UBound($aResult) -1
For $j = 0 To UBound($aResult,2) -1
$sMsg &= $aResult[$i][$j] & '|'
Next
GUICtrlCreateListViewItem(StringTrimRight($sMsg, 1), $ListView)
$sMsg = ''
Next
$aResult = '' ; Ergebnisarray leeren
EndFunc
Jo, ist gut, aber ich habe noch einen kleinen Bug gefunden
Wenn ich ein Anderes Fenster activiere was über dem "Ich bin Gedockt" Fenster ist und ich dann wieder das Haubfenster activiere wird das "Ich bin Gedockt" nicht wieder in den vordergund geholt!
It's not a bug - it's a feature.
Nein, Scherz beiseite. Dieser Workaround bezieht sich rein auf das Docking. Die Fensterverwaltung kannst du natürlich nach eigenem Gusto einbringen.
Ich hab hier mal ein Bsp., wie das gelöst werden kann:
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Winapi.au3>
$gui1 = GUICreate("Nummer 1", 300, 300)
GUICtrlCreateGroup('Dockposition', 40, 40, 220, 220)
$r1 = GUICtrlCreateRadio('1', 240, 140, 15, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$r2 = GUICtrlCreateRadio('2', 140, 240, 15, 17)
$r3 = GUICtrlCreateRadio('3', 45, 140, 15, 17)
$r4 = GUICtrlCreateRadio('4', 140, 50, 15, 17)
GUICtrlCreateGroup('', -99, -99, 1, 1)
$gui2 = GUICreate("Ich bin gedockt", 200, 200, -1, -1, -1, $WS_EX_TOOLWINDOW)
Global $aDocks[2][4] = [[$gui1,$gui2,1,-1],[$gui2,$gui1,3,-1]]
; ['GUI-master','GUI-slave',dockPos,Abstand]
; dockPos: 1=rechts, 2=unten, 3=links, 4=oben
; Abstand: -1=SysMetrics Fensterrand, alle anderen Werte Pixelabstand zw. Fenstern
;=======================================================================================================
; Damit zwei Fenster wechselseitig reagieren, müssen beide im Array aufgeführt werden, einmal als Master
; und einmal als Slave.
; Dabei müssen die entgegengesetzten Flags für die Dockposition vergeben werden (1 u. 3 bzw. 2 u. 4)
;=======================================================================================================
GUISetState(@SW_SHOW, $gui2)
GUISetState(@SW_SHOW, $gui1)
; WM_MOVE registrieren:
GUIRegisterMsg($WM_MOVE, "WM_MOVE")
GUIRegisterMsg($WM_ACTIVATE, "WM_ACTIVATE")
; Ereignis WM_MOVE auslösen zum erstmaligen Positionieren der Fenster
_moved()
While True
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
Case $r1
$aDocks[0][2] = 1
$aDocks[1][2] = 3
_moved()
Case $r2
$aDocks[0][2] = 2
$aDocks[1][2] = 4
_moved()
Case $r3
$aDocks[0][2] = 3
$aDocks[1][2] = 1
_moved()
Case $r4
$aDocks[0][2] = 4
$aDocks[1][2] = 2
_moved()
EndSwitch
WEnd
Func _moved()
DllCall("User32.dll", "int", "PostMessageA", "hwnd", WinGetHandle($aDocks[0][0]), "int", $WM_MOVE, "int", 0, "int", 0)
EndFunc
Func WM_MOVE($hWndGUI)
For $i = 0 To UBound($aDocks) -1
If WinGetHandle($aDocks[$i][0]) = $hWndGUI Then
Local $aPos1 = WinGetPos($aDocks[$i][0])
Local $aPos2 = WinGetPos($aDocks[$i][1]), $iDiff = 0
If $aDocks[$i][3] = -1 Then
Local $ret = DllCall("user32.dll", "int", "GetSystemMetrics", "int", 32)
If IsArray($ret) Then $iDiff = $ret[0]
Else
$iDiff = $aDocks[$i][3]
EndIf
Switch $aDocks[$i][2]
Case 1
WinMove($aDocks[$i][1], '', $aPos1[0]+$aPos1[2]+$iDiff, $aPos1[1])
Case 2
WinMove($aDocks[$i][1], '', $aPos1[0], $aPos1[1]+$aPos1[3]+$iDiff)
Case 3
WinMove($aDocks[$i][1], '', $aPos1[0]-$iDiff-$aPos2[2], $aPos1[1])
Case 4
WinMove($aDocks[$i][1], '', $aPos1[0], $aPos1[1]-$iDiff-$aPos2[3])
EndSwitch
EndIf
Next
Return $GUI_RUNDEFMSG
EndFunc
Func WM_ACTIVATE($hWndGUI)
If WinGetHandle($aDocks[0][0]) = $hWndGUI Then _
DllCall("User32.dll", "hwnd", "SetFocus", "hwnd", WinGetHandle($aDocks[0][1]))
Return $GUI_RUNDEFMSG
EndFunc
Hi,
hier mal eine Lösung um Fenster aneinander zu docken. Nähere Erläuterungen im Skript.
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
$gui1 = GUICreate("Nummer 1", 300, 300)
GUICtrlCreateGroup('Dockposition', 40, 40, 220, 220)
$r1 = GUICtrlCreateRadio('1', 240, 140, 15, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$r2 = GUICtrlCreateRadio('2', 140, 240, 15, 17)
$r3 = GUICtrlCreateRadio('3', 45, 140, 15, 17)
$r4 = GUICtrlCreateRadio('4', 140, 50, 15, 17)
GUICtrlCreateGroup('', -99, -99, 1, 1)
$gui2 = GUICreate("Ich bin gedockt", 200, 200)
Global $aDocks[2][4] = [[$gui1,$gui2,1,-1],[$gui2,$gui1,3,-1]]
; ['GUI-master','GUI-slave',dockPos,Abstand]
; dockPos: 1=rechts, 2=unten, 3=links, 4=oben
; Abstand: -1=SysMetrics Fensterrand, alle anderen Werte Pixelabstand zw. Fenstern
;=======================================================================================================
; Damit zwei Fenster wechselseitig reagieren, müssen beide im Array aufgeführt werden, einmal als Master
; und einmal als Slave.
; Dabei müssen die entgegengesetzten Flags für die Dockposition vergeben werden (1 u. 3 bzw. 2 u. 4)
;=======================================================================================================
GUISetState(@SW_SHOW, $gui2)
GUISetState(@SW_SHOW, $gui1)
; WM_MOVE registrieren:
GUIRegisterMsg($WM_MOVE, "WM_MOVE")
; Ereignis WM_MOVE auslösen zum erstmaligen Positionieren der Fenster
_moved()
While True
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
Case $r1
$aDocks[0][2] = 1
$aDocks[1][2] = 3
_moved()
Case $r2
$aDocks[0][2] = 2
$aDocks[1][2] = 4
_moved()
Case $r3
$aDocks[0][2] = 3
$aDocks[1][2] = 1
_moved()
Case $r4
$aDocks[0][2] = 4
$aDocks[1][2] = 2
_moved()
EndSwitch
WEnd
Func _moved()
DllCall("User32.dll", "int", "PostMessageA", "hwnd", WinGetHandle($aDocks[0][0]), "int", $WM_MOVE, "int", 0, "int", 0)
EndFunc
Func WM_MOVE($hWndGUI)
For $i = 0 To UBound($aDocks) -1
If WinGetHandle($aDocks[$i][0]) = $hWndGUI Then
Local $aPos1 = WinGetPos($aDocks[$i][0])
Local $aPos2 = WinGetPos($aDocks[$i][1]), $iDiff = 0
If $aDocks[$i][3] = -1 Then
Local $ret = DllCall("user32.dll", "int", "GetSystemMetrics", "int", 32)
If IsArray($ret) Then $iDiff = $ret[0]
Else
$iDiff = $aDocks[$i][3]
EndIf
Switch $aDocks[$i][2]
Case 1
WinMove($aDocks[$i][1], '', $aPos1[0]+$aPos1[2]+$iDiff, $aPos1[1])
Case 2
WinMove($aDocks[$i][1], '', $aPos1[0], $aPos1[1]+$aPos1[3]+$iDiff)
Case 3
WinMove($aDocks[$i][1], '', $aPos1[0]-$iDiff-$aPos2[2], $aPos1[1])
Case 4
WinMove($aDocks[$i][1], '', $aPos1[0], $aPos1[1]-$iDiff-$aPos2[3])
EndSwitch
EndIf
Next
Return $GUI_RUNDEFMSG
EndFunc
Edit 26.05.2009
Hier mal noch ein Beispiel zum Andocken eines Fensters an den Bildschirmrand.
Einstellbar ist der Fangbereich, indem das Fenster "gecatcht" wird und der Abstand der Fensterränder zum Desktoprand.
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
Global $CatchWidth = 70 ; Pixelbereich indem das Fenster gefangen wird
Global $BorderDiff = 2 ; Pixelabstand zum Rand
Global $gui = GUICreate("Dock on Border", 300, 300)
GUISetState(@SW_SHOW, $gui)
; WM_MOVE registrieren:
GUIRegisterMsg($WM_MOVE, "WM_MOVE")
While True
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
EndSwitch
WEnd
Func WM_MOVE($hWndGUI)
If Not(WinGetHandle($gui) = $hWndGUI) Then Return $GUI_RUNDEFMSG
Local $aPos = WinGetPos($gui)
Local $Catch_Left = $CatchWidth, $Catch_Right = @DesktopWidth - $CatchWidth
Local $Catch_Top = $CatchWidth, $Catch_Bottom = @DesktopHeight - $CatchWidth
Select
Case $aPos[0] <= $Catch_Left
If $aPos[1] <= $Catch_Top Then
WinMove($gui, '', $BorderDiff, $BorderDiff)
ElseIf $aPos[1] + $aPos[3] >= $Catch_Bottom Then
WinMove($gui, '', $BorderDiff, @DesktopHeight - $BorderDiff - $aPos[3])
Else
WinMove($gui, '', $BorderDiff, $aPos[1])
EndIf
Case $aPos[0] + $aPos[2] >= $Catch_Right
If $aPos[1] <= $Catch_Top Then
WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], $BorderDiff)
ElseIf $aPos[1] + $aPos[3] >= $Catch_Bottom Then
WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], @DesktopHeight - $BorderDiff - $aPos[3])
Else
WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], $aPos[1])
EndIf
Case $aPos[1] <= $Catch_Top
If $aPos[0] <= $Catch_Left Then
WinMove($gui, '', $BorderDiff, $BorderDiff)
ElseIf $aPos[0] + $aPos[2] >= $Catch_Right Then
WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], $BorderDiff)
Else
WinMove($gui, '', $aPos[0], $BorderDiff)
EndIf
Case $aPos[1] + $aPos[3] >= $Catch_Bottom
If $aPos[0] <= $Catch_Left Then
WinMove($gui, '', $BorderDiff, @DesktopHeight - $BorderDiff - $aPos[3])
ElseIf $aPos[0] + $aPos[2] >= $Catch_Right Then
WinMove($gui, '', @DesktopWidth - $BorderDiff - $aPos[2], @DesktopHeight - $BorderDiff - $aPos[3])
Else
WinMove($gui, '', $aPos[0], @DesktopHeight - $BorderDiff - $aPos[3])
EndIf
EndSelect
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_MOVE
Edit 14.10.2010
Und hier mal noch ein Bsp. um mehrere Childs an eine Main-GUI zu kletten.
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
$gui1 = GUICreate("Nummer 1", 300, 300)
$gui2 = GUICreate("Ich bin gedockt RECHTS", 200, 200, -1, -1, -1, $WS_EX_TOOLWINDOW)
$gui3 = GUICreate("Ich bin gedockt LINKS", 200, 200, -1, -1, -1, $WS_EX_TOOLWINDOW)
$gui4 = GUICreate("Ich bin gedockt UNTEN", 200, 200, -1, -1, -1, $WS_EX_TOOLWINDOW)
Global $aDocks[5][2] = [[$gui1,0],[$gui2,1],[$gui3,3],[$gui4,2],[-1]]
; [n][GUI,DockPos] - letztes Arrayelement ([Ubound($aDocks)-1][0]) speichert den Abstand
; dockPos: 1=rechts, 2=unten, 3=links, 4=oben
; Abstand: -1=SysMetrics Fensterrand, alle anderen Werte Pixelabstand zw. Fenstern
GUISetState(@SW_SHOW, $gui4)
GUISetState(@SW_SHOW, $gui3)
GUISetState(@SW_SHOW, $gui2)
GUISetState(@SW_SHOW, $gui1)
;== WM_MOVE registrieren:
GUIRegisterMsg($WM_MOVE, "WM_MOVE")
;== Fenster anordnen und Ereignis WM_MOVE auslösen zum erstmaligen Positionieren der Fenster
_ArrangeGUI()
_moved()
While True
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
EndSwitch
WEnd
Func _ArrangeGUI($Index_Master=0)
Local $iDiff, $aPos1, $aPos2
If $aDocks[UBound($aDocks)-1][0] = -1 Then
Local $ret = DllCall("user32.dll", "int", "GetSystemMetrics", "int", 32)
If IsArray($ret) Then $iDiff = $ret[0]
Else
$iDiff = $aDocks[UBound($aDocks)-1][0]
EndIf
If $Index_Master = 0 Then ; === Main-GUI bewegt
$aPos1 = WinGetPos(WinGetHandle($aDocks[0][0]))
For $i = 1 To UBound($aDocks) -2
$aPos2 = WinGetPos(WinGetHandle($aDocks[$i][0]))
Switch $aDocks[$i][1]
Case 1
WinMove($aDocks[$i][0], '', $aPos1[0]+$aPos1[2]+$iDiff, $aPos1[1])
Case 2
WinMove($aDocks[$i][0], '', $aPos1[0], $aPos1[1]+$aPos1[3]+$iDiff)
Case 3
WinMove($aDocks[$i][0], '', $aPos1[0]-$iDiff-$aPos2[2], $aPos1[1])
Case 4
WinMove($aDocks[$i][0], '', $aPos1[0], $aPos1[1]-$iDiff-$aPos2[3])
EndSwitch
Next
Else ; === Child bewegt ==> zuerst Main-GUI nachrücken
$aPos1 = WinGetPos(WinGetHandle($aDocks[$Index_Master][0]))
$aPos2 = WinGetPos(WinGetHandle($aDocks[0][0]))
Switch $aDocks[$Index_Master][1] ; Positionsflag entgegengesetzt behandeln
Case 3
WinMove($aDocks[0][0], '', $aPos1[0]+$aPos1[2]+$iDiff, $aPos1[1])
Case 4
WinMove($aDocks[0][0], '', $aPos1[0], $aPos1[1]+$aPos1[3]+$iDiff)
Case 1
WinMove($aDocks[0][0], '', $aPos1[0]-$iDiff-$aPos2[2], $aPos1[1])
Case 2
WinMove($aDocks[0][0], '', $aPos1[0], $aPos1[1]-$iDiff-$aPos2[3])
EndSwitch
_moved() ; === $WM_MOVE senden um andere Childs auszurichten
EndIf
EndFunc
Func _moved()
DllCall("User32.dll", "int", "PostMessageA", "hwnd", $aDocks[0][0], "int", $WM_MOVE, "int", 0, "int", 0)
EndFunc
Func WM_MOVE($hWndGUI)
For $i = 0 To UBound($aDocks) -2
If $hWndGUI = WinGetHandle($aDocks[$i][0]) Then Return _ArrangeGUI($i)
Next
Return $GUI_RUNDEFMSG
EndFunc
Probier mal so:
[autoit]$oOpc = ObjCreate("Graybox.OPC.DAWrapper") ; Referenz auf das Objekt
$connect = $oOpc.Connect("Matrikon.OPC.Simulation.1","localhost") ; Referenz auf Connect - mit dieser weiterarbeiten
$colOPCGroups = $connect.OPCGroups ; Liefert die Collection OPCGroups
For $group In $colOPCGroups
ConsoleWrite($group.Name & @CRLF) ; probier mal, was hier ausgegeben werden kann: .Item oder nur $group
Next
$PublicGroupNames = $connect.PublicGroupNames ; <=== liefert ein Array!!
; so auslesen:
For $group In $PublicGroupNames
ConsoleWrite($group & @CRLF)
Next
PS: Wo finde ich die Datenbak Hilfe
Guckst du: http://www.autoit.de/index.php?page=Board&boardID=39
Nur bei Vista ist es so, dass man für jeden Fensterrand 5px draufaddieren muss, damit die nicht überlagert sind.
Das stellt doch kein Problem dar. Du kannst mit _WinAPI_GetSystemMetrics() die Stärke des Randes ermitteln und das generell als Variable mit einbringen.
Deine andren Fragen... mal schauen ![]()
Ich hab dir mal ein Bsp. mit Andocken (rechts, links, unten oder oben) erstellt:
[autoit]#include <WindowsConstants.au3>
$gui1 = GUICreate("Nummer 1", 300, 300, 100, 100)
$gui2 = GUICreate("Ich folge", 200, 200)
_DockIt($gui1, $gui2)
GUISetState(@SW_SHOW, $gui2)
GUISetState(@SW_SHOW, $gui1)
GUIRegisterMsg($WM_MOVE, "WM_MOVE")
[/autoit][autoit][/autoit][autoit]Do
Until GUIGetMsg() = -3
Func _DockIt($Master, $Slave, $iDock=1, $iDiff=2) ; $iDock: 1=rechts, 2=unten, 3=links, 4=oben; $iDiff=Fensterabstand
Local $aPos1 = WinGetPos($Master)
Local $aPos2 = WinGetPos($Slave)
Switch $iDock
Case 1
WinMove($Slave, '', $aPos1[0]+$aPos1[2]+$iDiff, $aPos1[1])
Case 2
WinMove($Slave, '', $aPos1[0], $aPos1[1]+$aPos1[3]+$iDiff)
Case 3
WinMove($Slave, '', $aPos1[0]-$iDiff-$aPos2[2], $aPos1[1])
Case 4
WinMove($Slave, '', $aPos1[0], $aPos1[1]-$iDiff-$aPos2[3])
EndSwitch
EndFunc
Func WM_MOVE($hWndGUI)
If $hWndGUI = WinGetHandle($gui1) Then _DockIt($gui1, $gui2)
EndFunc
Edit:
Oder so sind beide Fenster gekoppelt - egal welches du bewegst, mußt nur den entgegengesetzten Dockpunkt übergeben:
Func WM_MOVE($hWndGUI)
Switch $hWndGUI
Case WinGetHandle($gui1)
_DockIt($gui1, $gui2)
Case WinGetHandle($gui2)
_DockIt($gui2, $gui1, 3)
EndSwitch
EndFunc
Du mußt den Style anpassen:
#include <EditConstants.au3>
#include <WindowsConstants.au3>
GUICreate('test')
$hEdit = GUICtrlCreateEdit('', 10,10,300,300, BitOR($WS_VSCROLL,$ES_READONLY)) ; nur Vertikal-Scroll, horizontal Umbruch
;~ $hEdit = GUICtrlCreateEdit('', 10,10,300,300, BitOR($WS_HSCROLL,$WS_VSCROLL,$ES_READONLY)) ; Scroll horizontal und vertikal
GUISetState()
Local $text = _
'Opt("CaretCoordMode", 1) ;1=absolute, 0=relative, 2=client' & @CRLF & _
'Opt("ExpandEnvStrings", 0) ;0=dont expand, 1=do expand' & @CRLF & _
'Opt("ExpandVarStrings", 0) ;0=dont expand, 1=do expand' & @CRLF & _
'Opt("FtpBinaryMode", 1) ;1=binary, 0=ASCII' & @CRLF & _
'Opt("GUICloseOnESC", 1) ;1=ESC closes, 0=ESC wont close' & @CRLF & _
'Opt("GUICoordMode", 1) ;1=absolute, 0=relative, 2=cell' & @CRLF & _
'Opt("GUIDataSeparatorChar","|") ;"|" is the default' & @CRLF & _
'Opt("GUIOnEventMode", 0) ;0=disabled, 1=OnEvent mode enabled' & @CRLF & _
'Opt("GUIResizeMode", 0) ;0=no resizing, <1024 special resizing' & @CRLF & _
'Opt("GUIEventOptions",0) ;0=default, 1=just notification, 2=GuiCtrlRead tab index' & @CRLF & _
'Opt("MouseClickDelay", 10) ;10 milliseconds' & @CRLF & _
'Opt("MouseClickDownDelay", 10) ;10 milliseconds' & @CRLF & _
'Opt("MouseClickDragDelay", 250) ;250 milliseconds' & @CRLF & _
'Opt("MouseCoordMode", 1) ;1=absolute, 0=relative, 2=client' & @CRLF & _
'Opt("MustDeclareVars", 0) ;0=no, 1=require pre-declare' & @CRLF & _
'Opt("OnExitFunc","OnAutoItExit");"OnAutoItExit" called' & @CRLF & _
'Opt("PixelCoordMode", 1) ;1=absolute, 0=relative, 2=client' & @CRLF & _
'Opt("SendAttachMode", 0) ;0=dont attach, 1=do attach' & @CRLF & _
'Opt("SendCapslockMode", 1) ;1=store and restore, 0=dont' & @CRLF & _
'Opt("SendKeyDelay", 5) ;5 milliseconds' & @CRLF & _
'Opt("SendKeyDownDelay", 1) ;1 millisecond' & @CRLF & _
'Opt("TCPTimeout",100) ;100 milliseconds' & @CRLF & _
'Opt("TrayAutoPause",1) ;0=no pause, 1=Pause' & @CRLF & _
'Opt("TrayIconDebug", 0) ;0=no info, 1=debug line info' & @CRLF & _
'Opt("TrayIconHide", 0) ;0=show, 1=hide tray icon' & @CRLF & _
'Opt("TrayMenuMode",0) ;0=append, 1=no default menu, 2=no automatic check, 4=menuitemID not return' & @CRLF & _
'Opt("TrayOnEventMode",0) ;0=disable, 1=enable' & @CRLF & _
'Opt("WinDetectHiddenText", 0) ;0=dont detect, 1=do detect' & @CRLF & _
'Opt("WinSearchChildren", 1) ;0=no, 1=search children also' & @CRLF & _
'Opt("WinTextMatchMode", 1) ;1=complete, 2=quick' & @CRLF & _
'Opt("WinTitleMatchMode", 1) ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase' & @CRLF & _
'Opt("WinWaitDelay", 250) ;250 milliseconds'
GUICtrlSetData($hEdit, $text)
Do
Until GUIGetMsg() = -3
Also ich muß sagen, außer bei AutoIt
habe ich bisher keine solch hervorragende Dokumentation gesehen. Auf 100 Seiten alle Methoden fein säuberlich mit Syntaxbeispielen dargestellt. Respekt
Wirf mal einen Blick in unsere Datenbank-Hilfe, die Vorgehensweise ist analog.
Wie kann ich eigentlich Fenster aneinander haften lassen?
Ich denke, am Besten WM_MOVE mit GUIRegisterMessage registrieren und dann in der Funktion bei Änderung einer Fensterposition, das angeheftete Fenster hinterherbewegen lassen.
Und wie erlaube ich die Größe von Fenstern zu ändern?
Mit dem Style: $WS_SIZEBOX
Also ich hab mir mal die Dokumentation (http://gray-box.net/download_daawrapper.php?lang=en) angeschaut, sollte kein Problem darstellen:
[autoit]; - copy gbda_aut.dll to Windows\System32 folder;
; - register this module - enter regsvr32 gbda_aut.dll in the command line.
$oOPCServer = ObjCreate("Graybox.OPC.DAWrapper")
$ARealOPCServer = "VendorX.DataAccessCustomServer"
$ARealOPCNodeName = "SomeComputerNodeName"
$oOPCServer.Connect ($ARealOPCServer, $ARealOPCNodeName)