Icon aus Datei Extrahieren -> FTP

  • VB.NET

Es gibt 62 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Der Code oben ist Teil der Image_List_Variabel. Den fügst du in die Image_List_Variabel ein und änderst im Programmsourcecode den Konstruktor-Aufruf ab. Die ImageList ist nicht innerhalb des Controls deklariert, sondern in der Image_List_Variable.
    Naja, füge einfach mal die den Code aus Post 57 in die Klasse ein und rufe bei der Abfrage der Icons GetExtensionIcon statt GetIcon (bzw., wenn du es schon umbenannt hast, LoadIcon oder so) auf. Dadurch wird eben vorher überprüft, ob bereits ein Icon in der Liste verfügbar ist.
    Hatte mich oben außerdem falsch ausgedrückt, es sollte eigentlich heißen "Übergib' doch bei der Instanzierung des Image_Liste_Variabel-Klasse das Control, das es verwendet."

    Gruß
    ~blaze~
    Vielleicht konnte ich deshalb nicht folgen.
    Ich hatte das alles bereits eingebunden,
    dann meldet sich aber der folgende mit Fehler

    VB.NET-Quellcode

    1. Dim Index_Of_Icon As Integer = GetExtensionIcon(fileName.Substring(fileName.LastIndexOf("."c)))

    Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis.
    Wenn ich alles mit Shared deklariere kommt auch nichts zurück.

    Lege ich eine Neue Instanz an

    VB.NET-Quellcode

    1. Dim NeuerAuftrag As Image_Liste_Variabel = New Image_Liste_Variabel(???) ' genau hier
    2. Dim Index_Of_Icon As Integer = NeuerAuftrag.GetExtensionIcon(fileName.Substring(fileName.LastIndexOf("."c)))

    Will er ein Control von mir ?

    mhhhh

    und wenn das irgendwann mal fliegt. Nerve ich vermutlich solange, bis ich es auch verstehe.
    Das war eine Drohung. X( 8| ^^

    VB.NET-Quellcode

    1. Dim NeuerAuftrag As Image_Liste_Variabel = New Image_Liste_Variabel(Me)' genau hier
    2. Dim Index_Of_Icon As Integer = NeuerAuftrag.GetExtensionIcon(fileName.Substring(fileName.LastIndexOf("."c)))

    Vorausgesetzt, das wird im Control deklariert. Er will ein Control von dir, weil du (ich) das im Konstruktor so angegeben hast. Vergiss nicht, dass fileName.Substring... failt, wenn kein "."c enthalten ist. Da wärs besser, die Extension vorher rauszuziehen. Die Image_Liste_Variabel haust du übrigens im Control rein, die sollte Private sein. Ich stell mir das so vor:

    VB.NET-Quellcode

    1. Public Class MyControl
    2. Inherits Control 'oder UserControl etc. wird evtl. auch vom Designer geloest
    3. Private ilvVariableImageList As Image_Liste_Variabel
    4. Public Function FuetterMichWhatever(ByVal fileName As String) As Icon
    5. Dim extensionIndex As Integer = fileName.LastIndexOf("."c)
    6. If extensionIndex = -1 Then
    7. Return ilvVariableImageList.ImageList.Images(0)
    8. Else
    9. Return ilvVariableImageList.GetExtensionIcon(fileName.Substring(extensionIndex))
    10. End If
    11. End Sub
    12. Public Sub New()
    13. InitializeComponent()
    14. ilvVariableImageList = New Image_Liste_Variabel(Me)
    15. End Sub
    16. End Class

    Da machts auch nichts aus, wenn Multithreading mit im Spiel ist. Setz' dich noch mal bisschen mit dem Code auseinander und versuch die Zusammenhänge zu verstehen. GetExtensionIcon ruft ein Icon für eine Extension ab. Das Icon wird entweder aus der ImageList entnommen oder, wenn dort keines vorhanden ist, mit GetIcon aus der Registry geladen. GetIcon lädt immer aus der Registry, unabhängig davon, ob bereits ein Icon geladen wurde. Die ImageList-Instanz soll eben für jeden Thread unterschiedlich sein, da sonst anscheinend beim threadübergreifenden Vorgang eine Fehlermeldung geschmissen wird (Die in der Registry eingetragenen Iconverweise sollten sich nicht ändern, sonst wäre vmtl. GetIcon doch besser oder man updatet, sobald ein Registry Schlüssel geändert wurde). Das ThreadStaticAttribute-Attribut sorgt wie gesagt dafür, dass eben jeder Thread seine eigene Icon-Liste hat. Natürlich ist es dann auch erforderlich, dass eine Variable angelegt wird, die die Icon-Liste für einen bestimmten verfügbar macht, da sonst das Control eine andere Liste verwendet, als GetExtensionIcon, wenn Multithreading im Einsatz ist. Das Beschreiben der ImageList findet aber immernoch auf dem Thread statt, auf dem das Control erzeugt wurde - deswegen verwende ich da ctrlControl.Invoke... Die beiden unterschiedlichen Delegaten sind für die möglichen Fälle: Ist kein Icon vorhanden bzw. konnte es nicht geladen werden, wird das Standard-Icon verwendet. Dieses liegt aber bereits in der ImageList und zwar am Index 0. Das Icon liegt aber bereits als Bild vor, da ImageList nur Images enthält, und damit ist es eben kein Icon mehr --> Der Delegat hat einen String, die aktuelle Extension, und ein Image, das Standardicon, als Parameter. Beim Icon wird ja das Icon in die Liste eingetragen --> Der Delegat hat einen String, die aktuelle Extension, und ein Icon, das ausgelesene Icon, als Parameter.
    Für das Control ist das obige relativ uninteressant. Es muss nur GetExtensionIcon aufrufen, sobald es ein Icon benötigt und dem TreeView als ImageList die ImageList aus der Image_Liste_Variabel.ImageList übergeben.

    Übrigens wird die ImageList-Instanz pro Thread in der Eigenschaft erzeugt. D.h. dort musst du auch die Standard-Icons, wie Ordner, "kein Icon", usw., erzeugen.

    Ich hoffe mal, du musst mich nicht noch einmal bedrohen ;).

    Gruß
    ~blaze~