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. Crys

Beiträge von Crys

  • Video Codec auslesen

    • Crys
    • 7. April 2012 um 22:36
    Zitat von klischee

    ... Ich hab das bei mir so gefriemelt, dass ich per %StreamCount% für Video und %AudioCount% für Audio schaue wieviele Streams ein Video hat und dann Strings entsprechend wenn möglich halbiere / drittele etc und oder die als String (%BitRate/String%) ausgegebenen Bitraten ebenfalls aufspalte, zb per StringSplit() usw.

    Wenn man den String nicht Symmetrisch Teilen kann, hat man halt Probleme.
    Aus den den Audiosprachen für 2 Tonspuren "germanenglisch" wird dann getrennt "germane" und "nglisch" ...

    Ich habe noch ein bisschen mit der DLL#Fkt. herum gespielt ... try and error ... so wie man es lernt, wie man es nicht machen soll :whistling:
    Auf jeden Fall habe ich es jetzt so gelöst:

    [autoit]

    ; StreamIDs herausfinden
    local $daten_typ[4][3] = [["General",0],["Video",1],["Audio",2],["Text",3]]
    for $n=0 to 3
    DllCall($hDLL, "wstr", "MediaInfo_Option", "ptr", 0, "wstr", "Inform", "wstr", $daten_typ[$n][0] & ";%StreamCount%")
    $tmp_info = DllCall($hDLL, "wstr", "MediaInfo_Inform", "ptr", $Handle[0], "int", 0)
    $SteamID = StringLeft($tmp_info[0], 1) ; bei Mehrfachnennungen nur die erste Zahl, geht nur bis 9 Streams!
    next

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

    ; ...

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

    ; $StreamKind : General, Video, Audio oder Text ID .. also 0,1,2,3 oder 4
    ; $SteamID : Beginnent bei 0 ... wenn es 2 Tonspuren gibt, dann gibt es bei Audio: 1,2
    ; $Parameter : Was man für Info raus bekommen möchte
    $tmp_info = DllCall($hDLL, "wstr", "MediaInfo_Get", "ptr", $Handle[0], "int", $StreamKind, "int", $SteamID, "wstr", $Parameter, "int", 1, "int", 0)

    [/autoit]


    Ich frage zuerst ab, wie viele Stream es je Typ gibt und dann kann man die gezielte Info abrufen!

  • Video Codec auslesen

    • Crys
    • 6. April 2012 um 19:00

    So, nach 11 Monaten bin ich wieder voll am Projekt ... nur mit den DLL-Aufrufen hapert es noch :(

    Ich habe mal alle Parameter auswerten lassen:

    Alle Parameter auswerten lassen
    [autoit]

    #include <Array.au3>

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

    local $komplette_liste ; Liste aller möglichen Parameter, aus csv

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

    $Handle = DllCall($hDLL, "ptr", "MediaInfo_New") ; New MediaInfo handle
    $Open_Result = DllCall($hDLL, "int", "MediaInfo_Open", "ptr", $Handle[0], "wstr", $datei)

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

    for $x=0 to UBound($komplette_liste, 1)-1
    $tmp_info = DllCall($hDLL, "wstr", "MediaInfo_Get", "ptr", $Handle[0], "int", 0, "int", 0, "wstr", $komplette_liste[$x][0], "int", 1, "int", 0)
    if @error then MsgBox(0, default, "Fehler!")
    $komplette_liste[$x][1] = $tmp_info[0]
    next

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

    $Handle=DllCall($hDLL, "none", "MediaInfo_Delete", "ptr", $Handle[0])

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

    _ArrayDisplay($info, "Alle Datei-Infos!")

    [/autoit]

    ... aber nur ein Bruchteil davon gibt ein Ergebnis aus!

    Ich verstehe das ganze um die DLL()-Fkt. nicht!
    Der erste Parameter ist klar, der zweite ist das Ausgabeformat, das dritte verstehe ich schon nicht, wann kommt MediaInfo_Inform, MediaInfo_Option, MediaInfoList_Count_Get_Files, MediaInfo_Get oder MediaInfo_GetI?
    Das finde ich nirgends wo!

    Der vierte und fünfte Parameter ist die zu untersuchende Datei ... der sechste bis neunte machen für mich wieder keinen Sinn, genauso wie der zwölfte bis fünfzehnte.
    Der elfte Parameter ist idR. das was ich bestimmen möchte, nur klappt das nicht immer ... :huh:

    Er echt cool, wenn mir da jemand weiterhelfen könnte! ^^


    Nachtrag:
    Ich habe jetzt eine andere Funktion aus den Beispielen gepickt und die so umgeformt, dass sie jetzt alles ausgeben kann:

    Alle Parameter auswerten lassen - die 2te
    [autoit]

    #include <Array.au3>

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

    local $komplette_liste ; Liste aller möglichen Parameter, aus csv
    ; nun mit $daten_typ: General, Video, Audio, usw.

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

    $Handle = DllCall($hDLL, "ptr", "MediaInfo_New") ; New MediaInfo handle
    $Open_Result = DllCall($hDLL, "int", "MediaInfo_Open", "ptr", $Handle[0], "wstr", $datei)

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

    for $x=0 to UBound($komplette_liste, 1)-1
    DllCall($hDLL, "wstr", "MediaInfo_Option", "ptr", 0, "wstr", "Inform", "wstr", $daten_typ & ";%" & $komplette_liste[$x][0] & "%")
    $tmp_info = DllCall($hDLL, "wstr", "MediaInfo_Inform", "ptr", $Handle[0], "int", 0)
    if @error then MsgBox(0, default, "Fehler!")
    $komplette_liste[$x][1] = $tmp_info[0]
    next

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

    $Handle=DllCall($hDLL, "none", "MediaInfo_Delete", "ptr", $Handle[0])

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

    _ArrayDisplay($info, "Alle Datei-Infos!")

    [/autoit]

    So komme ich nun an alle Informationen, die ich will!
    (Die "komplette Liste" mit allen 934 Parametern laufen hier nur zu Testzwecken durch, später benutze ich selbstverständlich nur noch die benötigten!)

    Sieht aber nicht als ob das so gedacht war ... wenn jemand weiß, wie man das besser machen kann, dann nur her damit ;)


    Neues Problem:
    Wenn das Video mehrere Audio- oder Untertitel- Spuren besitzt, dann werden die Informationen dazu in ein String geschrieben:

    Code
    BitRate/String: 640 Kbps640 Kbps
    Language/String: GermanEnglish


    Wie bekomme ich die Informationen für jede einzelne Spur getrennt?

  • Zeile in 2D Array schreiben

    • Crys
    • 6. April 2012 um 14:44
    Zitat von UEZ

    Da ich deinen Fall nicht verstehe, habe ich mir gedacht, dass du vllt. sowas suchst - war ein Versuch wert.
    Versuche konkret zu beschreiben, was du willst, ansonsten raten wir nur rum!

    Wie im letzten Post beschrieben: ganz viele Größen und Positionen von GUI-Elementen in ein Array packen, damit man per Schleife an die Daten kommt!

    Ist aber auch egal ... ich habs ja schon gelöst, mit der Fkt. die ich oben gepostet habe.
    Hatte nur noch nicht den Thread als gelöst markiert :whistling:

    Abgeändertes Code-Beispiel
    [autoit]

    #include-once

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

    ; zu Schrift
    $gui_schrift_groesse = -1; 10
    $gui_schrift_breite = -1 ;400
    $gui_schrift_art = -1 ;"Calibri"

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

    ; GUI Größen
    $gui_db_x = 980
    $gui_db_y = 570

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

    ; Verschiedene Abstände
    $abstand_titel = 40
    $abstand_oben = 50
    $abstand_unten = 50
    $abstand_std = 10

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

    ; Wie groß die Tabelle wird
    $anz_spalten = 12
    $anz_ebenen = 50
    dim $knopf_db[$anz_ebenen][4]
    dim $text_db[$anz_ebenen][$anz_spalten]

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

    ; Spalten Überschriften
    dim $text_erste[$anz_spalten] = ["Lfd.", "Name", "Container", "Codec", "Gesehen", "Genre", "Punkte1", "Punkte2", "Filmstarts", "IMDB", "starten", "mehr"]
    $text_erste_y = $abstand_oben-12 ; Abstand für die erste Zeile

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

    ; Blind-Text generieren
    for $ebene = 0 to $anz_ebenen-1
    for $n=0 to 11
    $text_db[$ebene][$n] = "#"&$ebene+1&"/"&$n+1
    next

    ; Beschriftungen der Knöpfe
    crys_array_add_zeile("Filmstarts|IMDB|starten|mehr", $text_db, $ebene, 8)
    next
    ;_ArrayDisplay($text_db)

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

    ; Wo welche Ebene beginnt
    dim $m_ebene[4]
    $m_ebene[0] = $abstand_std
    $m_ebene[1] = $abstand_std
    $m_ebene[2] = $gui_db_x-2*$abstand_std-16
    $m_ebene[3] = 21

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

    ; Positionen und Größen der einzelnen Zellen
    dim $m_text[$anz_spalten][4]
    crys_array_add_spalte("30|319|50|50|45|30|45|45|60|50|60|50", $m_text, 0, 2) ; Belibige x-Größen
    for $n=0 to 11
    if $n=0 then
    $m_text[0][0] = 0 ; x-Abstand
    $m_text[$n][1] = $abstand_std ; y-Abstand
    else
    $m_text[$n][0] = $m_text[$n-1][0]+$m_text[$n-1][2]+$abstand_std
    $m_text[$n][1] = $m_text[$n-1][1]
    endif

    ;$m_text[$n][2] = 10 ; x-Größe
    $m_text[$n][3] = 17 ; y-Größe
    next
    crys_array_add_spalte("0|0|0|0", $m_text, 8, 1) ; Knöpfe weiter oben beginnen
    crys_array_add_spalte($m_ebene[3]&"|"&$m_ebene[3]&"|"&$m_ebene[3]&"|"&$m_ebene[3], $m_text, 8, 3) ; Höhere Knöpfe
    ;_ArrayDisplay($m_text)

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

    ; Kleiner Test ob das Layout ausgenutzt ist
    if $m_text[11][0]+$m_text[11][2] <> $m_ebene[2] and $debug = 2 then
    MsgBox(0, "", "Rest: " & $m_text[11][0]+$m_text[11][2]-$m_ebene[2] & "px")
    endif

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

    ; GUI starten
    $gui_db = GUICreate($titel, $gui_db_x, $gui_db_y, -1, -1)
    GUISetFont($gui_schrift_groesse, $gui_schrift_breite, -1, $gui_schrift_art)

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

    ; Hauptüberschrift
    GUICtrlCreateLabel("Bibliotheca", 200, 10, 505, $abstand_titel-10, $SS_CENTER)
    GUICtrlSetFont(-1, 20, 800, 0, "MS Sans Serif")
    ;GUISetBkColor(0xc0d8f1)

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

    ; Spalten Überschriften ausgeben
    for $n=0 to 11
    GUICtrlCreateLabel($text_erste[$n], $abstand_std+$m_text[$n][0], $text_erste_y, $m_text[$n][2], $m_text[$n][3])
    next

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

    ; Scroll-GUI starten
    $gui_db_scroll = GUICreate("", $gui_db_x, $gui_db_y-$abstand_oben-$abstand_unten, 0, $abstand_oben, BitOR($WS_POPUP, $WS_GROUP, $WS_VSCROLL, $WS_CLIPSIBLINGS), $WS_EX_MDICHILD, $gui_db)
    ;GUISetBkColor(0xc0d8f1)

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

    ; Ebene für Ebene ausgeben
    For $ebene = 0 To $anz_ebenen-1
    $scroll = ($m_ebene[1]+($m_ebene[3]+$m_ebene[1])*($ebene+1))/16
    If $scroll > 32780 or $ebene >= 500 Then ; Die Labels werden nur auf einer Länge von ca.32780px erstellt
    MsgBox(0, "Fehler, Ebene #" & $ebene, "Die Scollbar ist zu lang!")
    ExitLoop
    EndIf

    ; Schrift ausgeben
    for $n=0 to 7
    if $n=0 then
    $inhalt = "#" & $ebene+1 ; Lfd.-Nr.
    else
    $inhalt = $text_db[$ebene][$n-1]
    endif
    GUICtrlCreateLabel($inhalt, $m_ebene[0]+$m_text[$n][0], $m_ebene[1]+($m_ebene[3]+$m_ebene[1])*$ebene+$m_text[$n][1], $m_text[$n][2], $m_text[$n][3])
    next

    ; Knöpfe ausgeben
    for $n=8 to 11
    $inhalt = $text_db[$ebene][$n]
    $knopf_db[$ebene][0] = GUICtrlCreateButton($inhalt, $m_ebene[0]+$m_text[$n][0], $m_ebene[1]+($m_ebene[3]+$m_ebene[1])*$ebene+$m_text[$n][1], $m_text[$n][2], $m_text[$n][3])
    ;GUICtrlSetBkColor(-1, 0x99b9e3)
    next
    Next

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

    ; Scroll-Leiste initialisieren
    crys_scroll()
    _GUIScrollBars_Init($gui_db_scroll, -1, $scroll) ; Scrollbars werden im Fenster initialisiert|
    _GUIScrollBars_ShowScrollBar($gui_db_scroll, $SB_HORZ, False) ; Horizontale Scrollbar wird deaktiviert
    ;Scrollbar_Create($gui_db_scroll, $SB_VERT, $scroll)
    ;Scrollbar_Step(20, $Group1, $SB_VERT)

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

    ; Auf Haupt-GUI wechseln
    GUISwitch($gui_db)

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

    if $debug = 2 then
    GUISetState(@SW_SHOW, $gui_db)
    GUISetState(@SW_SHOW, $gui_db_scroll)

    while 1
    if GUIGetMsg() = $GUI_EVENT_CLOSE then exit
    wend
    exit
    endif

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

    ; ### ENDE ###

    [/autoit]

    Danke für eure Hilfe :thumbup:

  • Zeile in 2D Array schreiben

    • Crys
    • 6. April 2012 um 14:08
    Zitat von AspirinJunkie

    Schreib doch mal für welchen konkreten Anwendungsfall du das benötigtest. Vielleicht ist es ja gar nicht nötig alles direkt in den quelltext zu schreiben.

    In meinem konkreten Fall geht es um Positionen von Labels und Buttons:

    Spoiler anzeigen
    [autoit]

    #include-once

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

    ; Allegemein GUI Variablen
    $gui_schrift_groesse = -1; 10
    $gui_schrift_breite = -1 ;400
    $gui_schrift_art = -1 ;"Calibri"

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

    $gui_db_x = 980
    $gui_db_y = 570
    $abstand_titel = 40
    $abstand_oben = 50

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

    $anz_ebenen = 50
    dim $knopf_db[$anz_ebenen][4]

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

    ; Blind-Text für den Inhalt
    dim $text[$anz_ebenen][7] = [["Name", "Container", "Codec", "Gesehen", "Genre", "Punkte1", "Punkte2"]]

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

    $abstand_std = 10

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

    $ebene_x = $abstand_std
    $ebene_y = $abstand_std
    $ebene_gx = $gui_db_x-2*$abstand_std-16
    $ebene_gy = 21

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

    $text_x = 0
    $text_y = ($ebene_gy-17)
    $text_gx = 30
    $text_gy = 17

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

    $text2_x = $text_x+$text_gx+$abstand_std
    $text2_y = $text_y
    $text2_gx = 200+119
    $text2_gy = 17

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

    $text3_x = $text2_x+$text2_gx+$abstand_std
    $text3_y = $text_y
    $text3_gx = 50
    $text3_gy = 17

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

    $text4_x = $text3_x+$text3_gx+$abstand_std
    $text4_y = $text_y
    $text4_gx = 50
    $text4_gy = 17

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

    $text5_x = $text4_x+$text4_gx+$abstand_std
    $text5_y = $text_y
    $text5_gx = 45
    $text5_gy = 17

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

    $text6_x = $text5_x+$text5_gx+$abstand_std
    $text6_y = $text_y
    $text6_gx = 30
    $text6_gy = 17

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

    $text7_x = $text6_x+$text6_gx+$abstand_std
    $text7_y = $text_y
    $text7_gx = 45
    $text7_gy = 17

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

    $text8_x = $text7_x+$text7_gx+$abstand_std
    $text8_y = $text_y
    $text8_gx = 45
    $text8_gy = 17

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

    $button_x = $text8_x+$text8_gx+$abstand_std
    $button_y = 0
    $button_gx = 60
    $button_gy = $ebene_gy

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

    $button2_x = $button_x+$button_gx+$abstand_std
    $button2_y = 0
    $button2_gx = 50
    $button2_gy = $ebene_gy

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

    $button3_x = $button2_x+$button2_gx+$abstand_std
    $button3_y = 0
    $button3_gx = 60
    $button3_gy = $ebene_gy

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

    $button4_x = $button3_x+$button3_gx+$abstand_std
    $button4_y = 0
    $button4_gx = 50
    $button4_gy = $ebene_gy

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

    if $button4_x+$button4_gx <> $ebene_gx and $debug = 2 then
    MsgBox(0, "", "Rest: " & $button4_x+$button4_gx-$ebene_gx & "px")
    endif

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

    $gui_db = GUICreate($titel, $gui_db_x, $gui_db_y, -1, -1)
    GUISetFont($gui_schrift_groesse, $gui_schrift_breite, -1, $gui_schrift_art)

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

    GUICtrlCreateLabel("Bibliotheca", 200, 10, 505, $abstand_titel-10, $SS_CENTER)
    GUICtrlSetFont(-1, 20, 800, 0, "MS Sans Serif")
    ;GUISetBkColor(0xc0d8f1)

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

    For $ebene = 0 To $anz_ebenen-1
    $scroll = ($abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*($ebene+1))/16.5
    If $scroll > 32780 or $ebene >= 500 Then ; Die Labels werden nur auf einer Länge von ca.32780px erstellt
    MsgBox(0, "Fehler, Ebene #" & $ebene, "Die Scollbar ist zu lang!")
    ExitLoop
    EndIf

    GUICtrlCreateLabel("#" & $ebene+1, $ebene_x+$text_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text_y, $text_gx, $text_gy)
    GUICtrlCreateLabel($text[$ebene][0], $ebene_x+$text2_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text2_y, $text2_gx, $text2_gy)
    GUICtrlCreateLabel($text[$ebene][1], $ebene_x+$text3_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text3_y, $text3_gx, $text3_gy)
    GUICtrlCreateLabel($text[$ebene][2], $ebene_x+$text4_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text4_y, $text4_gx, $text4_gy)
    GUICtrlCreateLabel($text[$ebene][3], $ebene_x+$text5_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text5_y, $text5_gx, $text5_gy)
    GUICtrlCreateLabel($text[$ebene][4], $ebene_x+$text6_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text6_y, $text6_gx, $text6_gy)
    GUICtrlCreateLabel($text[$ebene][5], $ebene_x+$text7_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text7_y, $text7_gx, $text7_gy)
    GUICtrlCreateLabel($text[$ebene][6], $ebene_x+$text8_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$text8_y, $text8_gx, $text8_gy)

    $knopf_db[$ebene][0] = GUICtrlCreateButton("Filmstarts", $ebene_x+$button_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$button_y, $button_gx, $button_gy)
    ;GUICtrlSetBkColor(-1, 0x99b9e3)
    $knopf_db[$ebene][1] = GUICtrlCreateButton("IMDB", $ebene_x+$button2_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$button2_y, $button2_gx, $button2_gy)
    ;GUICtrlSetBkColor(-1, 0x99b9e3)
    $knopf_db[$ebene][2] = GUICtrlCreateButton("starten", $ebene_x+$button3_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$button3_y, $button3_gx, $button3_gy)
    ;GUICtrlSetBkColor(-1, 0x99b9e3)
    $knopf_db[$ebene][3] = GUICtrlCreateButton("mehr", $ebene_x+$button4_x, $abstand_oben+$ebene_y+($ebene_gy+$ebene_y)*$ebene+$button4_y, $button4_gx, $button4_gy)
    ;GUICtrlSetBkColor(-1, 0x99b9e3)
    Next

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

    ; Scroll-Leiste initialisieren
    crys_scroll()

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

    _GUIScrollBars_Init($gui_db, -1, $scroll) ; Scrollbars werden im Fenster initialisiert|
    ;Länge horizontal = 0 |Länge vertikal = ($abstand_oben + ($ebene * 50)) / 16 => Abhängig von der Anzahl der Labels
    ;_GUIScrollBars_ShowScrollBar($gui_db, $SB_HORZ, False) ; Horizontale Scrollbar wird deaktiviert

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

    if $debug = 2 then
    GUISetState(@SW_SHOW, $gui_db)

    while 1
    if GUIGetMsg() = $GUI_EVENT_CLOSE then exit
    wend
    exit
    endif

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

    ; ### ENDE ###

    [/autoit]

    Zeile 26 bis 84 und Zeile 104 bis 120 kann man schon zusammen fassen, wenn die Daten nicht in je einem String gespeichert werden, sondern in einem Array!

    Zitat von UEZ

    Meinst du vielleicht so was? -> http://autoitscript.com/forum/topic/12…528#entry896528

    Weiß ich nicht, verstehe nicht ganz, was das in meinem Fall bringt ...

  • Zeile in 2D Array schreiben

    • Crys
    • 6. April 2012 um 12:11

    @ BugFix:
    Auf die Idee bin ich auch schon gekommen ... hier mal mein delux Fkt. ;)

    [autoit]

    dim $foobar[2][2]
    _Array2D_Inset("Spalte0|Spalte1|Spalte2", $foobar, 5)
    _Array2D_Inset("Spalte0|Spalte1|Spalte2", $foobar, 3, 1)

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

    ; Zeile zu Array hinzufügen
    Func _Array2D_Inset($string, byref $array, $zeile = 0, $spalte = 0, $trenner = "|")
    $temp = StringSplit($string, $trenner) ; String teilen

    ; Testen ob Anzahl der Zeilen ok
    if $zeile+1 > UBound($array, 1) then
    redim $array[$zeile+1][UBound($array, 2)]
    endif

    ; Testen ob Anzahl der Spalten ok
    if $temp[0]+$spalte > UBound($array, 2) then
    redim $array[UBound($array, 1)][$temp[0]+$spalte]
    endif

    ; Zellen in Array schreiben
    for $x=0 to $temp[0]-1
    $array[$zeile][$x+$spalte] = $temp[$x+1]
    next
    EndFunc

    [/autoit]
  • Zeile in 2D Array schreiben

    • Crys
    • 6. April 2012 um 00:54

    Danke, aber das habe ich schon gewusste ;)

    Zitat von AspirinJunkie

    Sonst geht es nur so wie du es schon geschrieben hast.

    Schade, dann überlege ich mir morgen mal eine andere Möglichkeit, wie ich das geschickt hingekommen kann.
    Weil ich habe gerade ein Skript, in dem ich Arrays immer mit kompletten Zeilen bearbeite und brauche dafür gefühlte Tausend Zeilen ...

    Jetzt aber erst mal 19h-Tag beenden :sleeping:

  • Zeile in 2D Array schreiben

    • Crys
    • 6. April 2012 um 00:19

    Das Beispiel ist in meinem ersten Post!

    Zitat von xXxProGamerxXx

    Meinste so?

    [autoit]

    $foobar[5][0] = "Deine ganze Zeile"

    [/autoit]

    Nein! Das ist Blödsinn ...
    So schreibe ich nur in der 5ten Spalte/0te Zeile in eine einzige Zelle etwas!
    Ich möchte aber eine Zeile auf einmal beschreiben!

    Mit folgender definition kann man bekanntlich die erste Zeile beschreiben, alle drei Zellen in der ersten Zeile:

    [autoit]

    dim $foobar[10][3] = [["Spalte1", "Spalte2", "Spalte3"]]

    [/autoit]

    Das System möchte ich auf andere Zeilen in einem Array übertragen ...

    Wie kann ich aber z.B. die 5te Zeile auf einmal beschreiben?
    Sodass in der 5ten Spalte die Zelle1, Zelle2 und Zelle3 beschrieben werden?
    So geht das nicht:

    [autoit]

    $foobar[5][0] = ["Spalte1", "Spalte2", "Spalte3"]

    [/autoit]


    Ich möchte also mehrere Zellen auf einmal schreiben, das hier abkürzen:

    [autoit]

    $foobar[5][0] = "Spalte0"
    $foobar[5][1] = "Spalte1"
    $foobar[5][2] = "Spalte2"

    [/autoit]


    Das soll alles in eine Quellcode-Zeile abgewickelt werden!

  • Zeile in 2D Array schreiben

    • Crys
    • 5. April 2012 um 22:10

    Es klingt so einfach, aber ich bekomme es nicht hin ... ich möchte eine (komplette) Zeile in einem 2D-Array an einem Stück schreiben.

    [autoit]

    ; etwas in die 0te-Zeile schreiben ist einfach
    dim $foobar[10][3] = [["Spalte1", "Spalte2", "Spalte3"]]

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

    ; etwas in die 5te Zeile schreiben wäre toll
    $foobar[5][0] = ["Spalte1", "Spalte2", "Spalte3"]
    ; geht aber nicht

    [/autoit]

    Geht so etwas überhaupt in AutoIt?

  • Schreiben bei Tastendrück verhindern

    • Crys
    • 3. April 2012 um 13:30

    Vielen Danke euch allen, das Thema ist gelöst! :thumbup:

  • Aktive Tasks auflisten

    • Crys
    • 3. April 2012 um 13:27

    Die Fkt. _GetPathByPid() gibt bei allen relevanten Prozessen (Start, Sidebar, Explorer, ...) immer @error=1 aus!
    Ich kann aber nicht sagen wieso ...
    Bei allen anderen Prozessen (FF, iTunes, ...) gibt die Fkt. _GetPathByPid() einen leeren String aus.

    Auch soll natürlich nicht alles, was vom explorer.exe Prozess kommt ignoriert werden, da die Ordner Fenster in die Liste gehören ;)

    Aber der Ansatz ist gut, ich weiß aber nicht wie ich das zum laufen bekommen könnte ...

  • Schreiben bei Tastendrück verhindern

    • Crys
    • 3. April 2012 um 00:12

    Danke, genau ich habe es mit _IsPressed() gemacht.

    Hotkey() ist die Lösung ... hab ich irgendwie übersehen :rolleyes:

    Schade das man keine Parameter der Fkt. übergeben kann ... weil ich habe unterschiedlich viele Hotkeys, die der Benutzer selbst festlegen kann, die immer die selbe Fkt. starten sollen, aber mit einem anderen Parameter ... hm ...

  • Aktive Tasks auflisten

    • Crys
    • 2. April 2012 um 23:47
    Zitat von xXxProGamerxXx

    geht das?^^

    Nein, genügt nicht!
    Ich habe schon ne Fkt. geschrieben, die mir viel mehr aus gibt: crys_cmini_info()

    Ich möchte aber nur die gelb hervorgehobenen Namen haben, die anderen sind u.A. Win7-Gadgets, die nicht in der Liste auftauen sollten:
    [Blockierte Grafik: http://saved.im/mtg2mjk3bglq_vs/winstate.png]
    Nach den Namen kann ich die nicht aussortieren, dafür gibt es einfach unzählig viele ...

  • Schreiben bei Tastendrück verhindern

    • Crys
    • 2. April 2012 um 19:18

    Ich habe ein Programm geschrieben, das mit einer Tasten Kombination aktiviert wird. Als Beispiel Win + S.
    Wenn ich jetzt aber in einem Textfeld bin und die Tastenkombination drücke, dann wird ein "S" geschrieben und dann die Funktion ausgeführt!

    Wie kann ich es verhindern, dass ein Buchstabe geschrieben wird, wenn ich eine Tastenkombination für ein Programm ausführe?

  • Aktive Tasks auflisten

    • Crys
    • 2. April 2012 um 19:14

    Damit arbeite ich auch schon, aber das ist nicht das, was ich will!
    Winlist() gibt bei mir im Schnitt 160 Zeilen aus, das sind in meinem Fall 154 zu viel!
    Bis ich da alles unnütze heraus gefilterter habe ... und Programme wie die Win7-Gatgets kann ich nicht bestimmen ... die werden im TaskMan unter Anwendungen aber auch nicht aufgelistet ... genau so möchte ich es auch haben!

  • Aktive Tasks auflisten

    • Crys
    • 2. April 2012 um 18:43

    Gibt es eine Möglichkeit, dass ich die Namen aller gerade aktiven Tasks an Autoit übermitteln kann?

    Damit meine ich nicht die aktiven Prozesse, sondern die aktiven Anwendungen!

    Wie die 6 Programm auf diesen Bild:
    [Blockierte Grafik: http://saved.im/mtg2mtkydhlx_vs/aktive_tasks.png]

  • cPing - WHS Ruhezustand durch letztes Netzwerkgerät

    • Crys
    • 2. April 2012 um 17:20
    Zitat von FuzzyWutz

    - Windowstaskplaner/Aufgabenplaner (Crontab) das Programm erst um 22Uhr starten

    Könnte ich machen, nur ...
    ... ist es um umständlicher den Task über "Geplante Tasks" hinzufügen/ändern. Kann man mit AutoIt direkt dort einen Task hinzufügen/ändern?
    ... wenn der WHS um 22Uhr nicht an ist passiert nichts, weil der Task nicht startet (schon getestet)!
    ... ich möchte mit meinem Programm dokumentieren, wann der WHS startet und herunterfährt. Wenn ich das über "Geplante Tasks" starten lasse brauche ich noch ein extra Programm, dass da dokumentiert, dass dann aber auch immer laufen muss.

    Zitat von FuzzyWutz

    - Die IP-Adressen aus dem ARP-Cache auslesen (wenns dein Server ist, werden sich alle Rechner eh einmal bei diesem melden)

    Das ist nicht direkt ein Server, er läuft wie jeder andere PC in meinem Netzwerk ... ist kein DHCP-Server ist sonst was, nur ein Datengrab.
    Was mache ich mit IP-Adresse dann?
    Ich möchte ja nicht alle Geräte im Netzwerk überwachen, sondern nur ein paar. Bei mit konkret der PC und die MediaStation. Ob der PC von meiner Mutter an ist, ist irrelevant ;)
    Deshalb soll er nur eine selbst definierbare Liste von Clientnamen oder IP-Adresse abfragen.

    Zitat von FuzzyWutz

    - Im Programm alle 60 Sek per AdLib einen "Interrupt" ausführen= minimalste CPU-Last

    Was meinst du damit?
    Kann damit gerade gar nichts anfangen.

  • cPing - WHS Ruhezustand durch letztes Netzwerkgerät

    • Crys
    • 30. März 2012 um 19:46

    Ich hab mir ein kleines Skript geschrieben, mit dem ich meinen WHS (Windows Home Server) in den Ruhezustand versetzten kann, wenn alle Netzwerkgeräte ausgeschaltet sind!

    Funktion:
    - WHS fährt jede Früh automatisch aus dem Ruhezustand hoch
    - mein Programm läuft im Hintergrund
    - wenn eine Gewisse Zeit überschritten wird (22Uhr), vor der es gar nichts macht
    - es testet ob schon ein Netzwerkgerät erreichbar ist (mittels Ping()), damit es nicht herunterfahrt, weil es meint, dass alle Geräte schon aus sind (obwohl noch keine gestartet sind)
    - wenn min. ein Gerät anpingbar ist, pingt es weiter und testet so lange bis keine Geräte mehr erreichbar sind
    - falls das der Fall ist, gibt es eine MsgBox aus in der man noch 30s verhindern kann, dass der WHS in den Ruhezustand fährt
    - dann wieder holt sich alles von Vorne

    Programmablaufplan

    [Blockierte Grafik: http://saved.im/mtg3mdc5cwpq/cping.png]

    Quellcode

    ### Pastebin Link ###

    [autoit]

    ; Include Dateien
    #include-once
    #include <Array.au3>

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

    ; TrayIcon
    ;#NoTrayIcon ; TryIcon ausblenden
    Opt("TrayAutoPause", 0) ; Keine Pause, bei Klick
    Opt("TrayIconDebug", 1) ; zeige Debug

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

    ; Variablen
    $zeit_ping = 60 * 1000 ; Abstände der Pings | in ms
    $zeit_aus = 30 ; Wann der WHS dann herunterfährt, nach dem letzten Ping | in s
    $zeit_start = 5 * 60* 1000 ; Wie lange das Programm, nach dem herunterfahren wartet, bis es das erste mal pingt | in ms
    $zeit_uhrzeit = 22 ; Früheste Zeit zum herunterfahren | in h

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

    dim $ping[2]
    dim $host[UBound($ping)]
    $host[0] = "client1"
    $host[1] = "192.168.1.123"

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

    While 1
    ; Warten bis Uhrzeit erreicht ist
    While 1
    if @HOUR >= $zeit_uhrzeit then exitloop
    sleep($zeit_ping)
    Wend
    ;MsgBox(0, "", "Min. ein Gerät ist an!", 3)

    ; Warten bis min. ein Gerät gestartet ist
    While 1
    for $n=0 to UBound($host)-1
    $ping[$n] = Ping($host[$n], 4000)
    ;$error = @error
    ;MsgBox(0, "Test:", $host[$n])
    next

    if _ArrayToString($ping, '') <> 0 then exitloop
    sleep($zeit_ping)
    Wend
    ;MsgBox(0, "", "Min. ein Gerät ist an!", 3)

    ; Warten, bis alle Geräte ausgeschalten sind
    While 1
    for $n=0 to UBound($host)-1
    $ping[$n] = Ping($host[$n], 4000)
    ;$error = @error
    ;MsgBox(0, "Test:", $host[$n])
    next

    if _ArrayToString($ping, '') = 0 then exitloop
    sleep($zeit_ping)
    Wend
    ;MsgBox(0, "", "Alle Geräte sind aus!", 3)

    ; WHS wird in den Ruhezustand versetzt
    $msg = MsgBox(4, "", "Alle Geräte sind aus, der WHS wird in den Ruhezustand versetzt!", $zeit_aus)
    if $msg <> 7 then
    Shutdown(64, "Durch cPing!") ; Ruhezustand
    ;MsgBox(0, "", "WHS ist jetzt aus!", 10)
    endif
    sleep($zeit_start)
    Wend

    [/autoit]

    Das mit der ini-Abfrage und die Start-GUI sind noch nicht fertig, der Rest funktioniert mit den festen Werten!

    Das mit den vielen sleeps gefällt mir nicht so ganz, dass kann man doch sicher besser machen?
    Das der zumindest bei der Uhrzeit-Abfrage so lange wartet, bis die Zeit erreicht ist ... ohne sleep und while-Schlife!?
    Aber die System-Auslastung ist eh bisher minimal ...

    Ich würde auch gerne noch einbauen, dass man damit die Uhrzeit einstellen kann, wann der WHS wieder hochfährt.
    Bisher mache ich das über ein extra Programm ...

    Was kann ich noch verbessern?

  • Hintergrundfarbe von GroupBox ändern

    • Crys
    • 7. Dezember 2011 um 22:19

    Wie ich ne GUI einbinde, dann die genau die gewünschte Form hat bekomm ich nicht hin.
    Es sollte ja abgerundete Ecken haben und den Titel der GroupBox auch umfassen ...


    Wieso ich wegen der Leistung der GUI gefragt habe:
    Ich habe in meinem Programm eine ChildGUI, zum scrollen des Inhalts. Wenn ich das Programm öffne, dann erscheint zuerst das Programm und ne ms später die ChildGUI. Wieso geht das nicht gleichzeitig?
    Wenn ich das Programm minimiert habe und wieder her hole, dann taucht zuerst die ChildGUI auf und dann kommt die MainGUI erst Win7 & Vista aus, also von der Taskleiste klein nach oben groß. Wenn ich das minimiere umgekehrt, dann verschwindet zuerst die ChildGUI, ...

    Das sieht gekürzt so aus:

    [autoit]

    $Form1 = GUICreate($titel, $breite_gui, $hoehe_gui, -1, -1)
    ; ...
    $Group1 = GUICreate("", $breite_gruppe1, $hoehe_gruppe1, $abstand, $y_gruppe1, BitOR($WS_POPUP, $WS_GROUP, $WS_VSCROLL, $WS_CLIPSIBLINGS), $WS_EX_MDICHILD, $Form1) ; Scoll-GUI
    ; ...
    GUISetState(@SW_SHOW, $Form1)
    GUISetState(@SW_SHOW, $Group1)

    [/autoit]
  • Hintergrundfarbe von GroupBox ändern

    • Crys
    • 25. November 2011 um 20:33

    K4z:
    Hab die Workarounds getestet, das mit dem Button ist noch am besten, aber auch nicht klasse.
    Die Ränder sind zwar ok, aber der Titel der Gruppe hat dennoch eine andere Farbe als Hintergrund ...

    @Bert:
    Wie meinst du das?
    Wir das Skript dadurch nicht bedeutend langsamer, wenn ich das so mache?
    Müsste auf die Weiße bis zu 100 Gruppen als GUI umwandeln ...

  • Hintergrundfarbe von GroupBox ändern

    • Crys
    • 25. November 2011 um 14:37

    Ich möchte die Hintergrund Farbe einer GroupBox ändern, scheitere aber daran.

    Wenn ich das z.B. mache:

    [autoit]

    GUICtrlCreateGroup("Test Gruppe", 0, 0, 100, 100)
    GUICtrlSetBkColor(-1, 0x00ff00)

    [/autoit]


    ... dann wird nur der Schriftzug "Test Gruppe" grün Hinterlegt und nicht der gesamte Gruppenhintergrund, wie ich es möchte!

    Eine Grafik hinter die Gruppe zu legen, die dann die gewünschte Hintergrundfarbe hat geht auch nicht, weil die Gruppe abgerundete Ecken hat und ich keine Möglichkeit gefunden habe, das auf die Grafik zu übertragen!

    Wäre cool, wenn mir jemand weiterhelfen kann! :thumbup:

    Getestet hab ich das auf einem WinXP und Win7 x86 Rechner, je mit AutoIt 3.3.6.1

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™