Verstehe ich nicht, wenn es nur eine Zeile ist, dann ist dies doch der gesamte Inhalt des Edits - also: GUICtrlRead($Edit).
Oder ist das Editfeld so schmal, dass du nur die Hälfte der Zeile siehst, und du möchtest diesen Teil auslesen?
Verstehe ich nicht, wenn es nur eine Zeile ist, dann ist dies doch der gesamte Inhalt des Edits - also: GUICtrlRead($Edit).
Oder ist das Editfeld so schmal, dass du nur die Hälfte der Zeile siehst, und du möchtest diesen Teil auslesen?
Also, du kannst die erste sichtbare Zeile ermitteln ( _GUICtrlEditGetFirstVisibleLine( ) ). Allerdings habe ich im Moment keine Idee, wie du die letzte sichtbare Zeile feststellen kannst, evtl. berechnen aus der Höhe des Editbereichs ( _GUICtrlEditGetRECT( ) ) und Schrifthöhe.
Alternativ, den gewünschten Bereich markieren. Mit _GUICtrlEditGetSel( ) erhältst du dann Start-und Endposition des markierten Bereiches.
Sag mal, wieso eigentlich WinActivate() ?
Du willst doch wissen ob das Fenster aktiv ist, also WinActive().
Oder liege ich da falsch?
$text = WinGetText($Title [,Text])
[/autoit]$Title ist bei dir aber: "Microsoft Business Solutions-Navision", also:
[autoit]$text = WinGetText("Microsoft Business Solutions-Navision")
[/autoit]Der Fehler: Es wurde kein String selektiert - $array ist leer.
[autoit]#include <String.au3>
#include <array.au3>
$text =("In Debitor D10000 fehlt die E-Mail-Adresse"); die quelle $text ist der ist-zustand, also kein anderer input vorhanden
$array = StringRegExp($text, "(?i)Debitor(.*?)(?i)fehlt",1)
If IsArray($array) Then
MsgBox(64,"",$array[0])
Else
MsgBox(0, '', "Array leer!")
EndIf
Probier malo dieses Pattern, bei mir klappt es damit:
[autoit]$array = StringRegExp($text, "((?<=Debitor )(.*?)(?= fehlt))",1)
[/autoit]#include <File.au3>
Dim $arLinks
_FileReadToArray("Pfad-Link-Datei", $arLinks)
For $i = 1 To $arLinks[0]
; Download $arLinks[$i]
Next
Ok, werd ich mal testen.
Vorher probier ich allerdings ob ich in den abgesicherten Modus komme. Vielleicht läßt sich von dort nachträglich der Treiber installieren.
Hi,
ich will einen PC ausrangieren, hab schon 'nen neuen und dieser ist mit SATA-Platten bestückt.
Der alte hat IDE-Platte mit Win2K. Die kommt aber nicht mit in den neuen PC da sowieso zu klein, hab sie aber auf eine SATA-Platte geklont.
Nun sind aber dort noch keine SATA-Treiber drauf und Windows kann somit nicht starten.
Hat jemand 'ne Idee, wie ich die Treiber da jetzt einbinden kann?
(Neuinstallation fällt eigentlich flach, da auf der Platte Lizenzinformationen zu einigen Programmen 'eingegraben' sind in Root und MBR. Die Infos gehen beim Klonen nicht verloren aber bei erneuter Installation ist alles futsch.
)
Hab grad bemerkt, dass Sleep(0) auch schon gewaltig bremst ![]()
Baue es mal ans Ende der For-Schleife ein. Das reduziert die Geschwindigkeit drastisch.
Oops, schon im Papierkorb. Aber ich machs nochmal.
Edit: So, hier die 2-Fenster-Variante.
#include <GUIConstants.au3>
Dim $x1 = 0, $y1 = 0, $x2 = @DesktopWidth-200, $y2 = @DesktopHeight-200
Dim $w1 = 400, $h1 = 400, $w2 = 200, $h2 = 200
$Wnd1 = GUICreate("Top Window", $w1, $h1, $x1, $y1)
$Wnd2 = GUICreate("Bottom Window", $w2, $h2, $x2, $y2)
GUISetState(@SW_SHOW, $Wnd1)
GUISetState(@SW_SHOW, $Wnd2)
$x1_way = @DesktopWidth-200
$y1_step = (@DesktopHeight-200)/$x1_way
$size_step = 200/$x1_way
$x2_way = @DesktopWidth-200
$x2_start = $x2_way
For $x1 = 0 To @DesktopWidth-200
$y1 += $y1_step
$w1 -= $size_step
$h1 -= $size_step
WinMove($Wnd1,'', $x1, Int($y1), Int($w1), Int($h1))
$y2 -= $y1_step
$x2 = $x2_start-$x1
WinMove($Wnd2,'', $x2, Int($y2), Int($w1), Int($h1))
Next
Edit2: Und hier eine Variante, in der ein Fenster wächst und das andere schrumpft.
#include <GUIConstants.au3>
Dim $x1 = 0, $y1 = 0, $x2 = @DesktopWidth-200, $y2 = @DesktopHeight-200
Dim $w1 = 400, $h1 = 400, $w2 = 200, $h2 = 200
$Wnd1 = GUICreate("Top Window", $w1, $h1, $x1, $y1)
$Wnd2 = GUICreate("Bottom Window", $w2, $h2, $x2, $y2)
GUISetState(@SW_SHOW, $Wnd1)
GUISetState(@SW_SHOW, $Wnd2)
$x1_way = @DesktopWidth-200
$y1_step = (@DesktopHeight-200)/$x1_way
$size_step = 200/$x1_way
$y2_step = $y1_step
For $x1 = 0 To @DesktopWidth-200
$y1 += $y1_step
$w1 -= $size_step
$h1 -= $size_step
WinMove($Wnd1,'', $x1, Int($y1), Int($w1), Int($h1))
$pos = WinGetPos($Wnd2)
$y2 -= $pos[1]/((@DesktopWidth-200)-$x1)
$x2 -= $pos[0]/((@DesktopWidth-200)-$x1)
$w2 += $size_step
$h2 += $size_step
WinMove($Wnd2,'', Int($x2), Int($y2), Int($w2), Int($h2))
Next
Sollte trotzdem gehen:
Fenster1 - 1 Schritt diagonal
Fenster2 - 1 Schritt diagonal usw. immer abwechselnd.
Die Geschwindigkeit sollte groß genug sein, wenn du zwischen den Schritten kein Sleep einbaust.
Hier mal ein Beispiel für ein Fenster. Brauchst jetzt nur entgegengesetzt für das andere Fenster im Wechsel laufen lassen.
Hab mal ein Sleep eingebaut, zum besseren Angucken. ![]()
#include <GUIConstants.au3>
Dim $x1 = 0, $y1 = 0
Dim $w1 = 400, $h1 = 400
$Wnd1 = GUICreate("Top Window", $w1, $h1, $x1, $y1)
GUISetState(@SW_SHOW, $Wnd1)
$x1_way = @DesktopWidth-200
$y1_step = (@DesktopHeight-200)/$x1_way
$size_step = 200/$x1_way
For $x1 = 0 To @DesktopWidth-200
$y1 += $y1_step
$w1 -= $size_step
$h1 -= $size_step
WinMove($Wnd1,'', $x1, Int($y1), Int($w1), Int($h1))
Sleep(5)
Next
EDIT: Habs grade mit 2 Fenstern probiert, wird zu langsam. Evtl. zum schnelleren Ausführen erst alle Parameter für jeden Schritt berechnen und in einem Array ablegen.
Ja, sollte nicht zu schwierig werden.
Ähnlich wie ich es in meiner _SlideWindow() Funktion gemacht habe. Nur zusätzlich die Parameter für Fenstergröße berücksichtigen.
Also farbig läßt sich die UDF durch SciTE wohl nicht so ohne weiteres darstellen.
Aber UserCalltips kannst du selber erstellen:
In der Datei "...\Scite\api\au3.user.calltips.api" sind die entsprechenden Einträge für deine eigenen Calltips vorzunehmen. Falls die Datei noch nicht existiert - erstellen.
Die Einträge werden wie folgt vorgenommen:
Probier mal hiermit, mußt aber deine Werte noch eintragen.
$objOU = ObjGet("LDAP://OU=management,dc=fabrikam,dc=com")
$objUser = $objOU.Create("User", "cn=MyerKen")
$objUser.Put "sAMAccountName", "myerken"
$objUser.SetInfo
$objGroup = $objOU.Create("Group", "cn=atl-users")
$objGroup.Put "sAMAccountName", "atl-users"
$objGroup.SetInfo
$objGroup.Add $objUser.ADSPath
Hi,
wenn ihr UDF's nutzt und ihr möchtet sie im Include-Verzeichnis zur Verfügung haben, hat dies den Nachteil, dass bei Installation einer neuen Version von AutoIt auch der Include-Ordner überschrieben wird und somit eure Kopie futsch ist.
Außerdem sind bei einer kopierten Datei Änderungen im Original nicht in der Kopie sichtbar. Ihr müßtet also dann in der Kopie auch ändern.
Tipp:
Einen Hardlink zur UDF ins Include-Verzeichnis erstellen.
Ein Hardlink ist ein weiterer Verweis auf ein und dieselbe physikalische Datei.
Es wird also nur einmal Speicher verwendet, die Datei kann unter Original- und Linknamen angesprochen und verändert werden.
Was ist zu beachten?
- funktioniert nur bei NTFS-Dateisystem
- man sollte (mit Nicht-Microsoft-Programmen) nur das Original bearbeiten - warum? - einige Programme löschen vor dem Speichervorgang die Ausgangsdatei und erstellen sie dann neu. Passiert das mit der Link-Datei, wird der Hardlink aufgehoben und die Datei als eigenständige Datei erstellt.
- bei Verlinkung von Dateien müssen Quelle und Ziel auf einem Volume sein (nur Verlinkung von Ordnern erlaubt Crossover)
- zum Setzen des Links sind Adminrechte notwendig
Hier mein Skript dafür (Auswahl der Datei mit FileOpenDialog), Voraussetzung AutoIt in Standardinstallation (sonst Pfad anpassen):
; Adminrechte ?
If ( Not IsAdmin() ) Then
MsgBox(262160, '', 'Zum Ausführen des Programms sind Administratorrechte erforderlich!')
Exit
EndIf
; Dateisystem ist NTFS ?
Dim $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20, $colItems = "", $strComputer = "localhost"
Dim $Output="", $Out2 = ''
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_LogicalDisk", "WQL", _
$wbemFlagReturnImmediately + $wbemFlagForwardOnly)
If IsObj($colItems) then
For $objItem In $colItems
If $objItem.Description = 'Lokale Festplatte' Then
If $objItem.FileSystem <> 'NTFS' Then
$Output = $Output & "DeviceID: " & $objItem.DeviceID & @CRLF
$Output = $Output & "FileSystem: " & $objItem.FileSystem & @CRLF & @CRLF
EndIf
EndIf
Next
If $Output <> "" Then
If MsgBox(262436, 'Dateisystem falsch', 'Folgende Festplatte(n) sind nicht im "NTFS-Format"' & @LF & _
'und somit kann kein Hardlink auf ihnen erzeugt werden:' & @LF & @LF & $Output & @LF & @LF & _
'Wenn die für den Hardlink gewünschte Festplatte nicht aufgezählt wurde,' & @LF & _
'können Sie fortsetzen.' & @LF & _
'Möchten Sie fortsetzen?') = 7 Then Exit
EndIf
Else
Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_LogicalDisk" )
Exit
Endif
; Daten für Hardlink
Dim $Include = RegRead("HKLM\SOFTWARE\AutoIt v3\AutoIt", "InstallDir") & "\Include\"
Dim $Source, $ret
Do
$Source = FileOpenDialog("Datei für Hard-Link", @ScriptDir, "AutoIt Dateien (*.au3)")
If $Source = '' Then _
$ret = MsgBox(262436, 'Auswahlfehler', 'Es wurde keine Datei ausgewählt!' & @LF & _
'Möchten Sie erneut wählen?')
Until $ret = 7 Or $Source <> ''
If $Source = '' Then Exit
Dim $File = StringRight($Source, StringLen($Source)-StringInStr($Source, '\', 1, -1))
If @error Then
MsgBox(0, '', $Source & @LF & 'enthält keinen gültigen Pfad/Dateinamen!')
Exit
EndIf
; Hardlink erstellen
If FileCreateNTFSLink($Source, $Include & $File) = 1 Then
MsgBox(262208, '', 'Der Hardlink' & @LF & @LF & $Include & $File & @LF & @LF & 'wurde erfolgreich angelegt.')
Else
MsgBox(262160, '', 'Der Hardlink' & @LF & @LF & $Include & $File & @LF & @LF & 'konnte nicht angelegt werden.')
EndIf
Der eigentliche Code (Pfad-/Dateiauswahl, Link anlegen) sind nur 3 Zeilen. Der Rest ist Error Handling. ![]()
Auf jeden Fall ControlClick().
Aber wieso kannst du dich im Fenster nicht mit Tatstatur bewegen? -- Jaja - die NurMausGeneration ![]()
Falls es mal mit ControlClick() nicht geht, dann per Tastaturbefehl:
von Register zu Register:
Strg+Tab (zurück Strg+Umsch+Tab)
Elemente auf Register:
Umsch+Tab
Wenn dir bekannt ist, welche Zeile leer ist:
[autoit]#include <File.au3>
_FileWriteToLine ( $sFile, $ZeilenNummer, "", 1 )
Damit wird die Zeile gelöscht.
Alternativ, wie oben schon angeführt, einlesen in Array. Dann mit meiner Funktion:
_Array2DEmptyDelete()
alle leeren Einträge löschen. Anschließend mit _FileWriteFromArray() zurückschreiben.
Wenn der Ausgabetext sich nur in der Debitor-Nr ändert kannst du auch _StringBetween verwenden.
[autoit]#include <String.au3>
$text = WinGetText("Titel")
$suchbegriff = _StringBetween($text, 'Debitor ', ' fehlt', 1)
If IsArray($suchbegriff) Then MsgBox(0, 'gefunden', $suchbegriff[0])
Links oben ist x=0, y=0
Also nach rechts und nach unten steigen die Werte an.
MouseClick("right",$coord[0]+/-$wert,$coord[1]+/-$wert)
Einfach gewünschte Pixelzahl addieren/subtrahieren von der gefundenen Position.