Kannst du hier lesen: http://software.magnus.de/programmierung…ll-o-matic.html
Beiträge von BugFix
-
-
soweit ich weiß ist der quellcode bereits freigegeben.
wie auch immer es ist auch erlaubt mods für jedi knight academy zu schreiben. gegen das auslesen bestehen auch keinerlei sicherheitsmaßnahmen
Könntest du das mit irgendwelchen Links belegen? Urheberrechtsschutz ist ein heißes Eisen und deshalb legen wir da uch großen Wert drauf, dass hier keiner einen falschen Weg einschlägt.
Aus diesem Grund sind wir bei solchen Anfragen mit Support sehr zurückhaltend. -
Hier mal aus dem Hut, so in etwa sollte es gehen:
[autoit]$oExcel = ...... ; Excel-Objekt erstellen (Neu/Öffnen)
[/autoit]
$oExcel.ActiveSheet.Range("A1").Select
$oExcel.ActiveSheet.Pictures.Insert("C:\Pfad\Pfad\Datei.jpg").SelectEdit:
Achja, die Größe der Grafik läßt sich mit Selection.ShapeRange.... anpassen. Einfach mal nach googeln. -
Sorry, aber wenn du ohne Punkt und Komma schreibst und auch der Großschreibung von Hauptwörtern absagst, ist dein Text so gut wie nicht zu verstehen.
Wir können zwar vieles interpretieren, aber machs uns (und dir) leichter und bring es in lesbare Form.
-
Hiermit sollte es erheblich schneller gehen (und nur eine Zeile Code :P)
[autoit]$s = '1234567890123456789012345678901234567890'
[/autoit][autoit][/autoit][autoit]
ConsoleWrite(StringRegExpReplace($s, '.{1,6}', ' $0') & @CRLF); EDIT - in der ersten Variante ist noch ein Leerzeichen VOR dem String, besser so:
[/autoit]
ConsoleWrite(StringTrimLeft(StringRegExpReplace($s, '.{1,6}', ' $0'), 1) & @CRLF) -
Besser (bzw. gründlicher, Down und Up werden separat behandelt) als _IsPressed ist es, den Middle-Mausklick abzufangen und dem System einen Right-Klick zu senden.
Das läßt sich mittels Hook realisieren.
- Empfange Middle-Down, verwerfe diese Message und sende Right-Down an das System
- Empfange Middle-Up, verwerfe diese Message und sende Right-Up an das SystemSo sieht das dann aus:
Spoiler anzeigen
[autoit]#include <Constants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WinAPI.au3>
#include <WindowsConstants.au3>
Global Const $HC_ACTION = 0
Global $hStub_MouseProc = DllCallbackRegister("_MouseProc", "long", "int;wparam;lparam")
Global $hmod = _WinAPI_GetModuleHandle(0)
Global $hHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hStub_MouseProc), $hmod)HotKeySet('^+!e', '_ende') ; STRG+SHIFT+ALT+e zum Beenden
[/autoit] [autoit][/autoit] [autoit]
OnAutoItExitRegister('ExitFunc')While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(100)
WEndFunc _ende()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFuncFunc _MouseProc($nCode, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
If $nCode < 0 Then
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndIf
If $nCode = $HC_ACTION Then
Switch $wParam
Case $WM_MBUTTONDOWN
Return _mouse_event($MOUSEEVENTF_RIGHTDOWN) ; sendet -1 zurück, Original-Mausklick wird ignoriert
Case $WM_MBUTTONUP
Return _mouse_event($MOUSEEVENTF_RIGHTUP) ; sendet -1 zurück, Original-Mausklick wird ignoriert
EndSwitch
EndIf
Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFuncFunc ExitFunc()
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_UnhookWindowsHookEx($hHook)
DllCallbackFree($hStub_MouseProc)
EndFunc ;==>OnAutoItExitFunc _mouse_event($dwFlags)
[/autoit]
DllCall("user32", 'long', 'mouse_event', 'long', $dwFlags, 'long', 0, 'long', 0, 'long', 0, 'long', 0)
Return -1
EndFunc -
1. Könnt ihr mir ein Port empfelen den ich für TCP benutzen kann? Also ein Prot der auf den meisten routern freigegeben ist?
Du kannst niemals davon ausgehen, dass irgendein Port zwingend frei ist (80 mal außen vor). Definiere einen Port für deine Anwendung und teile der Gegenstelle mit, dass dieser Port eine Weiterleitung im Router braucht.
- Lege einen Bereich von Ports fest, der genutzt werden kann (meide well-kown-ports von Anwendungen, einige findest du in ..system32\drivers\etc\services)
- starte deine Anwendung mit einem Handshake, das heißt: der Client klappert die Portliste ab, bis er vom Server ein Receive mit z.B. Programmnamen und Protokollversion erhält (kannst du gleich für das Log nutzen).
So bist du flexibel bei den Ports, falls der Server (warum auch immer) mal auf einen anderen Port ausweichen muß.
2. Kann man per TCP auch Arrays übertragen oder muss ich sie voher in einem String zusammenfassen?Du mußt Byte für Byte übertragen, in einer vorher definierten Blockgröße.
3. Ich möchte ein Programm schreiben was mir die Dateinen eines entfernten PCs anzeigt. Muss ich die Anzeige der Dateien Selber schreiben mit ListView oder sowas oder gibt es da schonw as fertiges womit irgendwie was? Also ich wollte dasnn auf dem PC von dem ich die Dateien sehen möche die Dateien mit _FileListToArray (weiß nicht genau ob es richtig geschrieben hab, habe an diesem Pc kein autoit :-() einlesen und dann per TCP übertragen und anschließen auf dem 2 PC anzeigen.
Dafür würde ich eher fertige Software nutzen (TeamViewer). Wenn du ein Inhaltsverzeichnis übermittelst kannst du das natürlich in einem Listview darstellen.
-
Grundsätzlich schon so, wie Karill geschrieben hat.
[autoit]
Nur fällt mir auf, dass gerade die beiden Parameter, die du vom User festlegen läßt, im Parameterstring in Klammern gefaßt sind. Die anderen Parameter sind ohne Klammern.
Ich kann mir nicht vorstellen, dass das gewollt ist. Meiner Meinung nach müssen die Klammern weg.RunWait("load.exe --comport="&$comport&" --comspeed=9600 --drive="&$drive&" --command=C:X:30:2:E")
[/autoit] -
Bei nur zwei Eingabefeldern kannst du natürlich problemlos hin- und herrechnen, da ist die Richtung klar. Bei 3 Feldern brauchst du eine Zielmarkierung.
Ich hab mal ein Bsp. für Widerstandsberechnung eingefügt. Dadran kannst du dich orientieren.
Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <EditConstants.au3>
$gui = GUICreate('R = U / I')
GUICtrlCreateLabel('Berechne', 80, 3, 60, 17)
GUICtrlCreateLabel('R', 10, 23, 20, 17)
$inR = GUICtrlCreateInput('', 40, 20, 40, 20)
$rR = GUICtrlCreateRadio('', 90, 20, 20, 20)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlCreateLabel('U', 10, 53, 20, 17)
$inU = GUICtrlCreateInput('', 40, 50, 40, 20)
$rU = GUICtrlCreateRadio('', 90, 50, 20, 20)
GUICtrlCreateLabel('I', 10, 83, 20, 17)
$inI = GUICtrlCreateInput('', 40, 80, 40, 20)
$rI = GUICtrlCreateRadio('', 90, 80, 20, 20)
GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")While 1
[/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
EndSwitch
WEndFunc _getTarget()
[/autoit] [autoit][/autoit] [autoit]
If BitAND(GUICtrlRead($rR), $GUI_CHECKED) Then
Return 'R'
ElseIf BitAND(GUICtrlRead($rU), $GUI_CHECKED) Then
Return 'U'
Else
Return 'I'
EndIf
EndFuncFunc _getVal()
[/autoit] [autoit][/autoit] [autoit]
Local $aOut[3] = [GUICtrlRead($inR),GUICtrlRead($inU),GUICtrlRead($inI)]
Return $aOut
EndFuncFunc WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit]
Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit, $aRead
$hWndFrom = $ilParam
$iIDFrom = BitAND($iwParam, 0xFFFF)
$iCode = BitShift($iwParam, 16)
Switch $iCode
Case $EN_CHANGE
Switch $hWndFrom
Case GUICtrlGetHandle($inR)
$aRead = _getVal()
Switch _getTarget()
Case 'R'
Return $GUI_RUNDEFMSG
Case 'U'
If $aRead[0] = '' Or $aRead[2] = '' Then Return $GUI_RUNDEFMSG
GUICtrlSetData($inU, $aRead[0]*$aRead[2]) ; U = R*I
Case 'I'
If $aRead[0] = '' Or $aRead[1] = '' Then Return $GUI_RUNDEFMSG
GUICtrlSetData($inI, $aRead[1]/$aRead[0]) ; I = U/R
EndSwitch
Case GUICtrlGetHandle($inU)
$aRead = _getVal()
Switch _getTarget()
Case 'R'
If $aRead[1] = '' Or $aRead[2] = '' Then Return $GUI_RUNDEFMSG
GUICtrlSetData($inR, $aRead[1]/$aRead[2]) ; R = U/I
Case 'U'
Return $GUI_RUNDEFMSG
Case 'I'
If $aRead[0] = '' Or $aRead[1] = '' Then Return $GUI_RUNDEFMSG
GUICtrlSetData($inI, $aRead[1]/$aRead[0]) ; I = U/R
EndSwitch
Case GUICtrlGetHandle($inI)
$aRead = _getVal()
Switch _getTarget()
Case 'R'
If $aRead[1] = '' Or $aRead[2] = '' Then Return $GUI_RUNDEFMSG
GUICtrlSetData($inR, $aRead[1]/$aRead[2]) ; R = U/I
Case 'U'
If $aRead[0] = '' Or $aRead[2] = '' Then Return $GUI_RUNDEFMSG
GUICtrlSetData($inU, $aRead[0]*$aRead[2]) ; U = R*I
Case 'I'
Return $GUI_RUNDEFMSG
EndSwitch
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMANDHier mal noch das Bsp. für 2 Werte:
Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <EditConstants.au3>
$gui = GUICreate('Seitenverhältnis')
GUICtrlCreateLabel('Breite', 10, 23, 40, 17)
$inB = GUICtrlCreateInput('', 60, 20, 80, 20, $ES_RIGHT)
GUICtrlCreateLabel('Höhe', 10, 53, 40, 17)
$inH = GUICtrlCreateInput('', 60, 50, 80, 20, $ES_RIGHT)
GUICtrlCreateLabel('Breite : Höhe', 60, 90, 120, 17)
$label1 = GUICtrlCreateLabel('', 60, 120, 80, 17)
GUICtrlCreateLabel('Höhe : Breite', 200, 90, 120, 17)
$label2 = GUICtrlCreateLabel('', 200, 120, 80, 17)
GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")While 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
EndSwitch
WEndFunc WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit]
Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit
$hWndFrom = $ilParam
$iIDFrom = BitAND($iwParam, 0xFFFF)
$iCode = BitShift($iwParam, 16)
Switch $iCode
Case $EN_CHANGE
Switch $hWndFrom
Case GUICtrlGetHandle($inB), GUICtrlGetHandle($inH)
Local $aRead[2], $aCtrl[2] = [$inB,$inH]
For $i = 0 To 1
$aRead[$i] = GUICtrlRead($aCtrl[$i])
If Not StringRegExp($aRead[$i], '\A[\d.]*\z') Then
GUICtrlSetData($aCtrl[$i], '')
Return $GUI_RUNDEFMSG
EndIf
Next
If $aRead[0] = '' Or $aRead[1] = '' Then Return $GUI_RUNDEFMSG
GUICtrlSetData($label1, '1 : ' & StringFormat('%.2f', $aRead[0]/$aRead[1]))
GUICtrlSetData($label2, '1 : ' & StringFormat('%.2f', $aRead[1]/$aRead[0]))
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND -
Gibt es keine Möglichkeit zu überwachen, welches Feld gerade editiert wird,
unabhängig davon, ob in dem anderen schon etwas steht, und das dann
automatisch anzupassen?Das wäre doch vom Handling optimal.
Doch, das geht. Nur bedenke: Auch das Löschen eines Inhaltes ist eine Änderung. Wenn zeitgleich noch ein weiteres Input leer ist, ist keine Rechenoperation möglich.
Die einzige Variante, die für mich sinnvoll erscheint: Jedem Input ein Radio-Ctrl zuordnen und damit das Rechenziel festlegen. Änderungen in den anderen Inputs bewirken dann nur eine Berechnung in diesem Ziel-Input. Hat irgendein Input noch keinen Wert, so wird auch nicht gerechnet. -
Es kann doch nicht richtig sein das man etwas das schon im richtigen Format vorliegt erst wieder Umwandeln muss um es dann wieder in den selben Format zu bekommen.
Oder habe ich da ein Verständnis Problem.
Wenn du innerhalb von Office-Anwendungen Daten hin- und herschiebst, so kannst du dabei auch das Format "mitnehmen".
Bei Zwischenschalten anderer Anwendungen geht das nicht.
Bsp.
Exceltabelle enthält das Datum "1.1.2010"
- die Formatierung der Zelle ist auf "TT.MM.JJJJ" gesetzt, Anzeige: "01.01.2010"
- intern speichert Excel aber nur einen Zahlenwert, und zwar: 40179,00 (Basiswert 0 = "00.01.1900")
Dieser Zahlenwert wird beim Kopieren/Auslesen des Zelleninhaltes übernommen und mit entsprechendem Formatbefehl dann wieder als Datum dargestellt.ZitatDas Datum steht in der ersten Tabelle als 12.12.2009 im Format Datum, wird dann von Autoit eingelesen als 20091212000000 und so auch in der neuen Tabelle reingeschrieben.
AutoIt liest den formatierten Datumswert mit allen Angaben als String ein (JJJJMMTThhmmss). Beim Eintragen dieses Strings in eine neue Excelzelle, wird der String mit Standardformat interpretiert und für eine Zahl gehalten.
[autoit]
Mit der Zuweisung .NumberFormat = "" wird es wieder als String in der Datum-Langform dargestellt.
Wenn du das Datum in "TT.MM.JJJJ" erstellen möchtest, gehe folgendermaßen vor (spart die Formatierung):; Datumswert auslesen
[/autoit][autoit][/autoit][autoit]
$read = $oExcel.Activesheet.Range('A1').Value ; in A1 steht ein Datumswert (TT.MM.JJJJ)
; $read enthält jetzt den String: "JJJJMMTThhmmss"; Zuweisen des Datums in Datumschreibweise TT.MM.JJJJ <== dabei ordnet Excel automatisch das Datumsformat zu
[/autoit]
$oExcel.Activesheet.Range('A4').Value = StringRegExpReplace($read, '(\d{4})(\d{2})(\d{2})(\d{6})', '$3.$2.$1') -
Hallo,
ich wünsche allen AutoIt'lern ein Frohes und Gesundes 2010.
-
Wenn du wechselseitig rechnen willst kannst du nicht das Ereignis des Werteintragens in das Input nutzen, da dann die Rechenrichtung nicht klar wird.
Du benötigst also einen Start-Button der dann die Berechnung für das jeweils leere Feld ausführt.
Die Logik ist in einem einfachen If-Statement unterzubringen. (Abfragen, welches Feld ist leer - zugehörige Rechenoperation ausführen) -
An beide Streithähne:
Auch wir legen Wert auf Netiquette. Bitte mäßigt euch. Nicht in den letzten Minuten des alten Jahres noch Streß aufkommen lassen. -
AutoIt hat keine Objektorientierte Programmierung und die ist heutzutage SEHR wichtig und
Das ist sicher Ansichtssache. Manche Dinge, die du in anderen Sprachen objektorientiert programmierst, lassen sich in AutoIt ohne großen Aufwand anders erledigen. Es kommt immer drauf an, wodrauf man seinen Fokus setzt.
-
Du schreibst das Datum als eine Nichtdatum-Zahl in die neue Tabelle, dadurch wird das als reine Zahl interpretiert.
Ich suche mal raus, wie ich sowas gelöst habe und poste es dann.Edit:
[autoit]
Hier als Bsp., den Datumsstring mußt du aber vorher auch in die Form: TT.MM.JJJJ bringen und erst dann eintragen.; im Bsp. A1 bis A20 als Datum formatieren
[/autoit]
$oSheet.Range('A1:A20').NumberFormat = "TT.MM.JJJJ" -
Hier hast du alle:
Const COLOR_SCROLLBAR = 0 'The Scrollbar colour
Const COLOR_BACKGROUND = 1 'Colour of the background with no wallpaper
Const COLOR_ACTIVECAPTION = 2 'Caption of Active Window
Const COLOR_INACTIVECAPTION = 3 'Caption of Inactive window
Const COLOR_MENU = 4 'Menu
Const COLOR_WINDOW = 5 'Windows background
Const COLOR_WINDOWFRAME = 6 'Window frame
Const COLOR_MENUTEXT = 7 'Window Text
Const COLOR_WINDOWTEXT = 8 '3D dark shadow (Win95)
Const COLOR_CAPTIONTEXT = 9 'Text in window caption
Const COLOR_ACTIVEBORDER = 10 'Border of active window
Const COLOR_INACTIVEBORDER = 11 'Border of inactive window
Const COLOR_APPWORKSPACE = 12 'Background of MDI desktop
Const COLOR_HIGHLIGHT = 13 'Selected item background
Const COLOR_HIGHLIGHTTEXT = 14 'Selected menu item
Const COLOR_BTNFACE = 15 'Button
Const COLOR_BTNSHADOW = 16 '3D shading of button
Const COLOR_GRAYTEXT = 17 'Grey text, of zero if dithering is used.
Const COLOR_BTNTEXT = 18 'Button text
Const COLOR_INACTIVECAPTIONTEXT = 19 'Text of inactive window
Const COLOR_BTNHIGHLIGHT = 20 '3D highlight of button
Const COLOR_2NDACTIVECAPTION = 27 'Win98 only: 2nd active window color
Const COLOR_2NDINACTIVECAPTION = 28 'Win98 only: 2nd inactive window color -
-
Den Fehlerwert nicht anzeigen sondern auswerten.
[autoit]
(Benutze bitte die AutoIt-Tags, macht den Code lesbarer)RunWait("C:\....1.bat")
[/autoit]
If Not @error Then
RunWait("C:\....2.bat")
If Not @error Then
sleep(2000)
MouseClick("left",200,500,2)
Else
MsgBox(0, 'Fehler', 'Fehler BAT_2')
EndIf
Else
MsgBox(0, 'Fehler', 'Fehler BAT_1')
EndIf
[autoit]
Da RunWait im Fehlerfall 0 zurückgibt, läßt sich das auch etwas vereinfachen:If RunWait("C:\....1.bat") Then
[/autoit]
If RunWait("C:\....2.bat") Then
sleep(2000)
MouseClick("left",200,500,2)
Else
MsgBox(0, 'Fehler', 'Fehler BAT_2')
EndIf
Else
MsgBox(0, 'Fehler', 'Fehler BAT_1')
EndIf -
Der Übersichtlichkeit halber würde ich einfach eine Konstante erstellen (G für Gänsefüßchen ;)) und damit arbeiten:
[autoit]
[/autoit]
Const $G = '"'; oder Chr(34)
$Text = "Text"
ConsoleWrite( $G & $Text & $G & @CRLF)