ExplorerListGadget(): Extension bei Verknüpfungen ausblenden

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

ExplorerListGadget(): Extension bei Verknüpfungen ausblenden

Beitrag von Kiffi »

Hallo,

im ExplorerListGadget() (Ansicht: #PB_ListIcon_LargeIcon) werden im
Gegensatz zum Windows-Explorer die Extensionen der Verknüpfungen
angezeigt.

ExplorerListGadget():
Bild

Windows Explorer:
Bild

Kann man das irgendwie unterdrücken? Sprich: Ich möchte so genau so
eine Darstellung wie im Windows Explorer.

Danke im voraus & Grüße ... Kiffi
a²+b²=mc²
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Hallo Kiffi,

ist zwar nicht eine direkte Lösung, aber probier mal:

Code: Alles auswählen

Procedure Open_Window()
  If OpenWindow(0, 0, 0, 600, 300, "web",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(0))
      WebGadget(0, 15, 35, 560, 220, "c:\")
      
    EndIf
  EndIf
EndProcedure

Open_Window()

Repeat: Until WaitWindowEvent()=#PB_Event_CloseWindow


Dan hat man im Prinzip, die selben Möglichkeiten mit der rechten Maustaste wie beim WindowsExplorer...da gibt`s sicher noch ein paar Flags, die man rausfinden muss und dann setzen kann...Man benötigt auch kein runprogram beim Doppelklick, Drag&Drop funkt, ...

lg
Marco
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

marco2006 hat geschrieben:ist zwar nicht eine direkte Lösung, aber probier mal:
Danke für Deine Antwort! Deine Lösung ist zwar ziemlich pfiffig (:allright:), aber der
Einfachheit halber möchte ich eigentlich lieber das ExplorerListGadget() verwenden.

Ich bastel mir gerade einen trivialen Programmstarter und benötige
beispielsweise den Programmstart via Einfachklick. Ich befürchte, dass das
beim WebGadget (FolderView) wieder in einem Callback-Massaker ausarten
würde.

Nochmals Danke & Grüße ... Kiffi
a²+b²=mc²
Andreas
ToolbarKönig
Beiträge: 142
Registriert: 08.09.2004 08:33

Beitrag von Andreas »

Code: Alles auswählen

;##############################################
;ExplorerListGadget-Darstellung wie im Explorer
;##############################################
;Andreas , 05.04.2008
;##############################################

Macro INDEXTOSTATEIMAGEMASK(I)
  I<<8
EndMacro

If OpenWindow(0, 0, 0, 400, 200, "ExplorerListGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  Pfad$ = Space(260)
  OpenLibrary(0,"shell32")
  CallFunction(0,"SHGetSpecialFolderPathA",WindowID(0),@Pfad$,0,0)
  CloseLibrary(0)
  
  ExplorerListGadget(0, 10, 10, 380, 180, Pfad$+"\*.lnk", #PB_Explorer_NoFolders|#PB_Explorer_NoParentFolder)
  ChangeListIconGadgetDisplay(0, #PB_ListIcon_LargeIcon)
  Count.l = SendMessage_(GadgetID(0),#LVM_GETITEMCOUNT,0,0)
  LV.LVITEM
  LV\iSubItem = 0
  For I = 0 To Count -1
    Buffer$ = Space(260)
    LV\pszText = @Buffer$
    LV\cchTextMax = Len(Buffer$)
    SendMessage_(GadgetID(0),#LVM_GETITEMTEXT,I,@LV)
    Buffer$ = StringField(Buffer$,0,".")
    LV\pszText =  @Buffer$
    SendMessage_(GadgetID(0),#LVM_SETITEMTEXT,I,LV)
  Next I
  
  LV\stateMask = #LVIS_OVERLAYMASK
  LV\state = INDEXTOSTATEIMAGEMASK(2);Index 2 = Verknüpfungspfeil
  SendMessage_(GadgetID(0),#LVM_SETITEMSTATE,-1,LV);Änderung für alle Items -> 3.Parameter
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
  
Gruss Andreas
Andreas
ToolbarKönig
Beiträge: 142
Registriert: 08.09.2004 08:33

Beitrag von Andreas »

Und hier nochmal aufbereitet

Code: Alles auswählen

;##############################################
;ExplorerListGadget-Darstellung wie im Explorer
;##############################################
;Andreas , 05.04.2008
;##############################################

#Explorer = 0

Macro INDEXTOSTATEIMAGEMASK(I)
  I<<8
EndMacro

Procedure.s GetDesktopFolder()
Protected Pfad$
  Pfad$ = Space(260)
  OpenLibrary(0,"shell32")
  CallFunction(0,"SHGetSpecialFolderPathA",0,@Pfad$,0,0)
  CloseLibrary(0)
ProcedureReturn Pfad$
EndProcedure

Procedure LVMUpdate(Gadget)
  Count.l = SendMessage_(GadgetID(Gadget),#LVM_GETITEMCOUNT,0,0)
  LV.LVITEM
  LV\iSubItem = 0
  For I = 0 To Count -1
    Buffer$ = Space(260)
    LV\pszText = @Buffer$
    LV\cchTextMax = Len(Buffer$)
    SendMessage_(GadgetID(Gadget),#LVM_GETITEMTEXT,I,@LV)
    If Right(Buffer$,3) = "lnk"
      Buffer$ = StringField(Buffer$,0,".")
      LV\pszText =  @Buffer$
      SendMessage_(GadgetID(Gadget),#LVM_SETITEMTEXT,I,LV)
      LV\stateMask = #LVIS_OVERLAYMASK
      LV\state = INDEXTOSTATEIMAGEMASK(2);Index 2 = Verknüpfungspfeil
      SendMessage_(GadgetID(Gadget),#LVM_SETITEMSTATE,I,LV);Änderung für alle Items -> 3.Parameter = -1
    EndIf
  Next I
EndProcedure

If OpenWindow(0, 0, 0, 400, 200, "ExplorerListGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  Pfad$ = GetDesktopFolder()
  ExplorerListGadget(#Explorer, 10, 10, 380, 180, Pfad$+"\*.lnk");,#PB_Explorer_NoParentFolder)
  ChangeListIconGadgetDisplay(0, #PB_ListIcon_LargeIcon)
  LVMUpdate(#Explorer)
  Repeat
    EventID = WaitWindowEvent()
    Select EventID
    Case #PB_Event_Gadget
      Select EventGadget()
      Case 0
        Select EventType()
        Case #PB_EventType_Change
          LVMUpdate(0)
        EndSelect
      EndSelect
    Case #PB_Event_CloseWindow
      Quit = 1
    EndSelect
  Until Quit = 1
EndIf

Gruss Andreas
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Hallo Andreas,

danke für Deinen Code! Allerdings hat die Sache einen Haken: Nach Ändern
der Namen kann ich die Items nicht mehr via RunProgram() aufrufen. Und da
sich in meinem ExplorerListGadget() neben den Verknüpfungen auch andere
Dateien und auch Ordner befinden können (habe ich im Ursprungsposting
vergessen zu erwähnen, sorry) kann ich auch nicht dann beispielsweise nicht
mehr zwischen Ordnern und Verknüpfungen unterscheiden.

Grüße ... Kiffi
a²+b²=mc²
Andreas
ToolbarKönig
Beiträge: 142
Registriert: 08.09.2004 08:33

Beitrag von Andreas »

Kiffi hat geschrieben: danke für Deinen Code! Allerdings hat die Sache einen Haken: Nach Ändern
der Namen kann ich die Items nicht mehr via RunProgram() aufrufen. Und da
sich in meinem ExplorerListGadget() neben den Verknüpfungen auch andere
Dateien und auch Ordner befinden können (habe ich im Ursprungsposting
vergessen zu erwähnen, sorry) kann ich auch nicht dann beispielsweise nicht
mehr zwischen Ordnern und Verknüpfungen unterscheiden.
Mit folgendem Code sollte es so funktionieren wie gewünscht !

Code: Alles auswählen

;##############################################
;ExplorerListGadget-Darstellung wie im Explorer
;##############################################
;Andreas , 05.04.2008
;##############################################

#Explorer = 0

Macro INDEXTOSTATEIMAGEMASK(I)
  I<<8
EndMacro

Procedure.s GetDesktopFolder()
  Protected Pfad$
  Pfad$ = Space(260)
  OpenLibrary(0,"shell32")
  CallFunction(0,"SHGetSpecialFolderPathA",0,@Pfad$,0,0);Desktop
  CloseLibrary(0)
  ProcedureReturn Pfad$
EndProcedure

Procedure LVMUpdate(Gadget)
  Count.l = SendMessage_(GadgetID(Gadget),#LVM_GETITEMCOUNT,0,0)
  LV.LVITEM
  LV\iSubItem = 0
  For I = 0 To Count -1
    Buffer$ = Space(260)
    LV\pszText = @Buffer$
    LV\cchTextMax = Len(Buffer$)
    SendMessage_(GadgetID(Gadget),#LVM_GETITEMTEXT,I,@LV)
    If GetExtensionPart(Buffer$) = "lnk"
      Buffer$ = Left(Buffer$,Len(Buffer$)-4)
      LV\pszText =  @Buffer$
      SendMessage_(GadgetID(Gadget),#LVM_SETITEMTEXT,I,LV)
      LV\stateMask = #LVIS_OVERLAYMASK
      LV\state = INDEXTOSTATEIMAGEMASK(2);Index 2 = Verknüpfungspfeil
      SendMessage_(GadgetID(Gadget),#LVM_SETITEMSTATE,I,LV);Änderung für alle Items -> 3.Parameter = -1
    EndIf
  Next I
EndProcedure

Procedure IsLink(Gadget,ID)
  Protected RetVal.l
  Retval = 0
  LV.LVITEM
  If SendMessage_(GadgetID(Gadget),#LVM_GETITEMSTATE,ID,#LVIS_OVERLAYMASK)
    RetVal = 1
  EndIf
  ProcedureReturn Retval
EndProcedure

If OpenWindow(0, 0, 0, 400, 200, "ExplorerListGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  Pfad$ = GetDesktopFolder()
  Debug Pfad$
  ExplorerListGadget(#Explorer, 10, 10, 380, 180, Pfad$+"\*.*");,#PB_Explorer_NoParentFolder)
  ChangeListIconGadgetDisplay(0, #PB_ListIcon_LargeIcon)
  LVMUpdate(#Explorer)
  Repeat
    EventID = WaitWindowEvent()
    Select EventID
    Case #PB_Event_Gadget
      Select EventGadget()
      Case 0
        Select EventType()
        Case #PB_EventType_LeftDoubleClick
          Pfad$ = GetGadgetText(#Explorer)
          Item.l = GetGadgetState(#Explorer)
          FileName$ = GetGadgetItemText(#Explorer,Item)
          If GetGadgetItemState(#Explorer,Item) & #PB_Explorer_File
            If IsLink(#Explorer,Item)
              RunProgram(Pfad$+""+Filename$+".lnk")
            Else
              RunProgram(Pfad$+""+Filename$)
            EndIf
          EndIf
        Case #PB_EventType_Change
          LVMUpdate(0)
        EndSelect
      EndSelect
    Case #PB_Event_CloseWindow
      Quit = 1
    EndSelect
  Until Quit = 1
EndIf
Gruss Andreas
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Andreas hat geschrieben:Mit folgendem Code sollte es so funktionieren wie gewünscht !
Jau, jetzt klappt das so, wie ich mir das vorgestellt habe! Danke für Deine Hilfe :allright:

Grüße ... Kiffi
a²+b²=mc²
Antworten