sollte wohl eher
[autoit]WinSetTrans($_hGui, '', $_iTrans)
[/autoit]heissen
Ja, war ein Schreibfehler.
Sehr aufmerksames Publikum. ![]()
sollte wohl eher
[autoit]WinSetTrans($_hGui, '', $_iTrans)
[/autoit]heissen
Ja, war ein Schreibfehler.
Sehr aufmerksames Publikum. ![]()
Vermutlich existiert es schon in irgendeiner Form, ich hatte nur gerade nix gefunden, deshalb diese Variante von mir.
In Abhängigkeit ob die Maus (nicht) über dem Fenster ist, wird die Transparenz zwischen 2 Werten geswitcht. Standardmäßig zwischen 150 und 255 (undurchsichtig).
Falls ihr das Fenster beim Erstellen nicht auf Transparenz setzt, passiert das nach dem ersten Bewegen der Maus vom Fenster herunter automatisch.
Edit 21.05.2012:
Auf mehrfachen Wunsch einer einzelnen Dame
habe ich noch einen optionalen Parameter für einen "smoothigen" Übergang der Transparenz eingebaut.
Einfach die Zeit in ms angeben und dann wird die Transparenz innerhalb dieser Zeitspanne schrittweise geändert. 500 ms ist eine recht "angenehme" Zeitspanne.
#Region - TimeStamp
; 2012-05-21 19:02:36
#EndRegion - TimeStamp
#include <WinAPI.au3>
[/autoit] [autoit][/autoit] [autoit]$hGUI = GUICreate('TEST')
WinSetTrans($hGUI, '', 150)
GUISetState()
While True
_TransOffByMouseOver($hGUI, -1, -1, 500) ; == letzter Parameter ist Zeit in ms für den Übergang der Transparenz
Switch GUIGetMsg()
Case -3
Exit
EndSwitch
WEnd
;===============================================================================
; Function Name....: _TransOffByMouseOver
; Description......: Verändert Transparenz eines Fensters bei Maus über/nicht über Fenster
; Parameter(s).....: $_hGui Fensterhandle
; .................: $_iTrans Transparenz bei Maus nicht über Fenster (Standard 150)
; .................: $_iTransOff Transparenz bei Maus über Fenster (Standard 255, undurchsichtig)
; ........optional.: $_iTimeSmooth Zeit für den weichen Übergang der Transparenz in ms, Standard=0
; Requirement(s)...: #include <WinAPI.au3>
; Return Value(s)..: nichts
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _TransOffByMouseOver($_hGui, $_iTrans=-1, $_iTransOff=-1, $_iTimeSmooth=0)
If $_iTrans = -1 Then $_iTrans = 150
If $_iTrans < 0 Then $_iTrans = 0
If $_iTransOff = -1 Then $_iTransOff = 255
If $_iTransOff > 255 Then $_iTransOff = 255
If $_iTimeSmooth < 0 Then $_iTimeSmooth = 0
Local $tGui = _WinAPI_GetWindowRect($_hGui)
Local $posMouse = MouseGetPos(), $iStep, $ret, $iCurr = $_iTrans, $timer
Local Static $fTrans = True
$ret = DllCall("user32", "long", "PtInRect", "ptr", DllStructGetPtr($tGui), "long", $posMouse[0], "long", $posMouse[1])
If $ret[0] Then
If $fTrans Then
$fTrans = False
If $_iTimeSmooth > 0 Then
$iStep = Ceiling(($_iTransOff-$_iTrans)/($_iTimeSmooth/10))
While $iCurr < $_iTransOff
$iCurr += $iStep
If $iCurr > $_iTransOff Then
WinSetTrans($_hGui, '', $_iTransOff)
ExitLoop
EndIf
WinSetTrans($_hGui, '', $iCurr)
$timer = TimerInit()
Do
Until TimerDiff($timer) >= 10
WEnd
Else
WinSetTrans($_hGui, '', $_iTransOff)
EndIf
EndIf
Else
If Not $fTrans Then
$fTrans = True
If $_iTimeSmooth > 0 Then
$iCurr = $_iTransOff
$iStep = Ceiling(($_iTransOff-$_iTrans)/($_iTimeSmooth/10))
While $iCurr > $_iTrans
$iCurr -= $iStep
If $iCurr < $_iTrans Then
WinSetTrans($_hGui, '', $_iTrans)
ExitLoop
EndIf
WinSetTrans($_hGui, '', $iCurr)
$timer = TimerInit()
Do
Until TimerDiff($timer) >= 10
WEnd
Else
WinSetTrans($_hGui, '', $_iTrans)
EndIf
EndIf
EndIf
EndFunc ;==>_TransOffByMouseOver
Man sollte sich einfach mal klarmachen, dass man nichts umsonst bekommt. Denn auch die Freehoster sind nicht gratis, sondern versüßen uns das Leben mit Werbung. :wacko:
Erst recht, wenn man bestimmte Anforderungen hat, sollte man von vornherein nach kostengünstigen statt freien Anbietern suchen.
Ich habe gerade soviel Baustellen offen, dass ich dieses hier etwas vertagt habe. Ist aber nicht vergessen und wird hoffentlich in Kürze nachgebessert.
Ich grübel gerade noch an einer effizienten Methode um auf Updates automatisch reagieren zu können. Bei Standard-Includes ist das kein Problem, da gibt es ja eine AutoIt-Version, die sich abfragen läßt. Aber von allen Eigenen Includes evtl. Änderungen bei jedem Start zu prüfen bzw. neue Dateien einzulesen erscheint mir wenig sinnvoll. Oder ich verlege das ins SciTE-Startup, sodass es schon vor dem Aufruf der Funktion erledigt wird.
Naja, ich finde schon eine Lösung
- kann halt nur noch etwas dauern.
Hi,
vielleich hat noch wer Verwendung dafür.
Mit der Funktion lassen sich Ordnernamen (oder kpl. Pfade) in relativer Tiefe zum Startordner ausgeben.
Dazu wird ab Startordner rekursiv bis zur angegebenen Tiefe nach allen Verzeichnissen gesucht und die Ordner der letzten Ebene werden ausgegeben. Wahlweise wird der kpl. Pfad oder nur der Ordnername zurückgegeben.
#Region - TimeStamp
; 2012-05-20 20:17:50 v 0.1
#EndRegion - TimeStamp
;===============================================================================
; Function Name....: _GetFolderInRelativeDepth
; Description......: Gibt alle Ordner (kpl. Pfade, od. nur Ordnername) in relativer Tiefe zum übergebenen Ordner zurück
; Parameter(s).....: $_sRootFolder Pfad unterhalb dem gesucht werden soll
; .................: $_iDepth Pfadebene unterhalb des Startordners
; .................: $fFullPath 1=Rückgabe der kpl. Ordnerpfade (Standard), 0=nur Ordnernamen
; Return Value(s)..: Erfolg Array mit den Ordner(Pfaden) der Ebene
; .................: Fehler 0, @error=1 (keine Ordner in dieser Ebene)
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _GetFolderInRelativeDepth($_sRootFolder, $_iDepth, $fFullPath=1)
Local $sFound, $hSearch = FileFindFirstFile($_sRootFolder & '\*.*'), $iRow = $_iDepth-1
If $_iDepth < 2 Then $iRow = 2
Local $aFolder[$iRow][2] = [[1]], $sOut = '', $iCurrDepth = 0, $i
While True
$sFound = FileFindNextFile($hSearch)
If @error Then ExitLoop
If StringInStr(FileGetAttrib($sFound), 'D') Then
If $_iDepth = 1 Then
If $fFullPath Then
$sOut &= $_sRootFolder & '\' & $sFound & Chr(0)
Else
$sOut &= $sFound & Chr(0)
EndIf
Else
ReDim $aFolder[$iRow][$aFolder[$iCurrDepth][0] +1]
$aFolder[$iCurrDepth][0] += 1 ; == UBound in dieser Zeile
$aFolder[$iCurrDepth][$aFolder[$iCurrDepth][0] -1] = $_sRootFolder & '\' & $sFound
EndIf
EndIf
WEnd
If $_iDepth = 1 Then
If $sOut = '' Then Return SetError(1,0,0)
Return StringSplit(StringTrimRight($sOut, 1), Chr(0))
EndIf
For $i = 0 To UBound($aFolder) -2 ; == Ordnerebene über Zieltiefe
For $j = 0 To UBound($aFolder,2) -1
If $aFolder[$i][$j] = '' Then ExitLoop
$hSearch = FileFindFirstFile($aFolder[$i][$j] & '\*.*')
While True
$sFound = FileFindNextFile($hSearch)
If @error Then ExitLoop
If StringInStr(FileGetAttrib($aFolder[$i][$j] & '\' & $sFound), 'D') Then
If $aFolder[$i][0] = UBound($aFolder,2) Then
ReDim $aFolder[$iRow][$aFolder[$i][0] +1]
$aFolder[$i][0] += 1
EndIf
EndIf
WEnd
Next
Next
$i = UBound($aFolder) -1
For $j = 0 To UBound($aFolder,2) -1
If $aFolder[$i][$j] = '' Then ExitLoop
$hSearch = FileFindFirstFile($aFolder[$i][$j] & '\*.*')
While True
$sFound = FileFindNextFile($hSearch)
If @error Then ExitLoop
If StringInStr(FileGetAttrib($aFolder[$i][$j] & '\' & $sFound), 'D') Then
If $fFullPath Then
$sOut &= $aFolder[$i][$j] & '\' & $sFound & Chr(0)
Else
$sOut &= $sFound & Chr(0)
EndIf
EndIf
WEnd
Next
If $sOut = '' Then Return SetError(1,0,0)
Return StringSplit(StringTrimRight($sOut, 1), Chr(0))
EndFunc ;==>_GetFolderInRelativeDepth
wie kann ich nur so viele Zeilen lesen wie auch beschrieben sind?
Gibt verschiedene Möglichkeiten. Ich habe z.B. die Funktion _ExcelBookGetWidth() erstellt, mit der sich das abfragen läßt.
Andere Variante:
; === letzte Zeile
ConsoleWrite('Anzahl Zeilen: ' & $oExcel.Worksheets(1).UsedRange.Rows.Count & @CRLF)
; === letzte Spalte
ConsoleWrite('Anzahl Spalten: ' & $oExcel.Worksheets(1).UsedRange.Columns.Count & @CRLF)
dass es sich in dem "echten" Script eher um 24-150 oder mehr buttons handelt
Wozu gibt es Arrays... ![]()
Das kannst du so lösen:
[autoit]$bt1= GUICtrlCreateButton(..)
GUICtrlSetOnEvent(-1, 'EventHandler')
$bt2= GUICtrlCreateButton(..)
GUICtrlSetOnEvent(-1, 'EventHandler')
$bt3= GUICtrlCreateButton(..)
GUICtrlSetOnEvent(-1, 'EventHandler')
$bt4= GUICtrlCreateButton(..)
GUICtrlSetOnEvent(-1, 'EventHandler')
;......
[/autoit][autoit][/autoit][autoit]Func EventHandler()
Switch @GUI_CtrlId
Case $bt1
;..
Case $bt2
;..
Case $bt3
;..
Case $bt4
;..
EndSwitch
EndFunc
Du kannst OnEvent-Funktionen NICHT mit Parameter aufrufen. Steht auch so in der Hilfe.
Wenn StringSplit dir nur Müll zurückgibt, solltest du vielleicht mal einen Blick auf den 3.ten Parameter werfen. Der Fehler sitzt meist 60 cm vor dem Monitor. ![]()
Wenn das Bild genauso groß ist, wie die GUI, zentrierst du das Bild (mit der GUI) durch Angabe von "-1" oder "Default" bei Position X und Y für die GUI.
muss ich die abläufe noch mit dem AU3record aufnehme
Davon möchte ich dir dringend abraten. Dieses Tool ist nur dann halbwegs brauchbar, wenn du gar kein Standard-Control auf der Anwendung hast und tatsächlich rumklicken mußt mit Maus-Simulation.
Der erste Weg sollte immer das AutoIt-Windows-Info-Tool sein. Da siehst du, ob die Fenster/Controls per ID oder CLASS ansprechbar sind. Nur, wenn das erfolglos ist, sollte man auf die Krücke der Mausklickerei zurückgreifen.
- Syntax Funktionsaufrufe an neue Version angepaßt
- ColorPicker hinzugefügt
Zumindest in einem Teil (Captcha) Verstoß gegen Forenregeln.
[CLOSED]
He Dino, ich dachte, es ist selbstverständlich, dass du die Funktion (von hier) auch wieder mit nutzt. Ich habe nur die Änderungen gepostet. ![]()
Gibt es einen Punkt im Dateinamen hat die Datei auch eine Endung.
OK, wenn dem so ist, lag ich daneben. ![]()
Ich war immer der Meinung, dass Dateinamen ohne Endung aber mit Pukt im Namen möglich sind. Das Windows alles, was nach einem Punkt kommt als Endung interpretiert, heißt ja noch lange nicht, dass dem auch so ist. Oder?
Das ist easy, einfach die umbenannten Dateipfade mit zurückgeben lassen.
$sPfad = "D:\para\dib\"
$aRenamedFiles = _AddExt_txt($sPfad)
; == Bearbeitung
[/autoit] [autoit][/autoit] [autoit]; == Rückbenennen
_Rename_Back($aRenamedFiles)
Func _AddExt_txt($_sPath)
Local $oFSO = ObjCreate('Scripting.FileSystemObject')
Local $oFile, $sExt
Local $aFiles = _GetFilesFolder_Rekursiv($_sPath, -1, 0)
Local $sRet = ''
For $i = 1 To $aFiles[0]
$oFile = $oFSO.GetFile($aFiles[$i])
$sExt = $oFSO.GetExtensionName($oFile)
If $sExt = '0' Then
$oFSO.MoveFile($aFiles[$i], $aFiles[$i] & '.txt')
$sRet &= $aFiles[$i] & '.txt' & Chr(0)
EndIf
Next
Return StringSplit(StringTrimRight($sRet, 1), Chr(0))
EndFunc
Func _Rename_Back($_aFiles)
For $i = 1 To $_aFiles[0]
FileMove($_aFiles[$i], StringTrimRight($_aFiles[$i], 4))
Next
EndFunc
Festzustellen, ob eine Datei keine Endung hat ist mit AutoIt an sich nichht möglich, da nur der Punkt als Abgrenzung zur Extension keine Sicherheit bietet, schließlich gibt es auch Dateien mit Punkt im Namen.
Deshalb braucht es hier eine Lösung, die explizit auf die Erweiterung zugreifen kann.
$sPfad = "D:\para\dib\"
_AddExt_txt($sPfad)
Func _AddExt_txt($_sPath)
Local $oFSO = ObjCreate('Scripting.FileSystemObject')
Local $oFile, $sExt
Local $aFiles = _GetFilesFolder_Rekursiv($_sPath, -1, 0)
For $i = 1 To $aFiles[0]
$oFile = $oFSO.GetFile($aFiles[$i])
$sExt = $oFSO.GetExtensionName($oFile)
If $sExt = '0' Then $oFSO.MoveFile($aFiles[$i], $aFiles[$i] & '.txt')
Next
EndFunc
;==================================================================================================
; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
; Description: Rekursive Auflistung von Dateien und/oder Ordnern
; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
; optional: $iRetType 0 gibt Array, 1 gibt String zurück
; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;==================================================================================================
Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
Global $oFSO = ObjCreate('Scripting.FileSystemObject')
Global $strFiles = ''
Switch $sDelim
Case '1'
$sDelim = @CR
Case '2'
$sDelim = @LF
Case '3'
$sDelim = ';'
Case '4'
$sDelim = '|'
Case Else
$sDelim = @CRLF
EndSwitch
If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
If $sExt = -1 Then $sExt = '*'
If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
_ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
If $iRetType = 0 Then
Local $aOut
$aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
If $aOut[1] = '' Then
ReDim $aOut[1]
$aOut[0] = 0
EndIf
Return $aOut
Else
Return StringTrimRight($strFiles, StringLen($sDelim))
EndIf
EndFunc
Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
If Not IsDeclared("strFiles") Then Global $strFiles = ''
If ($Dir = -1) Or ($Dir = 0) Then
For $file In $Folder.Files
If $Ext <> '*' Then
If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
$strFiles &= $file.Path & $Delim
Else
$strFiles &= $file.Path & $Delim
EndIf
Next
EndIf
For $Subfolder In $Folder.SubFolders
If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
_ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
Next
EndFunc
Hier liegt der Fehler
[autoit]Switch $hWndFrom
Case $List_r_Report ; Events der Listbox
Switch verwendet das Handle und im Case-Zweig gibst du die ID an. Verwende auch dort das Handle:
GUICtrlGetHandle($List_r_Report)
[/autoit]