Wenn ich heute abend etwas Zeit finde, werde ich mal ein Bsp. stricken. ![]()
Beiträge von BugFix
-
-
Das Problem sind die (in AutoIt) nicht existierenden Datentypen, die dort verwendet werden.
DllStructCreate() hilft möglicherweise. Aber es reicht ja nicht die Struktur zu erstellen, du mußt ja auch Daten in diese Struktur schreiben. Da fehlt mir momentan der Ansatz zu.Ich hab mal begonnen, das VB-Skript umzusetzen. Vielleicht hilft dir der Ansatz ja.
Spoiler anzeigen
[autoit]Global Const $IP_SUCCESS = 0
[/autoit] [autoit][/autoit] [autoit]
Global Const $IP_STATUS_BASE = 11000
Global Const $IP_BUF_TOO_SMALL = $IP_STATUS_BASE + 1
Global Const $IP_DEST_NET_UNREACHABLE = $IP_STATUS_BASE + 2
Global Const $IP_DEST_HOST_UNREACHABLE = $IP_STATUS_BASE + 3
Global Const $IP_DEST_PROT_UNREACHABLE = $IP_STATUS_BASE + 4
Global Const $IP_DEST_PORT_UNREACHABLE = $IP_STATUS_BASE + 5
Global Const $IP_NO_RESOURCES = $IP_STATUS_BASE + 6
Global Const $IP_BAD_OPTION = $IP_STATUS_BASE + 7
Global Const $IP_HW_ERROR = $IP_STATUS_BASE + 8
Global Const $IP_PACKET_TOO_BIG = $IP_STATUS_BASE + 9
Global Const $IP_REQ_TIMED_OUT = $IP_STATUS_BASE + 10
Global Const $IP_BAD_REQ = $IP_STATUS_BASE + 11
Global Const $IP_BAD_ROUTE = $IP_STATUS_BASE + 12
Global Const $IP_TTL_EXPIRED_TRANSIT = $IP_STATUS_BASE + 13
Global Const $IP_TTL_EXPIRED_REASSEM = $IP_STATUS_BASE + 14
Global Const $IP_PARAM_PROBLEM = $IP_STATUS_BASE + 15
Global Const $IP_SOURCE_QUENCH = $IP_STATUS_BASE + 16
Global Const $IP_OPTION_TOO_BIG = $IP_STATUS_BASE + 17
Global Const $IP_BAD_DESTINATION = $IP_STATUS_BASE + 18
Global Const $IP_ADDR_DELETED = $IP_STATUS_BASE + 19
Global Const $IP_SPEC_MTU_CHANGE = $IP_STATUS_BASE + 20
Global Const $IP_MTU_CHANGE = $IP_STATUS_BASE + 21
Global Const $IP_UNLOAD = $IP_STATUS_BASE + 22
Global Const $IP_ADDR_ADDED = $IP_STATUS_BASE + 23
Global Const $IP_GENERAL_FAILURE = $IP_STATUS_BASE + 50
Global Const $MAX_IP_STATUS = $IP_STATUS_BASE + 50
Global Const $IP_PENDING = $IP_STATUS_BASE + 255
Global Const $PING_TIMEOUT = 500
Global Const $WS_VERSION_REQD = 0x101
Global Const $MIN_SOCKETS_REQD = 1
Global Const $SOCKET_ERROR = -1
Global Const $INADDR_NONE = 0xFFFFFFFF
Global Const $MAX_WSADescription = 256
Global Const $MAX_WSASYSStatus = 128Global $ICMP_OPTIONS = DllStructCreate("byte Ttl;" & _
[/autoit] [autoit][/autoit] [autoit]
"byte Tos;" & _
"byte Flags;" & _
"byte OptionsSize;" & _
"long OptionsData")
Global $ICMP_ECHO_REPLY = DllStructCreate("long Address;" & _
"long status;" & _
"long RoundTripTime;" & _
"long DataSize;" & _
"integer Reserved;" & _
"long_ptr DataPointer;" & _
$ICMP_OPTIONS & " Options;" & _
"char Data[250]")
Global $WSADATA = DllStructCreate("int wVersion;" & _
"int wHighVersion;" & _
"byte szDescription;" & _ ; ? szDescription(0 To MAX_WSADescription) As Byte
"byte szSystemStatus;" & _ ; ? szSystemStatus(0 To MAX_WSASYSStatus) As Byte
"long wMaxSockets;" & _
"long wMaxUDPDG;" & _
"long dwVendorInfo")
[/autoit]
Func _IcmpSendEcho($IcmpHandle, $DestinationAddress, $RequestData, $RequestSize, $RequestOptions, $ReplyBuffer, $ReplySize, $Timeout)
DllCall("icmp.dll", "long", "IcmpSendEcho", _
"long", $IcmpHandle, _
"long", $DestinationAddress, _
"str", $RequestData, _
"long", $RequestSize, _
"long", $RequestOptions, _
$ICMP_ECHO_REPLY, $ReplyBuffer, _
"long", $ReplySize, _
"long", $Timeout)
EndFuncAber wie gesagt, ist es mit dem Erstellen der Struktur nicht getan - an dieser Stelle komm ich nicht weiter. (Deshalb hab ich auch nur mal bis zur ersten Funktion portiert).
-
[autoit]
GUICreate("Install Progs ", 458, 400, 196, 125)
[/autoit][autoit][/autoit][autoit]
GUISetOnEvent($GUI_EVENT_CLOSE, 'GUI_close') ; das hast du vergessen!; ....
[/autoit][autoit][/autoit][autoit]
; ....Func GUI_close()
[/autoit]
Exit
EndFunc -
OK, mal ausführlich:
. - jedes beliebige Zeichen
+ - gibt Wiederholungsmöglichkeit an, min. 1-mal bis beliebig oft ==> sollte > auch als erstes Zeichen erscheinen können, müßte man * verwenden, das steht für 0-mal bis beliebig oft
> - jetzt muß ein > folgen, damit Übereinstimmung mit Suchmuster besteht - folgt im Suchstring ein weiteres > , dann ist das erste > ja nicht das abschließende und wird somit als beliebiges Zeichen interpretiert.Etwas Anderes ist es, wenn du noch weitere > im Suchstring hast, aber nur bis inklusive des zweiten selektieren wolltest.
Dann müßtest du ein Pattern erstellen, dass in einem Match jeweils alle Zeichen bis zum zweiten > erfaßt. Es gibt dann mehrere Matches im Suchstring, aber der erste enthält dann den zu selektierenden Bereich.
Das wäre das Pattern dafür: (([^>]*)>){2}
Auch hier die Erklärung:
[^>] - Gruppe zum Match für jedes Zeichen außer >
([^>]*) - alle Zeichen außer > können 0-mal bis beliebig oft auftreten
(([^>]*)>) - diesem Match muß ein > folgen
(([^>]*)>){2} - dieser Match muß 2-mal hintereinander folgen (beliebige Zeichen - > - beliebige Zeichen - >) -
[autoit]
$pattern = ".+>"
[/autoit] -
Hi und Willkommen,
zeig uns doch mal dein bisheriges Skript.
Dann können wir dir bei deinen Problemen besser helfen. -
Oh man, deine Erklärungen sind aber nebulös
Allem Anschein nach hast du doch schon Code - dann zeig ihn mal (nicht nur 5 Zeilen, die uns wenig sagen).Gib einfach an:
- Ausgangsstatus (GUI, Controls)
- was passiert
- wie soll darauf reagiert werden -
Der Code läßt sich noch gewaltig zusammenstreichen.
Speichere die ID's in Arrays. Dann kannst du in einer Schleife die Prüfroutinen durchlaufen. -
Das ist doch simples String-Handling.
[autoit]
Du sendest in deinem String eine Kennung voran (irgendeine Ziffernkombination) an der auf der Empfängerseite ersichtlich ist, dass hier eine MsgBox aufgerufen werden soll.
Etwa so:; Sender
[/autoit][autoit][/autoit][autoit]
$strToSend = "00;MsgboxTyp;MsgboxTitel;MsgboxText"
TCPSend($ConnectedSocket, $strToSend); Empfänger
[/autoit]
$recv = TCPRecv($ConnectedSocket, 40)
If StringLeft($recv, 2) = '00' Then
$aMsg = StringSplit($recv, ';')
MsgBox($aMsg[2],$aMsg[3],$aMsg[4])
Else
; ...
EndIfEdit: Achja, die Länge des TCPRecv mußt du dann variabel gestalten.
-
bei einem Fehler eine 0 Zurück. Wenn alles ok war, dann liefert das Programm den Exit Code des Programms zurück.
Bei mir liefert er immer 0 zurück, obwohl das Programm bzw. die Batch Datei erfolgreich abgearbeitet wurde.
[autoit]
Prüf doch nicht den Rückgabewert - RunWait liefert doch @error, wenn was schiefgeht.Runwait(....)
[/autoit]
If @error Then
; .... -
nur wie soll ich es schaffen,2 guifelder übereinander hinzupflanzen?
Verstehe nicht, was du damit meinst. Erstelle doch ein Child-GUI, das du an die Seite des Main-GUI andockst. Kannst du dann auch super per Klick auf den Rand ein- bzw. ausfahren lassen.
Da die Events des Childs an das Main weitergeleitet werden, kannst du von dort die Daten per Drag'nDrop rüberziehen. -
Icons extrahieren (aus *.dll, *.exe, *.ocx, *.scr): mit dem Reshacker - im SciTE-AutoIt-Paket enthalten.
-
Hier mal ein Muster, wie es funktioniert:
Spoiler anzeigen
[autoit]#include<GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include<WindowsConstants.au3>
#include <GUIListView.au3>
Global $sOut, $msgGlobal $gui = GUICreate('test')
[/autoit] [autoit][/autoit] [autoit]
Global $hListView = GUICtrlCreateListView('Spalte1|Spalte2', 10, 10, 300, 200, -1, BitOR($LVS_SORTASCENDING,$LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES, $LVS_EX_GRIDLINES, $LVS_EX_REGIONAL))
_GUICtrlListView_SetColumnWidth($hListView, 0, 146)
_GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER)
For $i = 1 To 10
GUICtrlCreateListViewItem('Zeile ' & $i & ' Spalte 1|Zeile ' & $i & ' Spalte 2', $hListView)
Next
Global $btn = GUICtrlCreateButton('check', 10, 220, 60, 20)
GUISetState()Do
[/autoit]
$msg = GUIGetMsg()
If $msg = $btn Then
$sOut = ''
For $i = 0 To _GUICtrlListView_GetItemCount($hListView) -1
If _GUICtrlListView_GetItemChecked($hListView, $i) Then _
$sOut &= _GUICtrlListView_GetItemText($hListView, $i, 0) & ' / ' & _
_GUICtrlListView_GetItemText($hListView, $i, 1) & @LF
Next
MsgBox(0, 'Markiert', $sOut)
EndIf
Until $msg = $GUI_EVENT_CLOSE -
Nochmals die Bitte: AutoIt-Tag und Spoiler-Tag verwenden
-
Hi,
[autoit]
du hast dir AddArrayItem() gebastelt. AutoIt hat die Funktion _ArrayAdd()
for $x = 0 to $sRet[0]-1
[/autoit]Hier hast du einen Fehler. $sRet[0] ist das erste Element in dem Array $sRet und führt die Anzahl der Elemente. Wenn du also alle Elemente durchlaufen möchtest mußt du von 1 bis $sRet[0] durchlaufen bzw. von 1 bis UBound($sRet) -1.
Ich bevorzuge die UBound-Variante - damit vermeidest du solche Fehler von vornherein.Die Dynamik an sich ist kein Problem. Du fragst in der Schleife ab, ob das LV-Element per CheckBox markiert ist. Wenn ja liest du den Inhalt des ListView-Elements aus und arbeitest entsprechend damit weiter.
-
Hab mal den Problemteil korrigiert:
[autoit]; Global $arBt[$FList[0]] $arBt war ein Bsp. von mir (Bt = Button in Bsp.-GUI) ==> überflüssig die Zeile
[/autoit][autoit][/autoit][autoit]$newList = _ArrayTrim( $FList, 4, 1,1) ;letzten vier Zeichen werden abgetrennt
[/autoit][autoit][/autoit][autoit]Global $y = 15
[/autoit][autoit][/autoit][autoit]
; Global $checkCN[UBound($arBt)] hier die Größe von FList einsetzen
Global $checkCN[$FList[0]]; und jetzt natürlich mit $checkCN weiterarbeiten
[/autoit]
GUICreate(" Install Progs", 558, 900, 196, 125)
For $i = 0 To UBound($checkCN) -1 ; Array beginnt bei 0 !!
; in $FList ist aber bei 0 der Zähler, erstes Element bei 1, also immer $i +1
$checkCN[$i] = GUICtrlCreateCheckbox($FList[$i +1], 10, $y, 120, 20)
$y += 20
NextWegen der Vielzahl von Elementen, mußt du halt festlegen, wieviel Elemente maximal dargestellt werden können. Wird die Anzahl überschritten erstellst du ein Tab und platzierst die restlichen Elemente dort (oder auf weiteren Tabs, je nach Anzahl).
-
Hi,
irgendwann die Tage hatte jemand Interesse an einer Darstellung von Arrays als Elemente in einem Array gezeigt.
Ich habe dazu mal die UDF _ArrayDisplay() etwas "vergewaltigt"
und eine Anzeigemöglichkeit dafür geschaffen.
Ist sicher noch nicht optimal gelöst aber funktioniert.
Allerdings nur für 1D/2D-Arrays und auch nicht rekursiv (also kein Array im Array im Array....;-) ).
- Ist ein Arrayelement selbst ein Array, so wird es in der Anzeige als [SubArray] dargestellt.
- Mit rechtem Mausklick auf [SubArray] kann nun dieses Array angezeigt werden.Vielleicht probier ich nochmal bei Gelegenheit, die Funktion rekursiv zu gestalten. Aber ich denke, für den eher seltenen Einsatz solcher Darstellungen ist es ausreichend.
Spoiler anzeigen
[autoit]#include-once
[/autoit] [autoit][/autoit] [autoit]
#include <GuiListView.au3>Global $arSub = _GetTestArray(120)
[/autoit] [autoit][/autoit] [autoit]
Global $arSub2 = _GetTestArray(120, 12)
Global $arTest[4][3]=[ _
[1,2,$arSub2], _
[4,5,6], _
[7,8,9], _
[$arSub,11,12]]Func _GetTestArray($iUbDim1, $iUbDim2=0, $sValue='Wert ')
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Local $i, $k, $2ndDim = False
Local $aOut[$iUbDim1]
If $iUbDim2 > 1 Then
$2ndDim = True
ReDim $aOut[$iUbDim1][$iUbDim2]
EndIf
For $i = 0 To $iUbDim1 -1
If $2ndDim Then
For $k = 0 To $iUbDim2 -1
$aOut[$i][$k] = $sValue & $i & '/ ' & $k
Next
Else
$aOut[$i] = $sValue & $i
EndIf
Next
Return $aOut
EndFunc ;==>_GetTestArray_ArrayMultiDisplay($arTest)
[/autoit] [autoit][/autoit] [autoit];==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _ArrayMultiDisplay
; Description:: Anzeige von 1D/2D-Arrays
; Array-Elemente, die selbst ein 1D/2D-Array darstellen, werden als "[SubArray]"
; markiert und können per Rechtsklick angezeigt werden.
; Parameter(s): Identisch zur Funktion _ArrayDisplay()
;==================================================================================================
Func _ArrayMultiDisplay(Const ByRef $avArray, $sTitle = "Array: ListView Display", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|")
If Not IsArray($avArray) Then Return SetError(1, 0, 0)
; Array für Subfunktionen Global zur Verfügung stellen
Global $avArrayMultiDisplay = $avArray; Dimension checking
[/autoit] [autoit][/autoit] [autoit]
Local $iDimension = UBound($avArray, 0), $iUBound = UBound($avArray, 1) - 1, $iSubMax = UBound($avArray, 2) - 1
If $iDimension > 2 Then Return SetError(2, 0, 0); Separator handling
[/autoit] [autoit][/autoit] [autoit]
;~ If $sSeparator = "" Then $sSeparator = Chr(1)
If $sSeparator = "" Then $sSeparator = Chr(124); Declare variables
[/autoit] [autoit][/autoit] [autoit]
Local $i, $j, $vTmp, $aItem, $avArrayText, $sHeader = "Row", $iBuffer = 64
Local $iColLimit = 250, $iLVIAddUDFThreshold = 4000, $iWidth = 640, $iHeight = 480
Local $iOnEventMode = Opt("GUIOnEventMode", 0), $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator); Swap dimensions if transposing
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax < 0 Then $iSubMax = 0
If $iTranspose Then
$vTmp = $iUBound
$iUBound = $iSubMax
$iSubMax = $vTmp
EndIf; Set limits for dimensions
[/autoit] [autoit][/autoit] [autoit]
If $iSubMax > $iColLimit Then $iSubMax = $iColLimit
If $iItemLimit = 1 Then $iItemLimit = $iLVIAddUDFThreshold
If $iItemLimit < 1 Then $iItemLimit = $iUBound
If $iUBound > $iItemLimit Then $iUBound = $iItemLimit
If $iLVIAddUDFThreshold > $iUBound Then $iLVIAddUDFThreshold = $iUBound; Set header up
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To $iSubMax
$sHeader &= $sSeparator & "Col " & $i
Next; Convert array into text for listview
[/autoit] [autoit][/autoit] [autoit]
Local $avArrayText[$iUBound + 1]
For $i = 0 To $iUBound
$avArrayText[$i] = "[" & $i & "]"
For $j = 0 To $iSubMax
; Get current item
If $iDimension = 1 Then
If $iTranspose Then
$vTmp = $avArray[$j]
Else
$vTmp = $avArray[$i]
EndIf
Else
If $iTranspose Then
$vTmp = $avArray[$j][$i]
Else
$vTmp = $avArray[$i][$j]
EndIf
EndIf; Prüfen ob SubArray und entsprechend markieren
[/autoit] [autoit][/autoit] [autoit]
If IsArray($vTmp) Then
$vTmp = '[SubArray]'
Else
; Add to text array
$vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1)
EndIf
$avArrayText[$i] &= $sSeparator & $vTmp; Set max buffer size
[/autoit] [autoit][/autoit] [autoit]
$vTmp = StringLen($vTmp)
If $vTmp > $iBuffer Then $iBuffer = $vTmp
Next
Next
$iBuffer += 1; GUI Constants
[/autoit] [autoit][/autoit] [autoit]
Local Const $_ARRAYCONSTANT_GUI_DOCKBORDERS = 0x66
Local Const $_ARRAYCONSTANT_GUI_DOCKBOTTOM = 0x40
Local Const $_ARRAYCONSTANT_GUI_DOCKHEIGHT = 0x0200
Local Const $_ARRAYCONSTANT_GUI_DOCKLEFT = 0x2
Local Const $_ARRAYCONSTANT_GUI_DOCKRIGHT = 0x4
Local Const $_ARRAYCONSTANT_GUI_EVENT_CLOSE = -3
Local Const $_ARRAYCONSTANT_LVIF_PARAM = 0x4
Local Const $_ARRAYCONSTANT_LVIF_TEXT = 0x1
Local Const $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH = (0x1000 + 29)
Local Const $_ARRAYCONSTANT_LVM_GETITEMCOUNT = (0x1000 + 4)
Local Const $_ARRAYCONSTANT_LVM_GETITEMSTATE = (0x1000 + 44)
Local Const $_ARRAYCONSTANT_LVM_INSERTITEMA = (0x1000 + 7)
Local Const $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54)
Local Const $_ARRAYCONSTANT_LVM_SETITEMA = (0x1000 + 6)
Local Const $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT = 0x20
Local Const $_ARRAYCONSTANT_LVS_EX_GRIDLINES = 0x1
Local Const $_ARRAYCONSTANT_LVS_SHOWSELALWAYS = 0x8
Local Const $_ARRAYCONSTANT_WS_EX_CLIENTEDGE = 0x0200
Local Const $_ARRAYCONSTANT_WS_MAXIMIZEBOX = 0x00010000
Local Const $_ARRAYCONSTANT_WS_MINIMIZEBOX = 0x00020000
Local Const $_ARRAYCONSTANT_WS_SIZEBOX = 0x00040000
Local Const $_ARRAYCONSTANT_tagLVITEM = "int Mask;int Item;int SubItem;int State;int StateMask;ptr Text;int TextMax;int Image;int Param;int Indent;int GroupID;int Columns;ptr pColumns"
Local Const $_ARRAYCONSTANT_WM_NOTIFY = 0x004E
Local Const $_ARRAYCONSTANT_GUI_WS_EX_PARENTDRAG = 0x00100000Local $iAddMask = BitOR($_ARRAYCONSTANT_LVIF_TEXT, $_ARRAYCONSTANT_LVIF_PARAM)
[/autoit] [autoit][/autoit] [autoit]
Local $tBuffer = DllStructCreate("char Text[" & $iBuffer & "]"), $pBuffer = DllStructGetPtr($tBuffer)
Local $tItem = DllStructCreate($_ARRAYCONSTANT_tagLVITEM), $pItem = DllStructGetPtr($tItem)
DllStructSetData($tItem, "Param", 0)
DllStructSetData($tItem, "Text", $pBuffer)
DllStructSetData($tItem, "TextMax", $iBuffer); Set interface up
[/autoit] [autoit][/autoit] [autoit]
Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX, $_ARRAYCONSTANT_GUI_WS_EX_PARENTDRAG))
; GUI Global zur Verfügung stellen
Global $hArrayDisplayGUI = $hGUI
Local $aiGUISize = WinGetClientSize($hGUI)
Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
; ListView Global zur Verfügung stellen
Global $hArrayDisplayListView = $hListView
Local $hCopy = GUICtrlCreateButton("Copy Selected", 3, $aiGUISize[1] - 23, $aiGUISize[0] - 6, 20)
GUICtrlSetResizing($hListView, $_ARRAYCONSTANT_GUI_DOCKBORDERS)
GUICtrlSetResizing($hCopy, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_GRIDLINES, $_ARRAYCONSTANT_LVS_EX_GRIDLINES)
GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT)
GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE); Fill listview
[/autoit] [autoit][/autoit] [autoit]
For $i = 0 To $iLVIAddUDFThreshold
GUICtrlCreateListViewItem($avArrayText[$i], $hListView)
Next
For $i = ($iLVIAddUDFThreshold + 1) To $iUBound
$aItem = StringSplit($avArrayText[$i], $sSeparator)
DllStructSetData($tBuffer, "Text", $aItem[1]); Add listview item
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tItem, "Item", $i)
DllStructSetData($tItem, "SubItem", 0)
DllStructSetData($tItem, "Mask", $iAddMask)
GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_INSERTITEMA, 0, $pItem); Set listview subitem text
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tItem, "Mask", $_ARRAYCONSTANT_LVIF_TEXT)
For $j = 2 To $aItem[0]
DllStructSetData($tBuffer, "Text", $aItem[$j])
DllStructSetData($tItem, "SubItem", $j - 1)
GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETITEMA, 0, $pItem)
Next
Next
; ajust window width
$iWidth = 0
For $i = 0 To $iSubMax + 1
$iWidth += GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0)
Next
If $iWidth < 250 Then $iWidth = 230
WinMove($hGUI, "", Default, Default, $iWidth + 20); Show dialog
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW, $hGUI)
GUIRegisterMsg($_ARRAYCONSTANT_WM_NOTIFY, "WM_DISPLAY_NOTIFY")
Global $a_msgARRAY_DISPLAY
If Not IsDeclared('hSubGUI') Then Global $hSubGUI
While 1
$a_msgARRAY_DISPLAY = GUIGetMsg(1)
Switch $a_msgARRAY_DISPLAY[0]
Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE
If $a_msgARRAY_DISPLAY[1] = $hGUI Then
ExitLoop
Else
GUIDelete($hSubGUI)
EndIf
Case $hCopy
Local $sClip = ""; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ]
[/autoit] [autoit][/autoit] [autoit]
Local $aiCurItems[1] = [0]
For $i = 0 To GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMCOUNT, 0, 0)
If GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, 0x2) Then
$aiCurItems[0] += 1
ReDim $aiCurItems[$aiCurItems[0] + 1]
$aiCurItems[$aiCurItems[0]] = $i
EndIf
Next; Generate clipboard text
[/autoit] [autoit][/autoit] [autoit]
If Not $aiCurItems[0] Then
For $sItem In $avArrayText
$sClip &= $sItem & @CRLF
Next
Else
For $i = 1 To UBound($aiCurItems) - 1
$sClip &= $avArrayText[$aiCurItems[$i]] & @CRLF
Next
EndIf
ClipPut($sClip)
EndSwitch
WEnd
GUIDelete($hGUI)Opt("GUIOnEventMode", $iOnEventMode)
[/autoit] [autoit][/autoit] [autoit]
Opt("GUIDataSeparatorChar", $sDataSeparatorChar)Return 1
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_ArrayMultiDisplayFunc WM_DISPLAY_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit]
If Not IsDeclared('hArrayDisplayListView') Then Local $hArrayDisplayListView
If Not IsDeclared('avArrayMultiDisplay') Then Local $avArrayMultiDisplay
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
$hWndListView = $hArrayDisplayListView
If Not IsHWnd($hArrayDisplayListView) Then $hWndListView = GUICtrlGetHandle($hArrayDisplayListView)
Local Const $tagNMHDR = "hwnd hWndFrom;int IDFrom;int Code"
Local Const $tagNMITEMACTIVATE = "hwnd hWndFrom;int IDFrom;int Code;int Index;int SubItem;int NewState;int OldState;" & _
"int Changed;int X;int Y;int lParam;int KeyFlags"
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case -5
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
Local $ItemIndex = DllStructGetData($tInfo, "Index"), $SubIndex = DllStructGetData($tInfo, "SubItem")
If _GUICtrlListView_GetItemText($iIDFrom, $ItemIndex, $SubIndex) = '[SubArray]' Then
If Not IsArray($avArrayMultiDisplay) Then Return
Local $avArraySub = $avArrayMultiDisplay[$ItemIndex][$SubIndex - 1]
If Not IsDeclared('hArrayDisplayGUI') Then Local $hArrayDisplayGUI
Local $aMainPos = WinGetPos($hArrayDisplayGUI)
Local $hSubGUI = GUICreate('SubArray', 640, 480, -1, -1, Default, 0x00000040, $hArrayDisplayGUI)
Local $sItemText, $ub2nd, $sHeaderLV = 'Row | Col 1'
If UBound($avArraySub, 2) > 1 Then
$ub2nd = True
$sHeaderLV = 'Row | '
For $j = 0 To UBound($avArraySub, 2) -1
$sHeaderLV &= 'Col ' & $j & ' | '
Next
$sHeaderLV = StringTrimRight($sHeaderLV, 2)
Else
$ub2nd = False
EndIf
Local $hSubLV = GUICtrlCreateListView($sHeaderLV, 0, 0, 640, 480, Default, 0x00000001)
For $i = 0 To UBound($avArraySub) -1
$sItemText = '[' & $i & ']' & '|'
If $ub2nd Then
For $j = 0 To UBound($avArraySub, 2) -1
$sItemText &= $avArraySub[$i][$j] & '|'
Next
$sItemText = StringTrimRight($sItemText, 1)
Else
$sItemText &= $avArraySub[$i]
EndIf
GUICtrlCreateListViewItem($sItemText, $hSubLV)
Next
GUISetState(@SW_SHOW, $hSubGUI)
EndIf
EndSwitch
EndSwitch
Return 'GUI_RUNDEFMSG'
EndFunc ;==>WM_DISPLAY_NOTIFY -
ich möchte so etwa von einer anderen GUI aus machen.
Ich verstehe auch nicht, was du meinst.
"andere GUI" - Ist das eine selbsterstellte, oder wird sie von einem Programm zur Verfügung gestellt? -
Wenn du einen entsprechenden VB-Code hast, dann zeige ihn doch mal.
Häufig läßt sich VB-Code in AutoIt übertragen. Ist abhängig von den verwendeten Objekten. -
Wieso selber schreiben, wenn 'Windows+L' die Station sperrt?
Weil das
a) nicht generell so ist - dazu muß die entsprechende Anmeldeform in Windows aktiv sein
b) Warum soll ich die Station sperren, wenn ich den Task-Manager deaktivieren will