darf erst nach dem wechseln der Ansicht
Oops, na klar. Das hatte ich glatt vergessen zu verschieben, weil ich in erster Version nur zwischen mit/ohne Menüleiste geswitcht hatte. Ich ändere mal im Startpost.
darf erst nach dem wechseln der Ansicht
Oops, na klar. Das hatte ich glatt vergessen zu verschieben, weil ich in erster Version nur zwischen mit/ohne Menüleiste geswitcht hatte. Ich ändere mal im Startpost.
OK, ich nutze Windows 7. Möglicherweise kann Win10 nicht mit WinMenuSelectItem umgehen. Kannst du ja mal mit anderen Standard-Windowsanwendungen testen (Notepad etc.).
Ich habe Tools, die ich im Laufe der Zeit für meine Kollegen geschrieben habe, nun mal in einer GUI eingebunden. Da auch der Windows Taschenrechner Verwendung findet, habe ich diesen ebenfalls in die Oberfläche integriert - braucht er nicht mehr extra geöffnet werden.
Falls ihr das brauchen könnt:
EDIT: Fehler beim Abfragen der Clientgröße behoben - Danke Oscar.
;==============================================================================================
$iStartModus = 3 ; 1 - Standard, 2 - Wissenschaftlich, 3 - Programmierer, 4 - Statistik
$bVersteckeMenu = True ; True(Default), False
;==============================================================================================
$hGUIEmbedded = GUICreate('Embedded Calculator', 600, 400, -1, -1, BitOr($GUI_SS_DEFAULT_GUI,$WS_CLIPCHILDREN))
$aCalc = _StartCalcHideMnu($iStartModus, $bVersteckeMenu)
_EmbedCalc($hGUIEmbedded, $aCalc)
GUiSetState(@SW_SHOW, $hGUIEmbedded)
WinSetState($aCalc[1], '', @SW_SHOW)
WinActivate($aCalc[1])
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
ProcessClose($aCalc[0])
Exit
EndSwitch
WEnd
Func _EmbedCalc($hWndGui, $aCalc)
_WinAPI_SetParent($aCalc[1], $hWndGui)
_WinAPI_SetWindowLong($aCalc[1], $GWL_STYLE, $WS_CLIPSIBLINGS)
_WinAPI_SetWindowLong($aCalc[1], $GWL_HWNDPARENT, $hWndGui)
_WinAPI_SetWindowPos($aCalc[1], 0, 0, 0, $aCalc[2], $aCalc[3], $SWP_SHOWWINDOW)
EndFunc
; requires: #include <GuiMenu.au3>
Func _StartCalcHideMnu($iMode=1, $bHide=True)
; $iMode: 1 - Standard, 2 - Wissenschaftlich, 3 - Programmierer, 4 - Statistik
Local $aMode[5] = ['','&Standard','&Wissenschaftlich','&Programmierer','St&atistik']
Local $PID = Run(@SystemDir & '\calc.exe')
Local $hCalc = WinWaitActive('[CLASS:CalcFrame]', '', 10)
If Not IsHWnd($hCalc) Then Return SetError(1,0,0)
; gewählten Mode aktivieren
$iMode = $iMode < 1 ? 1 : ($iMode > 4 ? 4 : $iMode)
WinMenuSelectItem($hCalc, '', '&Ansicht', $aMode[$iMode])
Local $aSize = WinGetClientSize($hCalc)
Local $hMnu, $aItem0, $iHMnu
; Menü Höhe ermitteln
$hMnu = _GUICtrlMenu_GetMenu($hCalc)
$aItem0 = _GUICtrlMenu_GetItemRect($hCalc, $hMnu, 0)
$iHMnu = $aItem0[3] - $aItem0[1]
; Menü - Item entfernen
If $bHide Then
For $i = _GUICtrlMenu_GetItemCount($hMnu) -1 To 0 Step -1
_GUICtrlMenu_RemoveMenu($hMnu, $i)
Next
$iHMnu = 0
EndIf
Local $aRet[4] = [$PID,$hCalc,$aSize[0],$aSize[1]+$iHMnu]
Return $aRet
EndFunc
Alles anzeigen
PS: Ich würde ja gerne die calc.exe versteckt starten - aber leider wird @SW_HIDE beim Aufruf ignoriert (deshalb jetzt auch nicht im Code). Falls ihr da eine Lösung kennt, lasst hören.
aber doch bei weitem nicht so elegant wie gewünscht. Oder ???
Kommt drauf an, an welchen Kriterien du dein Skript bemisst. Soll es in Schönheit sterben oder solide funktionieren? ![]()
Ich setze die Prämisse auf Funktionalität. Scripting sugar kann - muß aber nicht sein. ![]()
Es ist nicht möglich mehrere Dateien an eine Datei zu schicken so wie es in dem Thread steht.
Meiner Meinung nach hat der von dir benannte Thread nichts mit dem Problem des TE zu tun.
Selbstverständlich lassen sich per Kontextmenü z.B. 3 markierte Dateien gemeinsam an eine Zielanwendung senden. Diese arbeitet die Dateien dann, wie vom TE gewünscht, nacheinander ab.
Aufruf wäre dann so: "c:\tools\meine.exe 'c:\data\docs\doc1.txt' 'c:\data\docs\doc2.txt' 'c:\data\docs\doc3.txt'"
"meine.exe" als Zielanwendung in der Registry eintragen - fertig.
Edit:
Die Erkennung der selektierten Dateien, muß natürlich selbst geskriptet werden, standardmäßig würde, wie schon richtig gesagt, für jede Datei eine Instanz der Anwendung aufgerufen werden.
Vor etlichen Jahren hatte ich mal etwas Ähnliches geschrieben: Kontextmenüeintrag (Dateiexplorer) - Infos markierte Dateien in Zwischenablage kopieren
Oder mit StringRegExpReplace
$url = 'domainurl.test.com'
$sFirst = StringRegExpReplace($url, '([^.]+).+', '$1')
ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & " var: $sFirst --> " & $sFirst & @LF)
$sLast = StringRegExpReplace($url, '.+\.([^.]+)$', '$1')
ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & " var: $sLast --> " & $sLast & @LF)
Bei der Methode musst du aber auf das Working-Directory aufpassen, weil die out.txt Datei dort hingeschrieben wird.
Das kannst du mit der Angabe eines fixen Pfades umgehen. Also z.B. ... >> c:\tempout\out.txt
[OT]
Wo hackt es?
Die Hacke ist ein Gartenwerkzeug, mit ihr wird gehackt!
Wenn etwas hängt, dann hakt es!
[/OT]
Dann müsste auf allen Rechnern der Benutzer auch Autoit installiert sein - sonst weiß deren rechner nicht was eine .au3 Datei ist.
Werft mal einen Blick in die Hilfe. AutoIt -Dateien /-Codezeilen lassen sich unabhängig von einem installierten AutoIt ausführen. Es braucht dazu nur eine beliebige AutoItdatei, die zur *.exe kompiliert wurde. Diese lässt sich dann verwenden um *.au3 zu interpretieren. In diesem Falle müssten aber alle zu includierenden Dateien mitgeliefert werden
Run a script using another compiled script:
Compiled.exe [/ErrorStdOut] /AutoIt3ExecuteScript file [params ...]
Execute another AutoIt script file from a compiled AutoIt3 executable.
Compiled.exe [/ErrorStdOut] /AutoIt3ExecuteLine "command line"
Execute one line of code as with AutoIt3.exe above.
This means that there is no need to have a copy of AutoIt3.exe in addition to the compiled file - the interpreter stub of the compiled file will replace it. So as long as there is at least one compiled script available, other AutoIt scripts can be run without the need to have AutoIt3.exe on the machine., either pre-installed or added via FileInstall.
Alles anzeigen
Im oben aufgeführten String sind die benötigten Zahlen jeweils durch ein Komma getrennt.
Wohl eher durch ein Semikolon? Oder möchtest du aus den Semikolon-getrennten Zahlen nur von den Zahlen mit Nachkommaanteil den Ganzzahlwert?
Du sag mal, machst du das Lua-Script (OHK) mit den SciTE-Variablen noch irgendwann fertig? (eg. "props['SciteDirectoryHome']")
Oh Shit - da war doch was. Bitte erinnere mich regelmäßig alle 6 Monate daran. ![]()
Hi,
vielleicht kennt ihr das - ihr habt Daten, die aus einer Textdatei/Datenbank in eine Exceltabelle übertragen werden sollen. Wenn in den Daten z.B. Postleitzahlen oder Telefonnummern enthalten sind, muß ich vor dem Übertragen der Daten die Tabelle formatieren, da sonst die Vornullen weg sind. Früher hatte ich das mit einem Skript für jeden Anwendungsbereich extra gelöst. Jetzt löse ich das, wie folgt:
#include <Excel.au3>
; Bsp: CSV-Datei
#cs
KDNR;NAME;VNAME;STRASSE_NR;PLZ;ORT;TEL;EMAIL;REGISTERDATUM
10123;Mustermann;Max;Mustergasse 123;08150;Musterhausen;089123456789;max.mustermann@mustermann.de;18.01.2017
#ce
; erste Datenzeile einlesen (simuliert: _FileReadToArray($sPathFile, $aFile))
Local $aFile[] = [3, _
"KDNR;NAME;VNAME;STRASSE_NR;PLZ;ORT;TEL;EMAIL;REGISTERDATUM", _
"10123;Mustermann;Max;Mustergasse 123;08150;Musterhausen;089123456789;max.mustermann@mustermann.de;18.01.2017", _
"10124;Musterfrau;Maria;Mustergässle 456;56789;Musterdorf;099987654321;maria.musterfrau@musterfrau.de;21.02.2017"]
; erste Datenzeile splitten
Local $aLine = StringSplit($aFile[2], ';')
; Exceltabelle erstellen und vor Befüllen mit Daten die Spalten formatieren
Local $oExcel = _Excel_Open()
Local $oWorkbook = _Excel_BookNew($oExcel, 1)
Local $oSheet = $oWorkbook.Worksheets(1)
For $i = 1 To $aLine[0]
$oSheet.Columns($i).NumberFormat = _GetExcelFormatByData($aLine[$i])
Next
; Exceltabelle füllen
For $i = 1 To $aFile[0]
$aLine = StringSplit($aFile[$i], ';', 2)
For $j = 0 To UBound($aLine) -1
$oSheet.Range("A1").Offset($i-1, $j).Value = $aLine[$j]
ConsoleWrite('$i-1, $j: ' & $i-1 & ', ' & $j & @CRLF)
Next
Next
; #FUNCTION# ====================================================================================================================
; Name ..........: _GetExcelFormatByData
; Description ...: Gets the (german) Excel format string for a given data
; Syntax ........: _GetExcelFormatByData($sData)
; Parameters ....: $sData - Value for the detection of the format
; Return values .: The Excel format string
; Author ........: BugFix
; ===============================================================================================================================
Func _GetExcelFormatByData($sData)
$sData = String($sData)
Local $sPattDateHMS = '^\d{1,2}\.\d{1,2}\.\d{4} \d{1,2}:\d{1,2}:\d{1,2}$'
Local $sPattDateHM = '^\d{1,2}\.\d{1,2}\.\d{4} \d{1,2}:\d{1,2}$'
Local $sPattDate = '^\d{1,2}\.\d{1,2}\.\d{4}$'
Local $sPattFloat = '^\d+,\d+$'
Local $sPattZero = '^0$' ; alleinstehende Null als Integer nicht als String, wie führende Null in PLZ od. TelefonNr
Local $sPattInteger = '^[1-9]\d*$'
Select
Case StringRegExp($sData, $sPattDateHMS)
Return 'TT.MM.JJJJ hh:mm:ss'
Case StringRegExp($sData, $sPattDateHM)
Return 'TT.MM.JJJJ hh:mm'
Case StringRegExp($sData, $sPattDate)
Return 'TT.MM.JJJJ'
Case StringRegExp($sData, $sPattFloat)
Return '#0,#'
Case StringRegExp($sData, $sPattZero) Or StringRegExp($sData, $sPattInteger)
Return '#'
Case Else
Return '@'
EndSelect
EndFunc ;==>_GetExcelFormatByData
Alles anzeigen
Habe es schon verschoben.
Bist Du sicher, dass man damit gezielt einzelne Dateien final löschen kann ? Soweit ich das verstanden habe, überschreibt Cipher nur den freien Speicherplatz. Dateien müssen vorher 'normal' gelöscht werden.
Da hast du Recht, ich hatte das auch anders in Erinnerung. Daten müssen zuerst gelöscht werden.
Mit diesem Weg klappt es auch nicht.
$c = RunWait(StringFormat('"%s" x "%s" "%s"',@ComSpec,@Systemdir, $7a, $x, $all, $de), '', @SW_SHOW)
Wie auch. Du verwendest nur 3 Formatvariablen (%s) und hast im Befehl 6 Variablen!
Und was bitte soll das @ComSpec im Aufruf? Das ist doch total überflüssig, da du den Pfad zur Ausführungsdatei angibst und keinen Befehl aus der CMD.exe.
Der Verweis auf Case war gut.
Habe mir jetzt eine zweistufige dreistufige Lösung erstellt (also von 2 3 möglichen Leerzeichen wird beim letzten getrennt. Damit sollten 99% der Fälle abgedeckt sein (solange wir nicht als Kundin Pippilotta Viktualia Rollgardina Pfefferminz Efraimstochter Langstrumpf bekommen
).
select
case
when pos(" ",name1) > 0
and pos(" ", substrex(name1, pos(" ",name1)+1, 40)) > 0
and pos(" ", substrex(name1, pos(" ",name1)+pos(" ", substrex(name1, pos(" ",name1)+1, 40))+1, 40)) > 0 then
substrex(name1, pos(" ",name1)+pos(" ", substrex(name1, pos(" ",name1)+1, 40))+pos(" ", substrex(name1, pos(" ",name1)+pos(" ", substrex(name1, pos(" ",name1)+1, 40))+1, 40))+1, 40)
when pos(" ",name1) > 0 and pos(" ", substrex(name1, pos(" ",name1)+1, 40)) > 0 then
substrex(name1, pos(" ",name1)+pos(" ", substrex(name1, pos(" ",name1)+1, 40))+1, 40)
when pos(" ",name1) > 0 then
substrex(name1, pos(" ",name1)+1, 40)
else name1
end NAME,
case
when pos(" ",name1) > 0
and pos(" ", substrex(name1, pos(" ",name1)+1, 40)) > 0
and pos(" ", substrex(name1, pos(" ",name1)+pos(" ", substrex(name1, pos(" ",name1)+1, 40))+1, 40)) > 0 then
substrex(name1, 1, pos(" ",name1)+pos(" ", substrex(name1, pos(" ",name1)+1, 40))+pos(" ", substrex(name1, pos(" ",name1)+pos(" ", substrex(name1, pos(" ",name1)+1, 40))+1, 40)))
when pos(" ",name1) > 0 and pos(" ", substrex(name1, pos(" ",name1)+1, 40)) > 0 then
substrex(name1, 1, pos(" ",name1)+pos(" ", substrex(name1, pos(" ",name1)+1, 40)))
when pos(" ",name1) > 0 then
substrex(name1, 1, pos(" ",name1)-1)
else ''
end VORNAME
from
kunden
where
kundennr = ::KDNR
;
Alles anzeigen
Unser Firmennetz ist ausschliesslich Intranet, insofern können wir da ganz entspannt sein. Es gibt zwei Einzel-PC mit Internetanschluß für Mailverkehr.
Wir machen in der Firma heute dasselbe, wie im Jahr 2000. Insofern wäre es unsinnig Geld für Software auszugeben, wenn die vorhandene allen Anforderungen gerecht wird. Office 2000 wird hier also bestimmt noch 15 Jahre laufen. ![]()
Das ändert nichts.
Ich bleibe dann lieber bei den nativen Objektfunktionen, aber vielleicht läßt sich das ja in die Funktion _Excel_BookSaveAs auch integrieren:
$oExcel.ActiveWorkBook.SaveAs(@ScriptDir & '\test.xls') -- funktioniert fehlerfrei