Dafür hatte ich vor 10? Jahren mal ein Skript gepostet. Filtere mal im Skripteforum meine Posts und such in dem Zeitraum. Titel weiß ich nicht mehr. Ich glaube es hieß etwas mit "Andocken".
Edit:
Habs gefunden GUIDocking UDF
Dafür hatte ich vor 10? Jahren mal ein Skript gepostet. Filtere mal im Skripteforum meine Posts und such in dem Zeitraum. Titel weiß ich nicht mehr. Ich glaube es hieß etwas mit "Andocken".
Edit:
Habs gefunden GUIDocking UDF
Zitat von MuashiDie Laufvariable $i in einer For...Next-Schleife ist ja nicht deklarationspflichtig bzw. gilt automatisch als deklariert, selbst bei Opt('MustDeclareVars', 1) .
(ich vermute mal, das war ursprünglich ein Bequemlichkeitsfeature)
Nein, keine Bequemlichkeit. Zählervariablen werden üblicherweise durch Verwendung deklariert, da sie unabdingbarer Bestandteil der Schleife sind. In anderen Sprachen existiert i.A. die Zählervariable aber auch nur innerhalb der Schleife, in AutoIt lebt sie weiter. Das erscheint manchmal ganz praktisch, da ich z.B. bei Verlassen der Schleife durch bestimmte Bedingung, den Wert des Zählers bei Gültigkeit dieser Bedingung sofort greifbar habe ohne ihn einer vorab deklarierten Variablen zuweisen zu müssen. Das kann aber durchaus auch zu Fehlern führen (bedingte Ausführung von Schleifen in einem Level).
Ich würde parallel einen "Erfolgs-Launcher" laufen lassen.
Bevor Run(Irgendeine.exe) gestartet wird, übergibst du an den Launcher den Prozeßnamen, der existiert, wenn die Datei erfolgreich gestartet wurde. Im Hintergrund pollt der Launcher dann etwa alle 500ms und prüft die Prozess-List. Wurde ein Prozeß aus seiner Überwachungsliste gefunden, wird Erfolgs-Counter um 1 erhöht und der Eintrag aus der Überwachungsliste entfernt (optional zusätzlich Logeintrag).
Nach Start des letzten Programms, wird ein MaxWait-Befehl übergeben (Einfach einen Fantasie-Dateinamen übergeben, z.B. "MaxWait.process") und bei Erscheinen dieses Dateinamens in der Überwachungsliste den Namen sofort entfernen und ein TimeOut laufen lassen. Ist nach Ablauf des TimeOut die Liste noch nicht leer, die Namen der nicht (erfolgreich) gestarteten Prozesse ausgeben.
Du teilst die Anzahl der Listeneinträge durch die gewünschte Anzahl an Instanzen. Es ist eher unwahrscheinlich, dass dieses ein ganzzahliger Wert wird. Also musst du dich entscheiden, ob du die nächstgrößere oder -kleinere Ganzzahl verwenden möchtest (Ceiling / Floor). Die Anzahl der möglichen Prozesse brauchst du nicht in einer Schleife abarbeiten - das ergibt sich von selbst. Nehmen wir an du hast das Verarbeitungsskript kompiliert als "work.exe". Parameter-Aufruf wäre dann z.B. so:
ShellExecute("work.exe", '"param string 1" "param string 2" "param string n"')
In deinem Aufrufskript gehst du so vor:
Local $iInstances = ....
Local $aList = FileReadToArray($ComputerList)
Local $iLines = @extended
Local $iLinesPerInstance = Ceiling($iLines / $iInstances)
Local $sExe = "PFAD\ZUR\KOMPILIERTEN\DATEI"
Local $sParam = ''
Local $iParamCount = 0
For $i = 0 To UBound($aList) -1
If $iParamCount = $iLinesPerInstance Or $i = UBound($aList) -1 Then
ShellExecute($sExe, $sParam)
$iParamCount = 0
$sParam = ''
Else
$iParamCount += 1
$sParam &= StringFormat('%s "%s"', $sParam, $aList[$i])
EndIf
Next
Alles anzeigen
Das Verarbeitungsskript sollte kein Problem sein. Siehe hier.
_WinAPI_RedrawWindow()
Die Erklärung zu den $iFlags könnte m. E. etwas konkreter sein (mehr an den Inhalt von MSDN angelehnt), dann sind die Verwendungsmöglichkeiten etwas eindeutiger.
Vor allem fehlen mir in der AutoIt-Hilfe (sowohl deutsch als auch englisch) die Gruppierungen der Flags und deren Beschreibung. Hier mal meine direkte Übersetzung aus MSDN. Evtl. ist es ja sinnvoll etwas zu übernehmen:
----------------------------------------------------------------------------------------------------
BOOL RedrawWindow(
HWND hWnd,
const RECT *lprcUpdate,
HRGN hrgnUpdate,
UINT flags
);
++++ flags ++++
----------------------------------------------------------------------------------------------------
# Die folgenden Flags werden zum Annullieren des Fensters verwendet.
----------------------------------------------------------------------------------------------------
RDW_ERASE (0x0004)
Bewirkt, dass das Fenster eine WM_ERASEBKGND-Nachricht empfängt, wenn das Fenster neu gezeichnet wird. Das Flag RDW_INVALIDATE muss ebenfalls angegeben werden. Andernfalls hat RDW_ERASE keine Auswirkungen.
RDW_FRAME (0x0400)
Bewirkt, dass ein Teil des Nicht-Client-Bereichs des Fensters, der den Aktualisierungsbereich schneidet, eine WM_NCPAINT-Nachricht empfängt. Das Flag RDW_INVALIDATE muss ebenfalls angegeben werden. Andernfalls hat RDW_FRAME keine Auswirkungen. Die WM_NCPAINT-Nachricht wird normalerweise nicht während der Ausführung von RedrawWindow gesendet, es sei denn, RDW_UPDATENOW oder RDW_ERASENOW ist angegeben.
RDW_INTERNALPAINT (0x0002)
Bewirkt, dass eine WM_PAINT-Nachricht an das Fenster gesendet wird, unabhängig davon, ob ein Teil des Fensters ungültig ist.
RDW_INVALIDATE (0x0001)
Ungültig für lprcUpdate oder hrgnUpdate (nur eines darf nicht NULL sein). Wenn beide NULL sind, wird das gesamte Fenster ungültig gemacht.
----------------------------------------------------------------------------------------------------
# Die folgenden Flags werden verwendet, um das Fenster zu überprüfen.
----------------------------------------------------------------------------------------------------
RDW_NOERASE (0x0020)
Unterdrückt alle ausstehenden WM_ERASEBKGND-Nachrichten.
RDW_NOFRAME (0x0800)
Unterdrückt alle ausstehenden WM_NCPAINT-Nachrichten. Dieses Flag muss mit RDW_VALIDATE verwendet werden und wird normalerweise mit RDW_NOCHILDREN verwendet. RDW_NOFRAME sollte mit Vorsicht verwendet werden, da dies dazu führen kann, dass Teile eines Fensters falsch gezeichnet werden.
RDW_NOINTERNALPAINT (0x0010)
Unterdrückt alle anstehenden internen WM_PAINT-Nachrichten. Dieses Flag wirkt sich nicht auf WM_PAINT-Nachrichten aus, die aus einem Nicht-NULL-Aktualisierungsbereich stammen.
RDW_VALIDATE (0x0008)
Überprüft lprcUpdate oder hrgnUpdate (nur eines darf nicht NULL sein). Wenn beide NULL sind, wird das gesamte Fenster überprüft. Dieses Flag wirkt sich nicht auf interne WM_PAINT-Nachrichten aus.
----------------------------------------------------------------------------------------------------
# Die folgenden Flags steuern, wann ein Neuzeichnen erfolgt. RedrawWindow aktualisiert nur dann, wenn eines dieser Flags angegeben wird.
----------------------------------------------------------------------------------------------------
RDW_ERASENOW (0x0200)
Bewirkt, dass die betroffenen Fenster (wie durch die Flags RDW_ALLCHILDREN und RDW_NOCHILDREN angegeben) ggf. WM_NCPAINT- und WM_ERASEBKGND-Nachrichten erhalten, bevor die Funktion zurückkehrt. WM_PAINT-Nachrichten werden zur normalen Zeit empfangen.
RDW_UPDATENOW (0x0100)
Bewirkt, dass die betroffenen Fenster (wie durch die Flags RDW_ALLCHILDREN und RDW_NOCHILDREN angegeben) ggf. WM_NCPAINT-, WM_ERASEBKGND- und WM_PAINT-Nachrichten erhalten, bevor die Funktion zurückkehrt.
----------------------------------------------------------------------------------------------------
# Standardmäßig hängen die von RedrawWindow betroffenen Fenster davon ab, ob das angegebene Fenster den WS_CLIPCHILDREN-Stil hat.
# Untergeordnete Fenster, die nicht im WS_CLIPCHILDREN-Stil sind, sind davon nicht betroffen.
# Nicht-WS_CLIPCHILDREN Fenster werden rekursiv validiert oder für ungültig erklärt, bis ein WS_CLIPCHILDREN-Fenster gefunden wird.
# Die folgenden Flags steuern, welche Fenster von der RedrawWindow-Funktion betroffen sind.
----------------------------------------------------------------------------------------------------
RDW_ALLCHILDREN (0x0080)
Schließt ggf. untergeordnete Fenster in das Neuzeichnen ein.
RDW_NOCHILDREN (0x0040)
Schließt ggf. untergeordnete Fenster vom Neuzeichnen aus.
----------------------------------------------------------------------------------------------------
Alles anzeigen
Das Zugreifen auf Elemente in der Taskbar ist nicht so simpel, wie man denken mag. Ich dachte: Handle der Shell_TrayWnd abfragen - EnumChildWindows bringt die Subfenster - fertig.
Das ist aber nur die halbe Wahrheit, denn wenn man nach der ChildEnumertion anschliessend das Parent abfragt, ist dies nur z.T. das Shell_TrayWnd. Teilweise sind die enthaltenen Fenster untereinander verbunden. Mit dem folgenden Skript bekommt man die tatsächliche Zuordnung:
#include <WinAPI.au3>
#include <WinAPISys.au3>
Local $hTrayWnd = WinGetHandle('[CLASS:Shell_TrayWnd]')
Local $aChildren = _WinAPI_EnumChildWindows($hTrayWnd, False)
Local $iInstance = 1, $hParent, $sOutput = StringFormat('\n! %s\t[CLASS:Shell_TrayWnd] --> EnumChildWindows:\n\n', $hTrayWnd)
If IsArray($aChildren) Then
For $i = 1 To $aChildren[0][0]
If $aChildren[$i-1][1] = $aChildren[$i][1] Then
$iInstance += 1
Else
$iInstance = 1
EndIf
$hParent = _WinAPI_GetParent($aChildren[$i][0])
$sOutput &= StringFormat('> %s\t[CLASS:%s; INSTANCE:%s]\n- \t\tPARENT:\t%s [CLASS:%s]\n\n', $aChildren[$i][0], _
$aChildren[$i][1], $iInstance, $hParent, _WinAPI_GetClassName($hParent))
Next
ConsoleWrite($sOutput)
EndIf
Alles anzeigen
Um andere Instanzen mit Inhalt zu versorgen, musst du diese (kompilierte Datei, nicht Funktion) mit Parametern aufrufen.
Ich würde so vorgehen:
- Skript 1 (Aufrufskript):
Liest Textdatei in Array, jede Zeile ein Eintrag. Iteriert durch das Array und fügt Parameterstrings zusammen: "Zeile 1" & "SPACE" & "Zeile 2" & ... - Sind 10 Parameter zusammengefügt wird das Verarbeitungsskript aufgerufen und der Parameterstring mit übergeben. Intern zurücksetzen Parameterstring und weiter durch Array iterieren usw. usf.
- Skript 2 (Verarbeitungsskript):
Arbeitet das Parameterarray ($CMDLINE) ab, mit dem von dir vorgesehenen Code.
Was bitte soll ein CUI Fenster sein?
Eine konsolenbasierte Anwendung verzichtet i. A. auf Fenster (das ist der Sinn einer CUI). Du kannst natürlich Fenster (GUI) auch hierbei erstellen und anzeigen, aber das ist vom Handling wie sonst auch.
Aber ich weiß nicht genau wie ich VOR dem Where den Order by befehl ausführen soll.
Gar nicht. Sortierung wird immer auf die Ergebnisse einer Abfrage angewendet. Wenn du also aus einer Teilmenge auswählen willst, musst du diese Teilmenge durch ein SubQuery erzeugen (wurde schon drauf hingewiesen).
Oder, wenn das zu kompliziert wird, kannst du die Teilergebnisse auch in einer temporären Tabelle speichern und diese für die Folgeabfragen nutzen. Falls Der SQL-Dialekt Batch-Queries anbietet (nutze ich z.B. in Firebird SQL), werden diese temporären Tabellen auch nur im RAM direkt aus einer Abfrage erzeugt und bedürfen keiner weiteren Deklaration.
Von "alles in die user.calltips" bin ich nicht so der Freund. Ich hab lieber für jede UDF ne eigene Datei.
Du kannst für alles eigene Dateien erstellen und einfach in der SciTEUser.properties einfügen: import my.special.abbrev
Ich handhabe das so, dass ich die entsprechenden Dateien an einem beliebigen Ort gespeichert habe. Um aber kein Pfadwirrwarr beim import zu haben, sind die Dateien per Hardlink auch im Pfad C:\Users\USER\AppData\Local\AutoIt v3\SciTE angelegt. Dort sucht ScITE standardmäßig - das import benötigt somit keine weitere Pfadangabe.
Bezüglich zum GDI Input ist mir leider bisher keine verwendbare Alternative eingefallen.
Wenn ich richtig verstanden habe, wolltest du dass der User einen Hotkey erstellen kann. Dazu brauchst du nicht wirklich die Tasten abfragen. Hier mal ein Lösungsansatz auf ganz triviale Art:
Auswahl Sondertaste per Button, Zeichentaste per Eingabe ins Inputfeld.
Global $hGui = GUICreate("HotKey Creator")
Global Enum $gi_SHIFT, $gi_CTRL, $gi_ALT, $gi_WIN, $iCount
Global $ga_BaseKey[][4] = [[0,'+','SHIFT',False],[0,'^','CTRL',False],[0,'!','ALT',False],[0,'#','WIN',False]]
Global $g_ColorUnselected = 0xE3E3E3, $g_ColorSelected = 0xFAFAFA
Global $x = 10, $y = 10
For $i = 0 To $iCount -1
$ga_BaseKey[$i][0] = GUICtrlCreateButton($ga_BaseKey[$i][2], $x, $y, 40, 22)
GUICtrlSetBkColor(-1, $g_ColorUnselected)
$x = $i < $iCount ? $x +50 : $x +10
Next
Global $cAddKey = GUICtrlCreateInput("", $x, $y, 80, 22)
Global $nMsg, $indexCtrl, $sRead
GUISetState()
While True
$nMsg = GUIGetMsg()
$indexCtrl = -1
For $i = 0 To UBound($ga_BaseKey) -1
If $ga_BaseKey[$i][0] = $nMsg Then
$indexCtrl = $i
ExitLoop
EndIf
Next
Select
Case $nMsg = -3
Exit
Case $indexCtrl > -1
$sRead = GUICtrlRead($cAddKey)
$ga_BaseKey[$indexCtrl][3] = Not $ga_BaseKey[$indexCtrl][3]
If $ga_BaseKey[$indexCtrl][3] Then
GUICtrlSetBkColor($ga_BaseKey[$indexCtrl][0], $g_ColorSelected)
If Not StringInStr($sRead, $ga_BaseKey[$indexCtrl][1]) Then GUICtrlSetData($cAddKey, $ga_BaseKey[$indexCtrl][1] & $sRead)
Else
GUICtrlSetBkColor($ga_BaseKey[$indexCtrl][0], $g_ColorUnselected)
If StringInStr($sRead, $ga_BaseKey[$indexCtrl][1]) Then GUICtrlSetData($cAddKey, StringReplace($sRead, $ga_BaseKey[$indexCtrl][1], ''))
EndIf
EndSelect
WEnd
Alles anzeigen
Das Problem ist jedoch, dass die Microsoft Funktion "KBDLLHOOKSTRUCT"
ausschließlich "low-level" input events erkennt.
vkCode für SHIFT: left=0xA0, right=0xA1, für ALT=0xA4
Die Struktur speichert "flags" - und diese repräsentieren das Release der entsprechenden Tasten: 0x80= UP for 'normal' keys and left pairs, 0x81= UP for right pairs
Deine Konstruktion ist natürlich wenig effizient mit den If-Statements. Das kannst du alles mit dem Hook abwickeln. Aber hier stoßen wir an die Grenzen unseres Supports: Keylogging ist nunmal nichts, was wir unterstützen wollen, die Möglichkeit des mIßbrauchs ist zu groß.
Hier mal nur als Bsp., wie es funktioniert. Das Drumherum kannst du dann anpassen:
Global $hGui = GUICreate('Test')
Global $cCombo = GUICtrlCreateCombo('', 10, 10, 200)
Global $sCombo = 'Val_1|Val_2|Val_3|Val_4'
GUICtrlSetData($cCombo, $sCombo)
Global $cAdd = GUICtrlCreateButton('Neuen Eintrag speichern', 220, 10, 150, 22)
GUISetState()
While True
Switch GUIGetMsg()
Case -3
Exit
Case $cAdd
$sCombo &= "|" & GUICtrlRead($cCombo)
GUICtrlSetData($cCombo, "|" & $sCombo)
EndSwitch
WEnd
Alles anzeigen
Laut Dokumentation ist das eine “__INOUT“ Funktion und daher habe ich “by reference“ angegeben, aber die Bufferlänge bleibt bei meiner Vorgabe.
Häufig verwenden Dll folgenden Mechanismus: Aufruf der Dll mit allen Parametern und als Bufferlänge null (Wert "0" oder "Null"), dann wird die Bufferlänge auf den erforderlichen Wert gesetzt. Den Wert verwende ich dann um meinen Buffer auf die richtige Länge zu setzen und rufe dann die Dll korrekt auf. Ggf. muss zur Länge 1 addiert werden, falls der Buffer einen null-terminierten String halten soll (sowas steht in der Doku).
Ich habe mal die relevanten Teile aus einem Projekt von mir herauskopiert.
Bitte beachte, dort sind teilweise Bezüge auf Globale Variablen und GUI-Elemente, die nur in meinem Projekt existieren und für die Funktionalität selbst keine Bedeutung haben. Wirst du schnell sehen und kannst das entsprechend auskommentieren.
Wenn du nicht klar kommst, melde dich wieder.
Global Const $tagField = "char name[11];" & _ ; 0-10 | 11 bytes | field name
"char type;" & _ ; 11 | 1 byte | field type in ASCII
"uint memadress;" & _ ; 12-15 | 32 bit number | field data address
"byte len;" & _ ; 16 | 1 byte | field length
"byte deccount;" & _ ; 17 | 1 byte | field decimal count
"byte reserved[14];" ; 18-31 | 14 bytes | reserved bytes
Global Const $tagFileHeader = "byte ver;" & _ ; 0 | 1 byte | dBASE III version number
"byte date[3];" & _ ; 1-3 | 3 bytes | date of last update
"uint reccount;" & _ ; 4-7 | 32 bit number | number of records in data file
"ushort headerlength;" & _ ; 8-9 | 16 bit number | length of header structure
"ushort reclength;" & _ ; 10-11 | 16 bit number | length of the record
"byte reserved[20];" ; 12-31 | 20 bytes | reserved bytes
;~ $tagField & _ ; 32-n | 32 bytes each | field descriptor array
;~ "byte terminate;" ; n+1 | 1 byte | 0DH as the field terminator
Global $Header = DllStructCreate($tagFileHeader)
Func _LoadDBF()
Local $DBFFile = _WinAPI_CreateFile(GUICtrlRead($inPathDBF) , 2, 2, 2)
Local $ReadChars
If _WinAPI_ReadFile($DBFFile, DllStructGetPtr($Header), DllStructGetSize($Header), $ReadChars) Then
If DllStructGetData($Header, "ver") <> 3 Then ; Version muss
MsgBox(16, 'Error', "No supportet dbase format (only dbase 3 without .DBT-files)")
_WinAPI_CloseHandle($DBFFile)
Exit
EndIf
; $tagField erstellen
Local $FieldDescriptor = DllStructCreate($tagField)
; Infos aus Header auslesen
Local $HeaderLength = DllStructGetData($Header, "headerlength")
Local $FieldsCount = Floor(($HeaderLength - DllStructGetSize($Header) - 1) / DllStructGetSize($FieldDescriptor))
Local $RecordLength = DllStructGetData($Header, "reclength")
Local $RecordsCount = DllStructGetData($Header, "reccount")
; Zahl der Felder: (Headergröße- Dateiheadergröße- terminator-byte) / Feldbeschreibungs-größe
If $FieldsCount = 0 Then
MsgBox(16, '', "No fields")
Else
Global $DatabaseArray[$RecordsCount + 1][$FieldsCount]
Global $databaseFieldInfos[$FieldsCount][5]
For $i = 1 To $FieldsCount
_WinAPI_ReadFile($DBFFile, DllStructGetPtr($FieldDescriptor), DllStructGetSize($FieldDescriptor), $ReadChars)
$DatabaseArray[0][$i - 1] = DllStructGetData($FieldDescriptor, "name")
For $s = 0 To 4
$databaseFieldInfos[$i - 1][$s] = DllStructGetData($FieldDescriptor, $s + 1)
Next
Next
Local $CHECKREAD = DllStructCreate("byte terminate")
_WinAPI_ReadFile($DBFFile, DllStructGetPtr($CHECKREAD), 1, $ReadChars)
If DllStructGetData($CHECKREAD, 1) == 0x0D Then
Local $RecordStruct = _CreateRecordStruct($databaseFieldInfos)
GUICtrlSetState($Progress1, $GUI_SHOW)
GUICtrlSetData($lbMsg, 'Daten werden konvertiert')
$iStep = 100/$RecordsCount
For $i = 1 To $RecordsCount
$iProgress += $iStep
GUICtrlSetData($Progress1, $iProgress)
_WinAPI_ReadFile($DBFFile, DllStructGetPtr($RecordStruct), DllStructGetSize($RecordStruct), $ReadChars)
If $ReadChars = 0 Then
; keine Felder mehr (Fehler)
ReDim $DatabaseArray[$i][$FieldsCount]
ExitLoop
EndIf
For $j = 1 To $FieldsCount
$DatabaseArray[$i][$j - 1] = DllStructGetData($RecordStruct, "field" & $j)
#Region Datentypen konvertieren
Switch $databaseFieldInfos[$j - 1][1]
Case "C" ; characters: nothing
If StringInStr($DatabaseArray[$i][$j - 1], "00:00:00", 1) Then
$DatabaseArray[$i][$j - 1] = StringStripWS(StringRegExpReplace($DatabaseArray[$i][$j - 1], _
"(\d\d)(\.)(\d\d)(\.)(\d{4})(\s00:00:00)", "$1$3$5"), 3)
Else
$DatabaseArray[$i][$j - 1] = OemToChar($DatabaseArray[$i][$j - 1])
If StringLen($DatabaseArray[$i][$j - 1]) > 30 Then _
$DatabaseArray[$i][$j - 1] = StringLeft($DatabaseArray[$i][$j - 1], 30)
EndIf
Case "N" ; numeric
If StringInStr($DatabaseArray[$i][$j - 1], '.') Then
$DatabaseArray[$i][$j - 1] = StringTrimRight(StringStripWS(StringReplace($DatabaseArray[$i][$j - 1], '.', ','), 1), 2)
Else
$DatabaseArray[$i][$j - 1] = Number($DatabaseArray[$i][$j - 1])
EndIf
Case "L"
Switch $DatabaseArray[$i][$j - 1]
Case "?"
$DatabaseArray[$i][$j - 1] = "N/A"
Case 'Y', 'y', 'T', 't'
$DatabaseArray[$i][$j - 1] = True
Case 'N', 'n', 'F', 'f'
$DatabaseArray[$i][$j - 1] = False
EndSwitch
Case "D"
$DatabaseArray[$i][$j - 1] = StringRegExpReplace($DatabaseArray[$i][$j - 1], "\A(\d{4})(\d\d)(\d\d)\Z", "$1/$2/$3")
Case "M" ; not supportet
EndSwitch
#EndRegion Datentypen konvertieren
Next
Sleep(10)
Next
Else
MsgBox(0, 'Error', "Wrong fielddescriptortable")
EndIf
EndIf
_WinAPI_CloseHandle($DBFFile)
EndIf
; Spalten infos hizufügen zu Feld-Info array
;~ ReDim $databaseFieldInfos[UBound($databaseFieldInfos)+1][5]
;~ $databaseFieldInfos[UBound($databaseFieldInfos)-1][0] = "[[ NAME ]]"
;~ $databaseFieldInfos[UBound($databaseFieldInfos)-1][1] = "[[ TYP ]]"
;~ $databaseFieldInfos[UBound($databaseFieldInfos)-1][2] = "[[ ADRESSE ??? ]]"
;~ $databaseFieldInfos[UBound($databaseFieldInfos)-1][3] = "[[ Byte-Länge ]]"
;~ $databaseFieldInfos[UBound($databaseFieldInfos)-1][4] = "[[ Dezimalstellen ]]"
GUICtrlSetData($Progress1, 100)
Sleep(1000)
GUICtrlSetData($inReFrom, _FormatDateGE($DatabaseArray[1][3]))
GUICtrlSetData($inReTo, _FormatDateGE($DatabaseArray[UBound($DatabaseArray)-1][3]))
GUICtrlSetData($lbMsg, 'Konvertierung abgeschlossen - Bereit zum Export')
Sleep(500)
GUICtrlSetData($Progress1, 0)
EndFunc
Func _FormatDateGE($sDate)
Return StringRegExpReplace($sDate, '(\d{2})(\d{2})(\d{4})', '\1.\2.\3')
EndFunc
Func _CreateRecordStruct(ByRef $databaseFieldInfos)
Local $sText = "char deleted;"
For $i = 1 To UBound($databaseFieldInfos)
$sText &= "char field" & $i & "[" & $databaseFieldInfos[$i - 1][3] & "];"
Next
Return DllStructCreate($sText)
EndFunc ;==>_CreateRecordStruct
;===============================================================================
; Name: OemToChar
; Description: Wandelt einen ASCII- in einen ANSI-String
; Parameter(s): $szSrc = String der umgewandelt werden soll
; Requirement(s): keine
; Return Value(s): bei Erfolg: umgewandelter String
; bei Fehler: "" und @error = 1
; Author(s): bernd670
;===============================================================================
Func OemToChar($szSrc)
;~ Private Declare Function OemToChar Lib "user32.dll" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
Local $placeholder
For $i = 0 To StringLen($szSrc)
$placeholder &= " "
Next
Local $lRetVal = DllCall("user32.dll", "long", "OemToChar", "str", $szSrc, "str",$placeholder)
If IsArray($lRetVal) And $lRetVal[0] = 1 Then
Return SetError(0,0,$lRetVal[2])
EndIf
Return SetError(1,0,"")
EndFunc ;==>OemToChar
Alles anzeigen
Protokolliere mal alle WLAN-Events (ist standardmäßig aus), vielleicht bringt das mehr Infos.
Ich kann dir eine recht junge Sprache anbieten: nim
Ich beschäftige mich gerade damit und bin schwer angetan. Die Sprache vereint in sich all die Dinge, die man in diversen Sprachen toll findet. Syntaktisch mit viel Sugar ausgestattet. ![]()
Oder geht das auch?
Klar, ich hatte nur anhand deines Eintrags im Post das Pattern erstellt und nicht die Datei geladen:
Local $s = _
" 0 0 0 An explosion of lava ... by D. Egnor" & @CRLF & _
"60 60 60" & @CRLF & _
"64 60 60" & @CRLF & _
"72 60 60" & @CRLF & _
"76 56 56" & @CRLF & _
"100 48 48" & @CRLF & _
"108 48 48" & @CRLF & _
"112 44 44" & @CRLF & _
"212 12 12" & @CRLF & _
"224 8 8" & @CRLF & _
"232 8 8" & @CRLF & _
"236 4 4" & @CRLF & _
"244 4 4" & @CRLF & _
"252 12 0" & @CRLF & _
"252 20 0" & @CRLF & _
"252 28 0" & @CRLF & _
"160 0 0" & @CRLF & _
"156 4 4" & @CRLF & _
"152 4 4" & @CRLF & _
"148 8 8" & @CRLF & _
"140 12 12" & @CRLF & _
"104 32 32" & @CRLF & _
"100 36 36" & @CRLF & _
"100 36 36" & @CRLF & _
"96 40 40" & @CRLF & _
"88 44 44" & @CRLF & _
"60 60 60" & @CRLF & _
"60 60 60"
Local $sResult = StringRegExpReplace($s, '(?m)\s*(\d+)\s+(\d+)\s+(\d+)(\D*)', '\1 \2 \3' & @CRLF)
ConsoleWrite($sResult & @CRLF)
Alles anzeigen