Beiträge von BugFix
-
-
Mit _WinAPI_GetTopWindow holst du dier das Fenster an der Spitze der Z-Order.
Und dann kannst du die in der Reihenfolge darunterliegenden Fenster abfragen mit _WinAPI_GetWindow( $hWnd_Top, $GW_HWNDNEXT) -
Werde wohl die WMI-Variante nutzen. Der Aufruf findet mehrfach statt, bis sicher ist, dass der DB-Dienst nicht mehr läuft. Danach kann ich das Datenbank-Backup anschieben.
Danke nochmal fürs Testen.
-
wie gebe Ich den
im Insert INto ein ?Meinst du, wie du den INSERT-String erstellst?
Bsp:AutoIt
Alles anzeigen; Bsp: csv mit 5 Spalten #cs FELD1,FELD2,FELD3,FELD4,FELD5 A,B,C,D,E X,Y,,,Z #ce Local $sTable = 'Tabellenname' Local $aCSV, $aSplit, $sSQL = '' _FileReadToArray($sPathCSV, $aCSV, 0, ',') For $i = 1 To UBound($aCSV) -1 ; erste Zeile enthält Feldnamen, ignorieren $aSplit = StringSplit($aCSV[$i], ',') If $aSplit[0] <> 5 Then ContinueLoop ; Zeile in csv nicht korrekt ; INSERT INTO target [(field1[, field2[, …]])] VALUES (value1[, value2[, …]) $sSQL &= StringFormat("INSERT INTO %s (FELD1,FELD2,FELD3,FELD4,FELD5) VALUES (%s,%s,%s,%s,%s);", $aSplit[1], $aSplit[2], $aSplit[3], $aSplit[4], $aSplit[5]) Next -
Wenn du zum alten Wert einen neuen hinzuaddieren möchtest, mußt du logischerweise den alten Inhalt zuerst Lesen!
Also: Lesen, Hinzuaddieren, wieder Schreiben. -
Man kann zwar in SciTE verschieden Eigenschaften für die TAB einstellen - aber das m.M. nach Wichtigste fehlt: Einfügen von Leerzeichen anstelle der TAB. Dadurch sieht eine in SciTE erstellte Datei in jedem Editor oder Forum anders aus. Das Problem bilden die partiellen TAB, also z.B.: Tabweite ist 4, Cursorposition ist 6. Wenn jetzt ein Tab eingefügt wird steht der Cursor an 8. Aber die Tabweite ist anderen Editoren ja nicht bekannt, sodass hier unterschiedlich ausgefüllt wird. Aus diesem Grund bevorzuge ich die ausschliessliche Verwendung von Leerzeichen.
Dieses AddOn verbindet nun den Komfort von Tabs (schnell große, fest definierte Abstände einfügen) mit der exakten Darstellung in jedem Editor.
Werden beim Setzen eines Tab Leerzeichen in der Tabweite eingefügt, so arbeitet das Tool auch analog in der entgegengesetzten Richtung mit Backspace. Sind links vom Cursor ausreichend Leerzeichen, wird jeweils bis zur vorigen Tabposition gelöscht.Erstellt in den SciTEUser.properties den Eintrag convert.tabs.to.spaces=1
Zum Aktivieren die Datei ReplTabWithSpaces.lua zu euren Lua-Dateien kopieren und im LuaStartup-Skript laden:
Und zwar unbedingt hinter dem Eintrag:
-- Start up the events (Calls OnStartup()).
EventClass:BeginEvents()LoadLuaFile("ReplTabWithSpaces.lua", "Pfad\\zum\\Ordner\\") - wenn ihr einen eigenen Lua-Ordner habt. Wichtig: Doppelbackslash, auch am Ende!
-
-
Man verwendet die Makros ja nur dort als Platzhalter für Werte, die man auch mit dem Skript generiert. Insofern ist eine Fehlerbehandlung sinnfrei.
Im GuiGetMsg-Modus wirst du niemals @Gui_CtrlID verwenden, weil das nicht befüllt wird. Das weißt du bereits beim Programmieren, also ist doch alles in Butter.Edit:
Wenn du aber unbedingt Makros ohne zu erwartenden Wert ohne Abbruch ausführen willst, nimm Execute. Da bekommst du im Fehlerfall einfach einen Leerstring.
$sReturn = Execute("@Gui_CtrlID") -
Schau mal hier: MacroBox
Da hatte ich allerdings all jene Makros aussen vor gelassen, die nur in einem bestimmten Kontext einen Wert liefern. (@Gui_CtrlID etc.)
Könnte man aber im Skript ergänzen, dass als Ausgabe erscheint: "Wert nur im Kontext ermittelbar" oder ähnlich. -
Schon mal PsKill ausprobiert.
-
nur der der Insert Syntax ist mir nicht klar
Da hilft Google (und MSDN): https://msdn.microsoft.com/en-us/library/…office.12).aspx
-
Ich weiß nicht, ob es bereits Access-UDF ähnlich der Excel-UDF gibt. Aber grundsätzlich brauchst du doch aus den Daten der csv nur den INSERT-String zusammenstellen.
- csv in ein Array lesen
- für jeden Arrayeintrag:
-- Zeile an Trennzeichen splitten
-- das Splitarray enthält jetzt die Werte für jedes zugeordnete Feld
-- nun in einer Schleife zusammenfügen: $sInsert &= INSERT ....'Feld' = 'Wert'
Syntax sollte klar sein, hier nur grobe Vorgehensweise. -
Ich habe jetzt ein weiteres AddOn erstellt, das direkt auf die Verwendung des Semikolon reagiert und in die definierte Spalte springt: CommentAutoPos
-
Mal wieder ein kleines Plugin für SciTE.
"CommentAutopos" wird aktiv, wenn ein Semikolon hinter eine Codezeile gesetzt wird (und nur dann). Über eine Property, die ihr in euren Usersettings vorgeben könnt, wird die Zielspalte zum Schreiben des Kommentars definiert (Comment.Autopos.*.au3=100). Wenn ihr die Property nicht setzt, wird automatisch '100' verwendet.
Das Plugin prüft beim Arbeiten in AU3-Dateien, wie folgt:
- aktuelle Spalte=Zeilenanfang oder >= Zielspalte ? dann nichts tun
- Style an Cursorposition <> 0 (also innerhalb eines definierten Styles) ? dann nichts tun
- links vom Cursor nur Leerzeichen/Tabs (also Einrückung) ? dann nichts tun
- rechts vom Cursor irgendwelche Zeichen ausser Leerzeichen/Tabs/Zeilenumbruch (also nicht hinter dem Code) ? dann nichts tun
Anderenfalls steht der Cursor also am Codeende in einer nicht leeren Zeile noch vor der Startposition für Kommentare.
Jetzt wird die Differenz zur Kommentarposition ermittelt und aufgefüllt mit Leerzeichen, das Semikolon +1 Leerzeichen wird geschrieben und der Cursor dahinter gesetzt.Zum Aktivieren die Datei CommentAutoPos.lua zu euren Lua-Dateien kopieren und im LuaStartup-Skript laden:
Und zwar unbedingt hinter dem Eintrag:
-- Start up the events (Calls OnStartup()).
EventClass:BeginEvents()LoadLuaFile("CommentAutoPos.lua", "Pfad\\zum\\Ordner\\") - wenn ihr einen eigenen Lua-Ordner habt. Wichtig: Doppelbackslash, auch am Ende!
-
Dafür hatte ich mal ein AddOn geschrieben: https://autoit.de/index.php/Thre…6669#post246669
-
Ich vermute du hast eine css-Datei oder einen <style>..</style>-Block im Dokument um alle Styles zu verwalten.
Wenn nur einzelne Definitionen verwaltet werden sollen, kannst du doch mehrere Klassen bilden. Ist zwar mehr Definition, läßt sich aber auch einfacher bearbeiten.
Bsp.: Überschrift soll in Font und Farbe änderbar sein, aber einzeln.
Im Element z.B.:
<div class="ufont ucolor">...</div>
In der Style-Definition:
.ufont { font-family: Courier New; }
.ucolor { color: #000000; }Dann kannst du einfach die kpl. class-Definition ersetzen mit neuem Wert und brauchst keine einzelnen Elemente einer Definition aufbröseln.
-
Danke @UEZ, das löst das Problem.
-
Hi,
ich habe das Problem mal aus einem Projekt herausgelöst mit reproduzierbarem Effekt.
Im folgenden Skript aktualisiere ich alle 100 ms die Zeitanzeige im Fenster. Dabei tritt gelegentlich ein Flackern auf. Gibt es hier noch eine Möglichkeit das abzustellen?
(Es geht ausschließlich um das Problem des Flackerns. Hinweise auf Nutzung anderer Ctrl etc. sind nicht zielführend.)AutoIt
Alles anzeigen#include <WinAPI.au3> #include <WinAPIGdi.au3> #include <Timers.au3> #include <WindowsConstants.au3> #include <FontConstants.au3> #include <StaticConstants.au3> Global Const $__TIMER_INTERVALL = 100 Global $iWidth = 400, $iHeight = 300 Global $aVertex[2][3] = [[0, 0, 0xA7BED7], [$iWidth, $iHeight, 0xF7F7F7]] $hGui = GUICreate('Test', $iWidth, $iHeight) $idPic = GUICtrlCreatePic('', 0, 0, $iWidth, $iHeight) $hPic = GUICtrlGetHandle($idPic) _ManageText('set', 'Nachricht', 'Das ist irgendein beliebiger Text' & @LF & 'die zweite Zeile des Textes') $iTimerID = _Timer_SetTimer($hGui, $__TIMER_INTERVALL, '_TimerCallback') GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg() Case -3 _Timer_KillTimer($hGui, $iTimerID) Exit EndSwitch WEnd Func _Time() Return StringFormat('%02i:%02i:%02i.%s', @HOUR, @MIN, @SEC, StringLeft(@MSEC,1)) EndFunc Func _ManageText($sAction='get', $sTextA='', $sTextB='') Local Static $aText[2] = ['',''] If $sAction = 'get' Then Return $aText If $sTextA <> '' Then $aText[0] = $sTextA If $sTextB <> '' Then $aText[1] = $sTextB EndFunc Func _TimerCallback($hWnd, $iMsg, $iIDTimer, $iTime) #forceref $hWnd, $iMsg, $iIDTimer, $iTime Local Static $aText[2] = ['',''] Local $aNewText = _ManageText('get') For $i = 0 To 1 If $aText[$i] <> $aNewText[$i] Then $aText[$i] = $aNewText[$i] EndIf Next Local $sTime = _Time() ; Gradient Local $hDC = _WinAPI_GetDC($hPic) Local $hDestDC = _WinAPI_CreateCompatibleDC($hDC) Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight) Local $hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap) _WinAPI_GradientFill($hDestDC, $aVertex) ; Font Local $hFont = _WinAPI_CreateFont(16, 0, 0, 0, 600, False, False, False, $DEFAULT_CHARSET, _ $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Microsoft Sans Serif') Local $hOldFont = _WinAPI_SelectObject($hDestDC, $hFont) ; Text 1 _WinAPI_SetTextColor($hDestDC, 0x800000) _WinAPI_SetBkMode($hDestDC, $TRANSPARENT) Local $tRECT = DllStructCreate($tagRect) DllStructSetData($tRECT, "Left", 15) DllStructSetData($tRECT, "Top", 5) DllStructSetData($tRECT, "Right", 100) DllStructSetData($tRECT, "Bottom", 30) _WinAPI_DrawText($hDestDC, $aText[0], $tRECT, BitOR($DT_VCENTER,$DT_LEFT,$DT_SINGLELINE)) ; Time $tRECT = DllStructCreate($tagRect) DllStructSetData($tRECT, "Left", $iWidth-90) DllStructSetData($tRECT, "Top", 5) DllStructSetData($tRECT, "Right", $iWidth-15) DllStructSetData($tRECT, "Bottom", 30) _WinAPI_DrawText($hDestDC, $sTime, $tRECT, BitOR($DT_VCENTER,$DT_RIGHT,$DT_SINGLELINE)) ; Trennline Local $hPen = _WinAPI_CreatePen($PS_SOLID, 1, 0x800000) Local $oOld = _WinAPI_SelectObject($hDestDC, $hPen) _WinAPI_DrawLine($hDestDC, 3, 30, $iWidth-6, 30) ; Text 2 $hFont = _WinAPI_CreateFont(16, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _ $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Microsoft Sans Serif') _WinAPI_SelectObject($hDestDC, $hFont) _WinAPI_SetTextColor($hDestDC, 0x400000) $tRECT = DllStructCreate($tagRect) DllStructSetData($tRECT, "Left", 0) DllStructSetData($tRECT, "Top", 40) DllStructSetData($tRECT, "Right", $iWidth) DllStructSetData($tRECT, "Bottom", 280) _WinAPI_DrawText($hDestDC, $aText[1], $tRECT, $DT_CENTER) ; Gradient to control _SendMessage($hPic, $STM_SETIMAGE, 0, $hBitmap) Local $hObj = _SendMessage($hPic, $STM_GETIMAGE) If $hObj <> $hBitmap Then _WinAPI_DeleteObject($hBitmap) _WinAPI_SelectObject($hDestDC, $hOldFont) _WinAPI_SelectObject($hDestDC, $oOld) _WinAPI_DeleteObject($hFont) _WinAPI_DeleteObject($hPen) _WinAPI_SelectObject($hDestDC, $hDestSv) _WinAPI_ReleaseDC($hPic, $hDC) _WinAPI_DeleteDC($hDestDC) ; Neuzeichnen GUISetState(@SW_UNLOCK) _WinAPI_RedrawWindow($hWnd, 0, 0, $RDW_UPDATENOW) GUISetState(@SW_LOCK) EndFunc -
Öffne den VBA-Editor (bei geöffnetem Office: Alt+F11), wähle das Makro und lass dir das VBA-Skript dazu zeigen. Das kann man dann portieren.
Dazu musst du mit dem Excel-Objekt arbeiten. Entweder unter Nutzung der Excel-UDF oder mit den nativen AutoIt-Funktionen.
z.B. bei geöffnetem Excel: $oExcel = ObjGet("", "Excel.Application")
Wenn in deinem Makro dann "Application" erscheint, setzt du in AutoIt: "$oExcel.Application". Methoden und Properties kannst du ganz normal anwenden. Bei Methoden beachten, dass in AutoIt immer alle Funktionsparameter für die VBA-Funktionen benannt werden müssen und in der korrekten Reihenfolge, nicht benötigte Parameter mit "Default" besetzen. Ggf. danach googeln. -
Du kannst das, was das Makro macht (VBA-Code), in den meisten Fällen unkompliziert nach AutoIt portieren, brauchst das Makro selbst also nicht.
Falls es aber sowieso existiert, da es teilweise per Hand aufgerufen wird, kannst du das Makro auch durch AutoIt direkt aufrufen. Sollte in etwa so aussehen: $oExcel.Application.Run("'C:\Mappe1.xls'!MeinMakro")