Guck das mal an: DockIt
Beiträge von BugFix
-
-
Ich denke, es könnte hilfreich sein, wenn du mal sagst, WAS das Skript überhaupt tun soll.

-
Dafür gibt es in AutoIt _WinApi_GetSystemMetrics(Index).
Ich hatte dafür dann eine Funktion erstellt, die wahlweise alle möglichen Parameter in eine MsgBox oder Commandline ausgibt ohne die Funktion auszuführen, bzw. ein Array mit allen Parametern zurückgibt. _GetSystemMetrics (kpl. in einem Aufruf) -
oder hab ich da was falsch verstanden!
Ja, hast du .
Ich will nur die Variablen innerhalb des Arrays selektieren. - Im vorigen Post blau dargestellt. -
Ich dachte, du hast ein Array-Problem. Hier ist aber nur ein Problem in deiner Logik. Ich kenne ja nicht die Daten, die eingelesen werden, insofern kann ich nicht feststellen, wo dein Problem liegt.
-
Probier mal:
[autoit]; nach dem Split eine Fehlerabfrage einfügen
[/autoit][autoit]
$arSelect = StringSplit($sSelect, '|')
If @error Then Exit MsgBox(0, 'Fehler', 'Kein Split möglich)For $i = 1 to $arSelect [0]
[/autoit]
; besser:
For $i = 1 to UBound($arSelect) -1 -
Ich möchte aber 1 Zeile mit ca. 60 Spalten einfügen.
Und genau das tust du nicht.
Du hast 61 Trenner und somit 62 Felder! Deshalb funktioniert es nicht. -
Hab das Bsp. von eukalyptus mal etwas verändert. Farbsetzung für die TabItem in einem globalen Array und Fonteinstellung für das aktive Tab.
Spoiler anzeigen
[autoit]#include <FontConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <TabConstants.au3>
#include <WinAPI.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiTab.au3>Global Const $ODT_TAB = 101
[/autoit] [autoit][/autoit] [autoit]
Global Const $ODS_SELECTED = 0x0001
Global Const $ODA_DRAWENTIRE = 0x1
Global Const $ODS_FOCUS = 0x0010Global $aColTabItem[2] = [0x11AADD,0xEEBB99] ; TabItem-Color
[/autoit] [autoit][/autoit] [autoit]$hGUI = GUICreate("Draw Tab", 300, 200)
[/autoit] [autoit][/autoit] [autoit]
$hTab = GUICtrlCreateTab(10, 10, 280, 180, $TCS_OWNERDRAWFIXED)
$TabItem_1 = GUICtrlCreateTabItem("TabItem 1")
GUICtrlCreateLabel("", 10, 33, 277, 155)
GUICtrlSetBkColor(-1, 0xDDAA11)
GUICtrlSetState(-1, $GUI_DISABLE)
$TabItem_2 = GUICtrlCreateTabItem("TabItem 2")
GUICtrlCreateLabel("", 10, 33, 277, 155)
GUICtrlSetBkColor(-1, 0x99BBEE)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateTabItem("")GUISetState()
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM")
[/autoit] [autoit][/autoit] [autoit]_GUICtrlTab_SetCurSel($hTab, 1)
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlTab_SetCurSel($hTab, 0)Do
[/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = -3Func WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $DRAWITEMSTRUCT = DllStructCreate("uint cType;uint cID;uint itmID;uint itmAction;uint itmState;" & _
"hwnd hItm;hwnd hDC;dword itmRect[4];dword itmData", $lParam)
If DllStructGetData($DRAWITEMSTRUCT, "cType") <> $ODT_TAB Then Return $GUI_RUNDEFMSG
If DllStructGetData($DRAWITEMSTRUCT, "itmAction") <> $ODA_DRAWENTIRE Then Return $GUI_RUNDEFMSG
Local $itmID = DllStructGetData($DRAWITEMSTRUCT, "itmID")
Local $hDC = DllStructGetData($DRAWITEMSTRUCT, "hDC")Local $iTextColor, $itmText, $iBrushColor = $aColTabItem[$itmID]
[/autoit] [autoit][/autoit] [autoit]DLLCall("gdi32.dll","int","SetBkMode", "hwnd", $hDC, "int", 1)
[/autoit] [autoit][/autoit] [autoit]Local $iBrush = DLLCall("gdi32.dll","hwnd","CreateSolidBrush", "int", $iBrushColor)
[/autoit] [autoit][/autoit] [autoit]
$iBrush = $iBrush[0]Local $iBrushOld = _WinAPI_SelectObject($hDC, $iBrush)
[/autoit] [autoit][/autoit] [autoit]
DLLCall("user32.dll","int","FillRect", "hwnd", $hDC, "ptr", DllStructGetPtr($DRAWITEMSTRUCT, "itmRect"), "hwnd", $iBrush)
Local $tBuffer = DllStructCreate("char[256]")
DllStructSetData($tBuffer, 1, "Item" & $itmID)
$itmText = DllStructGetData($tBuffer, 1)DllStructSetData($DRAWITEMSTRUCT, "itmRect", DllStructGetData($DRAWITEMSTRUCT, "itmRect", 1) + 10, 1)
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($DRAWITEMSTRUCT, "itmRect", DllStructGetData($DRAWITEMSTRUCT, "itmRect", 2) + 5, 2)DllCall("user32.dll", "int", "DrawText", "hwnd", $hDC, "str", $itmText, "int", StringLen($itmText), _
[/autoit] [autoit][/autoit] [autoit]
"ptr", DllStructGetPtr($DRAWITEMSTRUCT, "itmRect"), "int", $DT_LEFT)_WinAPI_SelectObject($hDC, $iBrushOld)
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_DeleteObject($iBrush);~ Hier wird der Font des aktiven Tabs gesetzt: Param1 (14)=Schriftgröße, Param5 (600)=width, letzter=Fontname
[/autoit] [autoit][/autoit] [autoit]
Local $hFont = _WinAPI_CreateFont(14,0,0,0,600,False,False,False,$DEFAULT_CHARSET,$OUT_DEFAULT_PRECIS, _
$CLIP_DEFAULT_PRECIS,$DEFAULT_QUALITY,0,'Arial')
_WinAPI_SelectObject($hDC, $hFont)
_WinAPI_DeleteObject($hFont)Return $GUI_RUNDEFMSG
[/autoit]
EndFunc -
Wozu die Trennzeichen im String?
[autoit]$String = StringSplit(" ,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z",",")
[/autoit]
[autoit]
einfacher:$String = StringSplit(" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ","")
[/autoit]
-
lol, wenn $anstieg 1.4 ist, ist da ein Bug..
Ist nur ein zusammehgezimmertes Funktionsbeispiel. Der Fehler ist sicher, dass die Linie direkt auf eine Eckposition trifft, das wird hier bisher nicht abgefragt. - Ist halt nur ein Funktionsbeispiel.
-
- Hauptordner erstellen
- Backup ausführen und Backup-Ordner im Hauptordner erstellen
- Titel des Backup-Ordners unbedingt sortierbar: JJJJMMTT.. oder JJMMTT.. oder JJJJ-MM-TT.. oder ähnlich
- mit _FileListToArray(Hauptordner) die Backup-Ordner in ein Array schreiben
- wenn Anzahl (Array[0]) größer 5 dann
- - Array aufsteigend sortieren (Achtung: Array[0] enthält Zähler - nicht mitsortieren)
- - Array[1] = ältestes Element, mit DirRemove() löschen -
Wenn ich den Rückgabewert von _GUICtrlListView_GetSelectedIndices(...) in einer MsgBox ausgebe, kommt aber auch der richtige Indexwert!
Diese Funktion arbeitet sowohl mit ID als auch mit Handle, _GUICtrlListView_GetItemText() erfordert aber zwingend das Handle.
Deshalb ist es ratsam, den von Raupi gezeigten Weg immer zu gehen.
Zum Erstellen des ListView würde ich allerdings nur selten die UDF _GUICtrlListView_Create() benutzen.
Die Standardfunktion bietet nämlich den Handlingvorteil, durch mit Trennzeichen versehenen String, in einem Befehl Item und SubItem zu erstellen. So kann man diesen String wunderbar in einer Datei speichern, um daraus schnell das LV zu befüllen. -
Übrigens brauchst du keine Winkel berechnen. Wenn du den Anstieg der Geraden beim Berühren der Wand negierst, hast du automatisch den korrekten Winkel. Siehe mein kleines Bsp., die Linie kannst du stundenlang laufen lassen. Irgendwann ist dann das gesamte Feld bemalt.

Zum Testen kannst du in der Schleife den Counter für die Seitenberührungen nach Bedarf setzen.
Den Anstieg kann man mit der Variablen $anstieg ändern. Je größer der Wert, desto flacher der Winkel gegen die Horizontale.Spoiler anzeigen
[autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]
Opt('MustDeclareVars', 1)_Main()
[/autoit] [autoit][/autoit] [autoit]Func _Main()
[/autoit]
Local $hGUI, $hGraphics, $aBorder[4] = [20,380,20,280] ; left,right,top,bottom
Local $x = 205, $y = 145, $count = 0, $vector1 = -1, $vector2 = 1
Local $anstieg = 1.2 ; Je größer der Wert, desto flacher der Winkel gegen die Horizontale
$hGUI = GUICreate("Zeichnen", 400, 300)
GUISetState()
_GDIPlus_Startup ()
$hGraphics = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
While $count < 200
_GDIPlus_GraphicsDrawRect ($hGraphics, 20, 20, 360, 260)
_GDIPlus_GraphicsDrawLine ($hGraphics, $x, $y, $x+$anstieg*$vector2, $y+1*$vector1)
$x += $anstieg*$vector2
$y += 1*$vector1
Select
Case $x <= $aBorder[0]
$vector2 *= -1
$count += 1
WinSetTitle($hGUI, '', 'Seitenberührung: ' & $count)
Case $x >= $aBorder[1]
$vector2 *= -1
$count += 1
WinSetTitle($hGUI, '', 'Seitenberührung: ' & $count)
Case $y <= $aBorder[2]
$vector1 *= -1
$count += 1
WinSetTitle($hGUI, '', 'Seitenberührung: ' & $count)
Case $y >= $aBorder[3]
$vector1 *= -1
$count += 1
WinSetTitle($hGUI, '', 'Seitenberührung: ' & $count)
EndSelect
Sleep(5)
WEnd
Do
Until GUIGetMsg() = -3
_GDIPlus_GraphicsDispose ($hGraphics)
_GDIPlus_ShutDown ()
EndFunc ;==>_MainSo sieht es dann bei Anstieg 1.2 nach 200 Bandenberührungen aus:
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. -
Hi,
ist erst ein Anfang und wahrlich nicht so umfangreich, wie die ArrayMore.au3.
Ich werde hier erweiterte Funktionen zur Excel-UDF posten.Inhalt aktuell:
_ExcelSheetOrderByName()
sortiert Excel-Tabellenblätter nach deren Namen auf-/absteigend
(erfordert #Include <Array.au3>)
_ExcelBookGetWidth()
gibt die letzte beschriebene Zeile und/oder Spalte zurück (durchgängig belegt)__ExcelBookNew()
modifizierte Version der _ExcelBookNew
Neben dem Standardparameter $fVisible ist hier der Parameter $iSheetsStartup enthalten, über den festgelegt wird, wieviel Sheets das neue Dokument enthält.Spoiler anzeigen
[autoit];===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _ExcelSheetOrderByName($oExcel, $iDesc=0)
; Description:: Order ExcelBook-Sheets by name ascending (default) or descending
; Parameter(s): $oExcel - Excel object opened by a preceding call to _ExcelBookOpen() or _ExcelBookNew()
; $iDesc - order descending on=1/off=0 (default)
; Requirement(s): #Include <Array.au3>
; Return Value(s): On Success - Returns 1
; On Failure - Returns 0 and sets @error=1 - Specified object does not exist
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _ExcelSheetOrderByName($oExcel, $iDesc=0)
If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
If $iDesc <> 1 Then $iDesc = 0
Local $aList = _ExcelSheetList($oExcel)
_ArraySort($aList, $iDesc)
Local $pos = 1
For $i = 0 To UBound($aList) -1
If $i = 0 Then
_ExcelSheetMove($oExcel, $aList[$i], $pos, True)
Else
_ExcelSheetMove($oExcel, $aList[$i], $pos, False)
$pos += 1
EndIf
Next
Return 1
EndFunc ;==>_ExcelSheetOrderByName;==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function: _ExcelBookGetWidth($oExcel [, $iTyp=1 [, $iHeader=1 [, $sCol='A']]])
; Description: Gibt die letzte belegte Zeile und/oder Spalte einer Tabelle zurück
; Syntax: _ExcelBookGetWidth($oExcel, $iTyp=1, $iHeader=1, $sCol='A')
; Parameter(s): $oExcel - Referenz eines geöffneten Excel Objekts
; $iTyp - 1=letzte Spalte (Standard); 2=letzte Zeile; 3=Spalte|Zeile
; $iHeader - Nummer der Zeile, in der die letzte Spalte gesucht wird
; $sCol - Buchstabe der Spalte, in der die letzte Zeile gesucht wird
; Return Value(s): Erfolg - letzte Spalte und/oder Zeile
; Ist die Zeile oder Spalte leer, wird '0' zurückgegeben
; Fehler - 0 und setzt @error:
; @error=1 - Objekt existiert nicht
; @error=2 - $iTyp oder $iHeader außerhalb des Wertebereichs (1 - 65536)
; @error=3 - $sCol außerhalb des Wertebereichs (A - IV)
; Requirement(s): $iHeader bzw. $sCol sind durchgängig bis zum letzten Zeilen-/Spaltenelement belegt
; Author(s): BugFix ( [email='bugfix@autoit.de'][/email] )
;==================================================================================================
Func _ExcelBookGetWidth($oExcel, $iTyp=1, $iHeader=1, $sCol='A')
If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
If $iTyp < 1 Or $iHeader < 1 Or $iTyp > 65536 Or $iHeader > 65536 Then Return SetError(2, 0, 0)
$sCol = StringUpper($sCol)
If StringLen($sCol) = 2 Then
Local $str = StringSplit($sCol, '')
If Asc($str[1]) < 65 Or Asc($str[1]) > 73 Then Return SetError(3, 0, 0)
If Asc($str[2]) < 65 Or Asc($str[2]) > 90 Or _
(Asc($str[1]) = 73 And Asc($str[2]) > 86) Then Return SetError(3, 0, 0)
ElseIf StringLen($sCol) > 2 Then
Return SetError(3, 0, 0)
EndIf
If Asc($sCol) < 65 Or Asc($sCol) > 90 Then Return SetError(3, 0, 0)
Local $sColOut, $iRowOut
Select
Case $iTyp = 1 Or $iTyp = 3
For $i = 65 To 90
If $oExcel.Activesheet.Range(Chr($i) & $iHeader).Value = '' Then
If $i = 65 Then
$sColOut = 0
Else
$sColOut = Chr($i-1)
EndIf
ExitLoop
EndIf
If $i = 90 Then
For $j = 65 To 73
For $k = 65 To 90
If $j = 73 And $k = 87 Then
$sColOut = Chr($j) & Chr($k-1)
ExitLoop
EndIf
If $oExcel.Activesheet.Range(Chr($j) & Chr($k)).Value = '' Then
If $k = 65 Then
$sColOut = Chr($j)
Else
$sColOut = Chr($j) & Chr($k-1)
EndIf
ExitLoop
EndIf
Next
Next
EndIf
Next
ContinueCase
Case $iTyp = 2
For $i = 1 To 65536
If $oExcel.Activesheet.Range($sCol & $i).Value = '' Then
$iRowOut = $i -1
ExitLoop
EndIf
Next
EndSelect
Switch $iTyp
Case 1
Return $sColOut
Case 2
Return $iRowOut
Case 3
Return $sColOut & '|' & $iRowOut
EndSwitch
EndFunc ;==>_ExcelBookGetWidthFunc __ExcelBookNew($fVisible = 1, $iSheetsStartup = 1)
[/autoit]
; modified by BugFix
Local $oExcel = ObjCreate("Excel.Application")
If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
If Not IsNumber($fVisible) Then Return SetError(2, 0, 0)
If $fVisible > 1 Then $fVisible = 1
If $fVisible < 0 Then $fVisible = 0
If $iSheetsStartup < 1 Then $iSheetsStartup = 1
With $oExcel
.SheetsInNewWorkbook = $iSheetsStartup
.Visible = $fVisible
.WorkBooks.Add
.ActiveWorkbook.Sheets(1).Select ()
EndWith
Return $oExcel
EndFuncDL bisher: 8
-
ja schon aber der Winkel verändert sich ständig
Aber doch nicht von allein! Da passiert doch nur, was du programmierst. Also sind doch Richtung und somit Winkel bekannt.
Ich verstehe wirklich nicht dein Problem. Oder weißt du nicht, was du programmierst?
-
UPS, doch noch nicht ganz...
Mein Problem ist, wie findet autoit diese Zahlen heraus ?
Da habe ich irgendwie ein sehr großes Problem

mfg Bio
Du zeichnest doch alles selber, also hast du eine Funktion, die deine Gerade innerhalb eines von dir festgelegten Bereiches grafisch darstellt. Demzufolge hast du Richtungsvektor und damit auch den Winkel.
-
eine idee wie ich die agenten aus eine ini einlesen kann?
Äh.. mit IniWrite und IniRead arbeiten?Hast du denn das andere gelöst?
-
Geht leider nicht in einem Rutsch, aber geht:
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
Local $inCategory = 'Category3'
Local $inKey = '33XDA377C'
Local $replValue = 'ABCDEFGHIJK'Local $text = _
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' & @CRLF & _
'<Root>' & @CRLF & _
'<Category1>' & @CRLF & _
'<499A844EOSJ40 value="9OAIBF9849574EB4240AB2ASD18DE9EF03605BB14C639541ECF721A6B8B4C6"/>' & @CRLF & _
'<2E2345B37DE50 value="A8ASD3CA6E22E5B2242E61CDE1EAASDF97CB56C1565D03CE50DASF968428AS6"/>' & @CRLF & _
'</Category1>' & @CRLF & _
@CRLF & _
'<Category2>' & @CRLF & _
'<ZD8BF85F64 value="46FB045CD8B7GFF85E6BCDA5D382SAD922FFDA40F85FA9F92"/>' & @CRLF & _
'</Category2>' & @CRLF & _
@CRLF & _
'<Category3>' & @CRLF & _
'<ADO4B1AS4B3C value="48594229B26143B12B3C5C3C7CE11B46F67EA7C6A375C7CE"/>' & @CRLF & _
'<33XDA377C value="D2656ED543F36DB3D7C5B5456700AA876924E8D8975AEAA9"/>' & @CRLF & _
'<2A731C3ASDB7 value="9640EAD3A1C3DE39455F5C2D70554D2798D0B5A63999C8EF"/>' & @CRLF & _
'</Category3>' & @CRLF & _
'</Root>'Local $patternCategories = '<(?:Category\d+)>\r\n(?:<(?:[\w\d]+)\s+value="(?:[\w\d]+)"/>\r\n)*(?:</Category\d+>)(?:\r\n)+'
[/autoit] [autoit][/autoit] [autoit]
Local $patternDetail = '<[\w\d]+\s+value="[\w\d]+"/>'
Local $patternReplace = '(<)(' & $inKey & ')(\s+value=")([\w\d]+)("/>)'; Match auf alle Categories, je Category ein Arrayelement
[/autoit] [autoit][/autoit] [autoit]
Local $MatchCat = StringRegExp($text, $patternCategories, 3); innerhalb gesuchter Categorie alle key=value -Paare selektieren
[/autoit] [autoit][/autoit] [autoit]
Local $aPair
For $i = 0 To UBound($MatchCat) -1
If Not StringInStr($MatchCat[$i], $inCategory) Then ContinueLoop
$aPair = StringRegExp($MatchCat[$i], $patternDetail, 3)
ExitLoop
Next; Schlüssel suchen und Wert ersetzen
[/autoit] [autoit][/autoit] [autoit]
Local $sTmp = '<' & $inCategory & '>'
For $j = 0 To UBound($aPair) -1
If StringRegExp($aPair[$j], $patternReplace) Then
$aPair[$j] = StringRegExpReplace($aPair[$j], $patternReplace, '$1$2$3' & $replValue & '$5')
EndIf
$sTmp &= $aPair[$j] & @CRLF
Next
; korrigierten String zurückschreiben in Categorie
$MatchCat[$i] = $sTmp & '</' & $inCategory & '>' & @CRLF; alle Categories zurückschreiben
[/autoit] [autoit][/autoit] [autoit]
$sTmp = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' & @CRLF & '<Root>' & @CRLF
For $i = 0 To UBound($MatchCat) -1
$sTmp &= $MatchCat[$i] & @CRLF
Next; zurückschreiben in Datei - hier in Console
[/autoit]
ConsoleWrite($sTmp & @CRLF & '</Root>' & @CRLF) -
Einziges Problem: Wie kann ich den Eintrag dann mit GUICtrlDelete den Eintrag löschen? (Man bekommt ja immer nur die Eintrags Nr)
Na du bist ja ein Scherzkeks
- Was benötigt denn _GUICtrlListView_DeleteItem() zum Löschen.... den Index ahhhhh 
Zum Löschen von markierten Item(s) kannst du aber auch gleich _GUICtrlListView_DeleteItemsSelected() verwenden. -
why illegal un gg die boardregeln?
Was bedeutet, jede Taste abfangen? ==> Keylogging! Nun verstanden?