FileDelete möchte ein Icon nicht löschen

  • Problem gelöst!
    Gesucht war:

    [autoit]

    _GDIPlus_ImageDispose($hGUIHeaderIcon)

    [/autoit]

    Genauer Lösungsweg in Post #5.

    Danke an Make-Grafik

    Thread auf gelöst gesetzt.

    ###############################################################################################
    Guten Tag allerseits.

    Ich hätte da mal ein kleines Problem, wo ich nicht weiter weiß.
    Und zwar:

    Problem:
    Ich habe ein eigenes kleines GUI.
    In diesem GUI sind 4 Grafiken eingebunden.
    3x .png
    1x .ico
    Die 3 Grafiken löscht er.
    Das Icon will er nicht löschen.
    Die 4 Grafiken werden mit FileInstall in den @TempDir geschrieben.
    Als Beispiel:

    [autoit]

    FileInstall("img/Icon16px.ico", @TempDir & "/PMGEICO.ico", 1)

    [/autoit]

    Denn am Ende des Scriptes wird eine Funktion aufgerufen um die Grafiken zu löschen und das Script zu Beenden.

    [autoit]


    Func _PMClose() ; Beim Aufruf wird das Programm beendet
    _WinAPI_DeleteObject($hGUIStartButtonBmpNew)
    _WinAPI_DeleteObject($hGUITesttypButtonBmpNew)
    _WinAPI_DeleteObject($hGUIZielendpunktButtonBmp)
    GUIDelete($hGUIDisplay) ; Lösche das GUI
    _ProgressDelete($hGUIProgressBar) ; MUST BE DONE ON EXIT
    _Progress_CallBack_Free(1) ; Force Killing Timer
    _GDIPlus_Shutdown()

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

    $temp = 1
    While FileExists(@TempDir & "\PMNETCOR*.png") = True And $temp < 10
    $temp += $temp
    ;~ FileDelete(@TempDir & "\PMGEICO.png") ; Funktioniert zurzeit nicht
    FileDelete(@TempDir & "\PMNstart.png")
    FileDelete(@TempDir & "\PMNtesttyp.png")
    FileDelete(@TempDir & "\PMNzielendpunkt.png")
    FileDelete(@TempDir & "\PMGEICO.ico") ; Funktioniert zurzeit nicht
    WEnd
    Exit
    EndFunc ;==>_PMClose

    [/autoit]

    Die 4 Grafiken werden nur angezeigt.
    Die 3 .png als Button und das Icon als Icon.

    [autoit]


    $hGUIDisplay = GUICreate($sGUITitle, $iGUIWidth, $iGUIHeight, -1, -1, $WS_POPUP)

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

    [...]

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

    GUICtrlCreateLabel("", $iGUIBorderWidth, $iGUIBorderWidth, 17, 17, 0, 0x100000)
    $hGUIHeaderIcon = _GDIPlus_ImageLoadFromFile(@TempDir & "/PMGEICO.ico")
    $hGUIHeaderIconNew = _GDIPlus_GraphicsCreateFromHWND($hGUIDisplay)
    GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")

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

    [...]

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

    Func MY_WM_PAINT($hWnd, $msg, $wParam, $lParam) ; Draw PNG image
    _WinAPI_RedrawWindow($hGUIDisplay, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImage($hGUIHeaderIconNew, $hGUIHeaderIcon, 3, 3)
    _WinAPI_RedrawWindow($hGUIDisplay, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>MY_WM_PAINT

    [/autoit]

    Folgender Code ist für die 3 Buttuns.

    [autoit]


    ; Start Button
    $hGUIStartButton = GUICtrlCreateButton("Start", 10, 96, 32, 32, $BS_BITMAP)
    $hGUIStartButtonBmp = _GDIPlus_BitmapCreateFromFile(@TempDir & "/PMNstart.png")
    If @OSBuild < 6000 Then
    $hGUIStartButtonBmpNew = ConvertBitmap($hGUIStartButtonBmp)
    Else
    $hGUIStartButtonBmpNew = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hGUIStartButtonBmp)
    EndIf
    _GDIPlus_BitmapDispose($hGUIStartButtonBmp)
    _WinAPI_DeleteObject(GUICtrlSendMsg($hGUIStartButton, $BM_SETIMAGE, $IMAGE_BITMAP, $hGUIStartButtonBmpNew))

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

    [...]

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

    Func ConvertBitmap($hBitmap) ; Workaround für WinXP
    Local $iButtonColor = _WinAPI_GetSysColor($COLOR_BTNFACE)
    $iButtonColor = 0x10000 * BitAND($iButtonColor, 0xFF) + BitShift($iButtonColor, 16) + BitAND($iButtonColor, 0x00FF00)
    Local $iWidth = _GDIPlus_ImageGetWidth($hBitmap), $iHeight = _GDIPlus_ImageGetHeight($hBitmap)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
    Local $hBitmap_New = $aResult[6]
    Local $hCtx_new = _GDIPlus_ImageGetGraphicsContext($hBitmap_New)
    Local $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $iButtonColor)
    _GDIPlus_GraphicsFillRect($hCtx_new, 0, 0, $iWidth, $iHeight, $hBrush)
    _GDIPlus_GraphicsDrawImageRect($hCtx_new, $hBitmap, 0, 0, $iWidth, $iHeight)
    Local $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_New)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_BitmapDispose($hBitmap_New)
    _GDIPlus_GraphicsDispose($hCtx_new)
    Return $hHBitmap
    EndFunc ;==>ConvertBitmap

    [/autoit]

    Gescheiterte Lösungsversuche:

    • Anderes Dateiformat
    • Paar andere Sachen, welche ich gerade nicht mehr im Kopf hab...
    • Sicherstellen, dass icon eine Datei ist:
    [autoit]


    ConsolWrite(FileGetAttrib(@TempDir & "\PMGEICO.ico") & @CRLF)
    -> A

    [/autoit]

    Mal gucken, vielleicht kann mir einer von euch sagen, wo ich einen Fehler eingebaut habe.

    Mit freundlichen Grüßen

    Einmal editiert, zuletzt von lachi (22. November 2012 um 14:31) aus folgendem Grund: 20121122_14-30: Rätsel ist zu ende.

  • Mal gucken, vielleicht kann mir einer von euch sagen, wo ich einen Fehler eingebaut habe.


    Wenn du ein ansonsten lauffähigesSkript einstellst sicherlich.So verweise ich auf:

    Zitat von aus Hilfe zu FileDelete

    Einige Dateiattribute können ein Löschen unmöglich machen.

    mfg autoBert

  • Moin AutoBert,

    für Euch lauffähig wäre dies Script nur mit größerem Aufwand, dass ist das Problem...
    Sonst gäbe es schon ein lauffähiges Script.

    Das was ich angefügt habe, sind schon die Codeteile, welche was mit den Grafiken zu tun haben.
    Na denn setz ich mich mal dran und zwacke was ab von der aktuellen Version.

    So: Hier habt ihr denn einmal ein Zip mit:
    Angepasster Version von dem Programm.
    au3
    exe
    Grafiken
    Benötigte Zusatz Include
    autoit.de/wcf/attachment/16682/

  • Moinsens,
    also ich konnte das Problem schonmal eingrenzen.
    Es liegt entweder an:

    [autoit]


    _GDIPlus_ImageLoadFromFile()
    ; oder
    _GDIPlus_GraphicsCreateFromHWND()

    [/autoit]

    Bei _GDIPlus_GraphicsCreateFromHWND() steht ja in der Hilfe:


    Bemerkungen
    Wenn man mit dem Grafik-Objekt fertig ist, ist _GDIPlus_GraphicsDispose aufzurufen, um die Ressourcen wieder freizugeben

    [autoit]

    _GDIPlus_GraphicsDispose()

    [/autoit]


    Habe ich probiert, aber leider ohne Resultat...
    Mal weiter gucken.
    Vielleicht ließt das ja auch einer, der mehr Ahnung von GDI+ hat und der kann mir denn weiter helfen.
    Wenn nicht, denn halt nicht ;)

    Einmal editiert, zuletzt von lachi (22. November 2012 um 11:30) aus folgendem Grund: 20121122_11-30: Noch was angefügt

  • Das ist sehr komisch x.x Ich muss mir mal dein Script genauer unter die Lupe nehmen :)


    Das .ico wird ja mit FileDelete(@TempDir & "\PMNETCORGE2EICO.ico") gelöscht. Kann man auch selber sehen wenn man die Funktion in ein eigenes Script hinein schreibt. Warum das allerdings nicht in deinem geht, muss ich erst herausfinden.


    Hehe :D Das liegt daran, weil du dein Bild-Objekt nicht freigegeben hast :P

    Zeile 205:

    [autoit]

    $hGUIHeaderIcon = _GDIPlus_ImageLoadFromFile(@TempDir & "/PMNETCORGE2EICO.ico")

    [/autoit]

    Diese musst du mit _GDIPlus_ImageDispose wieder freigeben :D

    Also: (Zeile 532 | _PMClose)
    In dieser Funktion musst du das ganze Freigeben :)

    [autoit]

    Func _PMClose() ; Beim Aufruf wird das Programm beendet
    AdlibUnRegister("_checkGUIMeldungchange")
    AdlibUnRegister("_checkGUIClose")
    _WinAPI_DeleteObject($hGUIStartButtonBmpNew)
    _WinAPI_DeleteObject($hGUITesttypButtonBmpNew)
    _WinAPI_DeleteObject($hGUIZielendpunktButtonBmp)
    _GDIPlus_ImageDispose($hGUIHeaderIcon) ;~ DAS HIER WURDE EINGEFÜGT !!!
    GUIDelete($hGUIDisplay) ; Lösche das GUI
    _ProgressDelete($hGUIProgressBar) ; MUST BE DONE ON EXIT
    _Progress_CallBack_Free(1) ; Force Killing Timer
    _GDIPlus_Shutdown()

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

    $temp = 1
    While FileExists(@TempDir & "\PMNETCOR*.png") = True And $temp < 10
    $temp += $temp
    ;~ FileDelete(@TempDir & "\PMNETCORGE2EICO16px.png") ; Funktioniert zurzeit nicht
    FileDelete(@TempDir & "\PMNETCORstart.png")
    FileDelete(@TempDir & "\PMNETCORtesttyp.png")
    FileDelete(@TempDir & "\PMNETCORzielendpunkt.png")
    FileDelete(@TempDir & "\PMNETCORGE2EICO.ico") ; Funktioniert zurzeit nicht
    WEnd
    Exit
    EndFunc ;==>_PMClose

    [/autoit]


    Dann funktioniert dies ohne Prbleme :D
    >> Du solltest jedes Objekt was du verwendest wieder freigeben :P

    3 Mal editiert, zuletzt von Yjuq (22. November 2012 um 14:22)

  • Moin,
    mein Verdacht liegt ja, wie bereits geschrieben in GDI+.
    Genauer bei:

    [autoit]


    _GDIPlus_ImageLoadFromFile()
    ; oder
    _GDIPlus_GraphicsCreateFromHWND()

    [/autoit]

    Wie ich drauf komme?
    Ich hab an der Workfile weiter gearbeitet und mit diesen Funktionen weitere PNGs eingebunden.
    Diese wehren sich ebenfalls gegen das Löschen.

    Trotzdem schonmal Danke für deine mühe.

  • Wunderbar.
    Danke dir.
    Lag ich ja garnicht so falsch, aber doch son bisschen ;)

    Somit haut das Programm endlich alles weg, was es anlegt =D

    Wusste halt noch net, wie genau das geht mit dem Freigeben ;)

  • Ja, ist auch ein bischen blöd in der Deutschen Hilfe (Ich gehe mal davon aus das du da nachgeschaut hast?)

    Bei

    [autoit]

    _GDIPlus_ImageLoadFromFile()

    [/autoit]

    steht ja auch kein Wort davon, wie man das ganze wieder freigibt ^^ | Allerdings mit ein bischen Verstand + Suche hätte mans eig. Schnell gefunden :p

  • Ich hab die Deutsche, wie auch die in AutoIt genutzt.
    Gegoogelt hab ich auch, aber anscheint falsch =D

    Und so feste bin ich noch nicht mit GDI+
    Ist das erste mal, dass ich das jetzt nutze.

    Tjoa, vieles ist einfacher als man denkt und ich hab gnadenlos vorbeigedacht.
    Naja hatte ja auch noch anderes zu tun ;)

    Hm... müsste man mal bei den Verantwortlichen für die Hilfe anhauen, dass das dort eingetragen wird.
    So, gerade gemacht.

  • Ja, ist auch ein bischen blöd in der Deutschen Hilfe (Ich gehe mal davon aus das du da nachgeschaut hast?)


    Da die dt. Hilfe afaik 1:1 übersetzt ist, kann ich mir nicht vorstellen das es im Original besser versrändlich ist, vor allem die Beispiele der engl. Hilfe sind in der dt. auch evtl durch weitere ergänzt. Alsp ist imho die dt. Hilfe keinesfalls schlechter als die englische.

    mfg autoBert

  • Ich habe ja nie behauptet dass die dt. Hilfe schlechter ist als die englische. Wäre nur gut gewesen wenn man das evtl. Früher gesehen hätte und dann den Hinweis darauf gegeben hätte :D

    Aber an sich ist die dt. Hilfe ja wikrlich nur eine 1:1 Übersetzung. Da hast du schon recht.

  • Naja, aber was ist schlimm daran, wenn die 1:1 Übersetzung auch erweitert wird? ;)
    Das macht sie ja nur besser als das Original.
    Praktisch wäre es denn vorallem, wenn die von der Orig. Hilfe dies mitbekommen und auch umsetzen.