1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Oscar

Beiträge von Oscar

  • Virtuelles (partielles) Laufwerk Erstellen/Löschen

    • Oscar
    • 28. Dezember 2008 um 11:58

    Stimmt! Das mit FileExists wusste ich auch noch nicht. Man kann aber stattdessen "DriveGetType" benutzen:

    [autoit]


    Func _PartialDrive($sDeviceName=-1, $sTargetPath=-1, $iDelete=0)
    If $sDeviceName = -1 And $iDelete = 0 Then
    Local $j = 100
    While DriveGetType(Chr($j) & ':')
    $j += 1
    If $j > 122 Then Return SetError(2,0,0)
    WEnd
    $sDeviceName = Chr($j) & ':'
    ElseIf ($sDeviceName = -1 Or Not FileExists($sDeviceName)) And $iDelete = 1 Then
    Return SetError(5,0,0)
    EndIf
    [...]

    [/autoit]

    Edit: BugFix, mir ist gerade noch aufgefallen, dass man zum Löschen auch den Zielpfad angeben muss. Musste gerade ganz schön suchen, mit welchem Pfad ich das LW erstellt hatte (wollte nicht neu starten). Kann man den Aufruf auch so ändern, dass man nur den Buchstaben angeben kann?

  • Virtuelles (partielles) Laufwerk Erstellen/Löschen

    • Oscar
    • 28. Dezember 2008 um 10:14

    Ahh ja, jetzt habe ich das verstanden. :)
    Was Deinen Rechner betrifft: Du vertraust der Platte doch keine wichtigen Daten mehr an, oder? ;)
    Obwohl...das ist hier OT. Falls Du Hilfe zu Deinem Rechner brauchst, kannst Du ja in "Off-Topic" einen Thread aufmachen...

  • Virtuelles (partielles) Laufwerk Erstellen/Löschen

    • Oscar
    • 28. Dezember 2008 um 06:02

    FirePanther: Ich habe mir den Beitrag von Dir jetzt fünf mal durchgelesen, aber ich werde daraus nicht schlau. Hat das irgendwas mit dem Script von BugFix zu tun? :S

  • guictrllistview item markieren?!

    • Oscar
    • 27. Dezember 2008 um 21:18

    Ich denke, das Problem ist, dass das Listview den Focus verliert, sobald Du einen Button anklickst. Somit verschwindet auch die Markierung. Es sei denn, man fügt beim erstellen des Listviews den Style $LVS_SHOWSELALWAYS hinzu:

    So sollte es gehen:

    [autoit]

    $ListView1 = GUICtrlCreateListView("id|Name|Title|Artist|Album|Year|Genre|duration|Bitrate|Description|Path", 8, 8, 1146, 478, BitOr($LVS_REPORT, $LVS_SHOWSELALWAYS))

    [/autoit]
  • guictrllistview item markieren?!

    • Oscar
    • 27. Dezember 2008 um 20:49

    Hast Du in Deinem Script zum erstellen des Listviews vielleicht den Standard-Befehl "$listview = GUICtrlCreateListView" benutzt?
    Und dann vielleicht vergessen, beim selektieren das Handle zu benutzen: _GUICtrlListView_SetItemSelected(GUICtrlGetHandle($listview), $i, True)

    Die Standard-Befehle liefern immer eine Control-ID zurück. Viele UDFs wollen aber das Handle als Übergabe-Parameter.

    Eine beliebte Fehlerquelle (spreche da aus eigener Erfahrung). :rolleyes:

  • Virtuelles (partielles) Laufwerk Erstellen/Löschen

    • Oscar
    • 27. Dezember 2008 um 17:24

    BugFix : Den Anfang der Funktion kann man etwas kürzen:

    Spoiler anzeigen
    [autoit]


    Func _PartialDrive($sDeviceName = -1, $sTargetPath = -1, $iDelete = 0)
    If $sDeviceName = -1 And $iDelete = 0 Then
    $i = 99
    While FileExists(Chr($i) & ':')
    $i += 1
    If $i > 122 Then Return SetError(2, 0, 0)
    WEnd
    $sDeviceName = Chr($i) & ':'
    EndIf
    $sDeviceName = StringRegExpReplace(StringLower($sDeviceName), '(.*)([a-z]{1}:)(.*)', '$2')
    If $iDelete = 0 And FileExists($sDeviceName) Then Return SetError(1, 0, 0)
    If $sTargetPath = -1 Then $sTargetPath = @MyDocumentsDir
    If Not FileExists($sTargetPath) Then Return SetError(3, 0, 0)
    Local $iFlag = 0x0
    If $iDelete <> 0 Then $iFlag = 0x2
    Local $ret = DllCall('kernel32.dll', 'long', 'DefineDosDeviceA', _
    'long', $iFlag, 'str', $sDeviceName, 'str', $sTargetPath)
    If $ret[0] = 0 Then
    Return SetError(4, 0, 0)
    Else
    Return $sDeviceName
    EndIf
    EndFunc ;==>_PartialDrive

    [/autoit]

    Ansonsten: Wieder mal eine Klasse Funktion! :thumbup:

  • Funktion ControlSend maximiert Fenster

    • Oscar
    • 27. Dezember 2008 um 14:22

    BugFix hat recht. Die Funktion sendini() ist eine "Todesschleife". Laut Hilfe:

    "MAXCALLRECURSE = 5100"

    D.h. nach 5100 rekursiven Funktionsaufrufen ist's vorbei mit Deinem Script.

    Warum nur missbraucht ihr Funktionsaufrufe immer als GOTO-Ersatz?
    Es gibt doch genügend Schleifenbefehle... :rolleyes:

  • Taschenrechner

    • Oscar
    • 27. Dezember 2008 um 04:27

    Habe Dir Dein Script mal angepasst:

    Spoiler anzeigen
    [autoit]


    #include<EditConstants.au3>
    #include<GUIConstantsEx.au3>
    $Form1 = GUICreate("Rechner", 151, 102, 193, 125)
    $Button1 = GUICtrlCreateButton("1", 0, 78, 25, 25, 0)
    $Button2 = GUICtrlCreateButton("2", 26, 78, 25, 25, 0)
    $Button3 = GUICtrlCreateButton("3", 52, 78, 25, 25, 0)
    $Button4 = GUICtrlCreateButton("4", 0, 52, 25, 25, 0)
    $Button5 = GUICtrlCreateButton("5", 26, 52, 25, 25, 0)
    $Button6 = GUICtrlCreateButton("6", 52, 52, 25, 25, 0)
    $Button7 = GUICtrlCreateButton("7", 0, 26, 25, 25, 0)
    $Button8 = GUICtrlCreateButton("8", 26, 26, 25, 25, 0)
    $Button9 = GUICtrlCreateButton("9", 52, 26, 25, 25, 0)
    $input = GUICtrlCreateInput("", 0, 0, 151, 21,$ES_NUMBER)
    $Button10 = GUICtrlCreateButton("=", 98, 26, 53, 25, 0)
    $Button11 = GUICtrlCreateButton("+", 98, 78, 25, 25, 0)
    $Button12 = GUICtrlCreateButton("-", 126, 78, 25, 25, 0)
    $Button13 = GUICtrlCreateButton("*", 98, 52, 25, 25, 0)
    $Button14 = GUICtrlCreateButton("/", 126, 52, 25, 25, 0)
    GUISetState(@SW_SHOW)
    $ergebniss = 0
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    Clear()
    GUICtrlSetData($input, GUICtrlRead($input) & 1)
    Case $Button2
    Clear()
    GUICtrlSetData($input, GUICtrlRead($input) & 2)
    Case $Button3
    Clear()
    GUICtrlSetData($input, GUICtrlRead($input) & 3)
    Case $Button4
    Clear()
    GUICtrlSetData($input, GUICtrlRead($input) & 4)
    Case $Button5
    Clear()
    GUICtrlSetData($input, GUICtrlRead($input) & 5)
    Case $Button6
    Clear()
    GUICtrlSetData($input, GUICtrlRead($input) & 6)
    Case $Button7
    Clear()
    GUICtrlSetData($input, GUICtrlRead($input) & 7)
    Case $Button8
    Clear()
    GUICtrlSetData($input, GUICtrlRead($input) & 8)
    Case $Button9
    Clear()
    GUICtrlSetData($input, GUICtrlRead($input) & 9)
    Case $Button10
    $ergebniss = StringSplit(GUICtrlRead($input), "+")
    If Not @error = 1 Then
    GUICtrlSetData($input, $ergebniss[1] + $ergebniss[2])
    EndIf
    $ergebniss = StringSplit(GUICtrlRead($input), "-")
    If Not @error = 1 Then
    GUICtrlSetData($input, $ergebniss[1] - $ergebniss[2])
    EndIf
    $ergebniss = StringSplit(GUICtrlRead($input), "*")
    If Not @error = 1 Then
    GUICtrlSetData($input, $ergebniss[1] * $ergebniss[2])
    EndIf
    $ergebniss = StringSplit(GUICtrlRead($input), "/")
    If Not @error = 1 Then
    GUICtrlSetData($input, $ergebniss[1] / $ergebniss[2])
    EndIf
    Case $Button11
    GUICtrlSetData($input, GUICtrlRead($input) & "+")
    $ergebniss = 0
    Case $Button12
    GUICtrlSetData($input, GUICtrlRead($input) & "-")
    $ergebniss = 0
    Case $Button13
    GUICtrlSetData($input, GUICtrlRead($input) & "*")
    $ergebniss = 0
    Case $Button14
    GUICtrlSetData($input, GUICtrlRead($input) & "/")
    $ergebniss = 0
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Clear()
    If $ergebniss <> 0 Then
    $ergebniss = 0
    GUICtrlSetData($input, '')
    EndIf
    EndFunc

    [/autoit]
  • UDF: Timestamp2array

    • Oscar
    • 26. Dezember 2008 um 09:59

    Ich hätte da noch eine weitere Variante:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $iTicks = 9644330003

    [/autoit] [autoit][/autoit] [autoit]

    $array = _TicksToDateTimeArray($iTicks)
    _ArrayDisplay($array, 'unformatierte Ausgabe')

    [/autoit] [autoit][/autoit] [autoit]

    $array = _TicksToDateTimeArray($iTicks, True)
    _ArrayDisplay($array, 'formatierte Ausgabe')

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name..: _TicksToDateTimeArray($iValue[, $bFormat])
    ; Description....: Umwandlung von Millisekunden in ein Array mit Zeitangaben
    ; Parameter(s)...: $iValue = Wert in Millisekunden
    ; $bFormat True = Ausgabe formatiert (führende Nullen)
    ; False = Ausgabe unformatiert (Standard)
    ; Return Value...: Array (Wochen, Tage, Stunden, Minuten, Sekunden, Millisekunden)
    ; Author.........: Oscar (http://www.autoit.de)
    ;===============================================================================
    Func _TicksToDateTimeArray($iTicks, $bFormat = False)
    Local $aOut[6], $aDiv[6] = [604800000, 86400000, 3600000, 60000, 1000, 1]
    For $i = 0 To 5
    $aOut[$i] = Int($iTicks / $aDiv[$i])
    $iTicks = Mod($iTicks, $aDiv[$i])
    If $bFormat Then $aOut[$i] = StringFormat('%0' & 2 + ($i = 5) & 'i', $aOut[$i])
    Next
    Return $aOut
    EndFunc ;==>_TicksToDateTimeArray

    [/autoit]
  • Welche Lösung nehmen???

    • Oscar
    • 26. Dezember 2008 um 00:53

    Wenn es schon die MessageLoop-Version sein soll, dann bevorzuge ich die Switch-Variante:

    [autoit]


    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE, $exitbutton
    ExitLoop
    EndSwitch
    WEnd

    [/autoit]
  • Wie online/offline gehen bzw. Stand überprüfen

    • Oscar
    • 25. Dezember 2008 um 10:54

    Die von mir gepostete Funktion ist doch nicht nur die Funktion. Da ist doch bereits ein Beispiel-Funktionsaufruf mit MsgBoxen bei.

  • Frohe Weihnachten

    • Oscar
    • 24. Dezember 2008 um 04:40

    Ich wünsche euch und euren Angehörigen ein friedliches und besinnliches Weihnachtsfest. Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    P.S.: Hier in Hannover wurde Regen vorhergesagt. Wird also wohl nichts mit "Weißer Weihnacht". Schade!

  • _GetDriveInfo (erweiterte Informationen zu einer Festplatte/USB-Stick)

    • Oscar
    • 23. Dezember 2008 um 21:32

    Die Informationen, die man per WMI auslesen kann sind ja ganz interessant, aber man kann sie nicht speziell für ein bestimmtes Laufwerk (Buchstaben übergeben) auslesen. Deshalb habe ich diese Funktion geschrieben, mit der genau das möglich ist:

    Spoiler anzeigen
    [autoit]


    ; Anfang Beispiel
    #include<Array.au3> ; wird nur für _ArrayDisplay benötigt
    $sScriptDrive = StringLeft(@ScriptDir, 2) ; Laufwerksbuchstaben holen
    $Ret = _GetDriveInfo($sScriptDrive)
    If IsArray($Ret) Then
    _ArrayDisplay($Ret, 'Informationen über Laufwerk "' & $sScriptDrive & '"')
    Else
    MsgBox(0, 'Fehler', $Ret)
    EndIf
    ; Ende Beispiel

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: _GetDriveInfo($sDrive)
    ; Description:: Erweiterte Informationen zu einer Festplatte/USB-Stick
    ; Parameter(s): $sDrive = Laufwerksbuchstabe
    ; Requirement(s): ---
    ; Return Value(s): 2D-Array mit Bezeichnung und Wert (siehe Beispiel)
    ; Author(s): Oscar (http://www.autoit.de)
    ;
    ;===============================================================================
    ;
    Func _GetDriveInfo($sDrive)
    Local $sDriveType = DriveGetType($sDrive)
    If $sDriveType <> 'Fixed' And $sDriveType <> 'Removable' Then SetError(1, 0, 1)
    If Not FileExists($sDrive) Then Return SetError(1, 0, 1)
    Local $wbemFlagReturnImmediately = 0x10
    Local $wbemFlagForwardOnly = 0x20
    Local $colItems = ''
    Local $aPartition, $aPhysicalDrive, $aOut[14][2]
    $objWMIService = ObjGet('winmgmts:\\localhost\root\CIMV2')
    If Not IsObj($objWMIService) Then Return SetError(2, 0, 2)
    $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_LogicalDiskToPartition', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) then
    For $objItem In $colItems
    If StringInStr($objItem.Dependent, '"' & $sDrive & '"') Then
    $aPartition = StringRegExp($objItem.Antecedent, 'DeviceID="(.*)"', 3)
    EndIf
    Next
    Endif
    If Not IsArray($aPartition) Then Return SetError(3, 0, 3)
    $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_DiskDriveToDiskPartition', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) then
    For $objItem In $colItems
    If StringInStr($objItem.Dependent, '"' & $aPartition[0] & '"') Then
    $aPhysicalDrive = StringRegExp($objItem.Antecedent, 'DeviceID="(.*)"', 3)
    EndIf
    Next
    Endif
    If Not IsArray($aPhysicalDrive) Then Return SetError(4, 0, 4)
    $aPhysicalDrive[0] = StringReplace($aPhysicalDrive[0], '\\', '\')
    $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive', 'WQL', $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
    If IsObj($colItems) then
    For $objItem In $colItems
    If StringInStr($objItem.DeviceID, $aPhysicalDrive[0]) Then
    $aOut[0][0] = 'Volume-Label'
    $aOut[0][1] = DriveGetLabel($sDrive)
    $aOut[1][0] = 'Serial-Nr. (Volume)'
    $aOut[1][1] = DriveGetSerial($sDrive)
    $aOut[2][0] = 'Model'
    $aOut[2][1] = $objItem.Model
    $aOut[3][0] = 'Serial-Nr. (Drive)'
    $aOut[3][1] = StringMid($objItem.PNPDeviceID, StringInStr($objItem.PNPDeviceID, '\', 0, -1) + 1)
    $aOut[3][1] = StringReplace($aOut[3][1], '&0', '')
    $aOut[4][0] = 'Interface'
    $aOut[4][1] = $objItem.InterfaceType
    $aOut[5][0] = 'Size (Bytes)'
    $aOut[5][1] = $objItem.Size
    $aOut[6][0] = 'Media Type'
    $aOut[6][1] = StringRegExpReplace($objItem.MediaType, '[^[:print:]]', ' ')
    $aOut[7][0] = 'Total Cylinders'
    $aOut[7][1] = $objItem.TotalCylinders
    $aOut[8][0] = 'Total Heads'
    $aOut[8][1] = $objItem.TotalHeads
    $aOut[9][0] = 'Total Tracks'
    $aOut[9][1] = $objItem.TotalTracks
    $aOut[10][0] = 'Total Sectors'
    $aOut[10][1] = $objItem.TotalSectors
    $aOut[11][0] = 'Tracks Per Cylinder'
    $aOut[11][1] = $objItem.TracksPerCylinder
    $aOut[12][0] = 'Sectors Per Track'
    $aOut[12][1] = $objItem.SectorsPerTrack
    $aOut[13][0] = 'Bytes Per Sector'
    $aOut[13][1] = $objItem.BytesPerSector
    EndIf
    Next
    Endif
    $objWMIService = ''
    Return $aOut
    EndFunc

    [/autoit]
  • Angucken und testen

    • Oscar
    • 23. Dezember 2008 um 20:14

    Funktion "pingad" ist mit der Änderung ok!

    Das einlesen mittels IniRead geschieht vor der While...WEnd-Schleife. Wird also nur einmal beim Programmstart gelesen. Wenn sich der Wert in der Ini dann im Verlauf des Programms ändert, bekommt das Programm das erst beim nächsten Programmstart mit. Es sei denn man ändert die benutzte Variable ebenfalls (wie jetzt geschehen).

    String-Formatierungen:

    Spoiler anzeigen
    [autoit]


    Func ShowInfo() ;info
    Local $String = ""
    $String &= "Internetchecker" & @CRLF
    $String &= "Ver. [0.6]" & @CRLF & @CRLF
    $String &= "Errors:" & @CRLF
    $String &= "1 = Host is offline" & @CRLF
    $String &= "2 = Host is unreachable" & @CRLF
    $String &= "3 = Bad destination" & @CRLF
    $String &= "4 = Other errors" & @CRLF & @CRLF
    $String &= "ICQ: 191221651" & @CRLF
    $String &= "© 2008/2009 bei Hendrik O." & @CRLF
    MsgBox(0, "Information", $String)
    EndFunc ;==>ShowInfo

    [/autoit]

    Die Funktion zum anzeigen der CSV-Datei könnte man auch so schreiben:

    [autoit]


    Func pinger() ;shell ping.csv
    If FileExists(@ScriptDir & "\ping.csv") Then ShellExecute(@ScriptDir & "\ping.csv")
    EndFunc ;==>pinger

    [/autoit]
  • Wie online/offline gehen bzw. Stand überprüfen

    • Oscar
    • 23. Dezember 2008 um 20:03

    Teste doch mal mein Script. Das einlesen dauert, wie erwähnt, eine Weile, aber dann werden Dir MsgBoxen angezeigt, wo die Programme liegen (wenn Du die Programme aus meinem Beispiel installiert hast).

  • Angucken und testen

    • Oscar
    • 23. Dezember 2008 um 17:10

    @r1fLeX: evtl. blockt die Firewall das Programm?

    @Henne:

    1. In der Funktion "pingad" kann der User eine neue Adresse eingeben, die Du dann auch in der Ini abspeicherst, aber sie wird nicht in der While...WEnd-Schleife benutzt, da die neue Adresse nicht in der Variablen "$pinginiread" steht.
    Abhilfe: der Variablen "$pinginiread" in der Funktion den Wert von "$pingini" zuweisen.

    1a. Das Gleiche mit $intervallini und $intervalliniread.

    2. Die If...Then-Anweisung in der While...WEnd-Schleife kann man kürzer schreiben:

    [autoit]


    While 1 ; Idle Function Loop
    $var = Ping($pinginiread, $timeoutread)
    If Not $var Then
    _FileWriteLog(@ScriptDir & "\ping.csv", "; Offline ; Error: " & @error)
    EndIf
    Sleep($intervalliniread)
    WEnd

    [/autoit]


    oder gleich so:

    [autoit]


    While 1 ; Idle Function Loop
    If Not Ping($pinginiread, $timeoutread) Then _FileWriteLog(@ScriptDir & "\ping.csv", "; Offline ; Error: " & @error)
    Sleep($intervalliniread)
    WEnd

    [/autoit]

    3. In der Funktion "ShowInfo" erstellst Du ein Array, übergibst es ans Clipboard und liest dann den Inhalt vom Clipboard wieder ein, um es in einer MsgBox anzuzeigen?! Warum nicht einfach einen String und den dann anzeigen?

    3a. Was soll diese Zeile in der Funktion:

    [autoit]

    $array = StringSplit("a,b,c,d,e,f,g,h,i", ",")

    [/autoit]

    4. In der Funktion "pinger" vor dem Shellexecute überprüfen, ob es die Datei überhaupt gibt. Stichwort: FileExists()

    5. Bei der Ausgabe in die Logdatei könntest Du die Errorwerte ausgeschrieben (und in deutsch) eintragen lassen.

    6. Und: "Standard" statt "Standart", bitte! Das sind zwei verschiedene Wörter!

    Ende der Liste... :)

  • .au3 Saver

    • Oscar
    • 23. Dezember 2008 um 14:18

    Einfach so:

    [autoit]


    $pfad = FileSelectFolder("Bitte den Include-Ordner suchen", @ProgramFilesDir)
    If @error = 1 Then ContinueLoop

    [/autoit]
  • S4tur0n

    • Oscar
    • 23. Dezember 2008 um 04:15

    Hierzu...

    Zitat

    das man auch ne menge lustiger Sachen machen kann...


    ...den Hinweis auf die Forenregeln

    Ansonsten: Herzlich willkommen hier im Forum :)

  • Probleme mit dem Obfusator

    • Oscar
    • 23. Dezember 2008 um 04:04
    Zitat


    Obfuscator will make it a lot harder to read your source code but remember:

    Obfuscator doesn't make your source safe!

  • .au3 Saver

    • Oscar
    • 22. Dezember 2008 um 23:54

    Es wird nicht dadurch besser, dass Du nun zwei Funktionen benutzt. ;)
    Wenn Du Funktionsaufrufe als GOTO-Ersatz missbrauchst, führt das früher oder später zu einem Absturz des Scripts.
    Schau Dir mal die Schleifen-Befehle (While...WEnd und Do...Until) an.

    Und ich verstehe immer noch nicht den Sinn hinter diesem Script. Was genau soll man damit machen können?

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™