Einsteiger-Kapitel - Erstellen einer grafischen Benutzeroberfläche (GUI)

In Ergänzung zum Konsolen-Fenster unterstützt PureBasic auch die Erstellung grafischer Benutzeroberflächen (GUI). Daher lasst uns das Beispiel mit den Datei-Eigenschaften aus den vorhergehenden Artikeln erneut ansehen und es in eine GUI-Applikation umwandeln.

Beachten Sie, dass PureBasic bereits einen sehr viel einfacheren Weg bietet, um diese besondere Aufgabe zu erledigen - das ExplorerListGadget(); aber dieses Beispiel soll in das Verwalten von GUI-Elementen einführen, die Verwendung dieses Gadgets wäre für dieses Ziel wenig förderlich.
  ; Die Struktur für die Datei-Informationen wie zuvor.
  Structure FILEITEM
    Name.s
    Attributes.i
    Size.q
    DateCreated.i
    DateAccessed.i
    DateModified.i
  EndStructure
  
  ; Dies ist eine Konstante zum Identifizieren des Fensters.
  Enumeration
    #WindowFiles
  EndEnumeration
  
  ; Dies ist eine Aufzählung (von Konstanten) zum Identifizieren der Gadgets, welche auf dem Fenster erscheinen.
  Enumeration
    #Folder
    #Files
  EndEnumeration
  
  ; Jetzt können wir eine Liste von Dateien definieren, indem wir dafür die zuvor spezifizierte Struktur verwenden.
  NewList Files.FILEITEM()
  
  ; Und einige Variablen für weitere Dinge.
  Define.s Access, Attrib, Create, Folder, Modify, Msg, Num, Size
  Define.l Result, Flags
  
  ; Diese Variablen werden Details von den GUI-Ereignissen empfangen, wie diese im Programm auftreten.
  Define.l Event, EventWindow, EventGadget, EventType, EventMenu
  
  ; Diese Funktion ermittelt das Benutzer-Verzeichnis des angemeldeten Anwenders.
  Folder = GetHomeDirectory()
  
  ; Öffnen des Verzeichnisses zum Auflisten all seiner Inhalte.
  Result = ExamineDirectory(0, Folder, "*.*")
  
  ; Ist dies ok, beginnen wir das Auflisten der Einträge.
  If Result
    ; Durchlauf bis NextDirectoryEntry(0) Null zurückgibt - was anzeigt, dass es keine weiteren Einträge gibt.
    While NextDirectoryEntry(0)
      ; Wenn der Verzeichnis-Eintrag eine Datei und kein Ordner ist.
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        ; Fügt ein neues Element zur verketteten Liste hinzu.
        AddElement(Files())
        ; Und füllt sie mit den Eigenschaften der Datei.
        Files()\Name = DirectoryEntryName(0)
        Files()\Size = DirectoryEntrySize(0)
        Files()\Attributes = DirectoryEntryAttributes(0)
        Files()\DateCreated = DirectoryEntryDate(0, #PB_Date_Created)
        Files()\DateAccessed = DirectoryEntryDate(0, #PB_Date_Accessed)
        Files()\DateModified = DirectoryEntryDate(0, #PB_Date_Modified)
      EndIf
    Wend
    ; Schließt das Verzeichnis.
    FinishDirectory(0)
  EndIf
  
  ; Sortiert die Liste in alphabetisch aufsteigender Reihenfolge der Dateinamen.
  SortStructuredList(Files(), #PB_Sort_Ascending, OffsetOf(FILEITEM\Name), #PB_String)
  
  ; Der interessante Stoff beginnt hier...
  
  ; Diese Zeile definiert ein Flag für die Fenster-Attribute, indem die gewünschten Attribut-Konstanten mittels 'OR' (hier das '|' Zeichen) miteinander verknüpft werden.
  Flags = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar
  
  ; Öffnet ein GUI-Fenster.
  OpenWindow(#WindowFiles, 50, 50, 450, 400, "File Properties", Flags)
  ; Ein Text-Gadget zum Anzeigen des Verzeichnis-Namens.
  TextGadget(#Folder, 5, 40, 440, 25, Folder)
  ; Ein ListIcon Gadget, welches die Dateinamen und -eigenschaften beinhaltet.
  ListIconGadget(#Files, 5, 70, 440, 326, "#", 35)
  ; Hinzufügen von Spalten zum ListIconGadget, welche jede Eigenschaft darstellen sollen.
  AddGadgetColumn(#Files, 1, "Name", 200)
  AddGadgetColumn(#Files, 2, "Created", 100)
  AddGadgetColumn(#Files, 3, "Accessed", 100)
  AddGadgetColumn(#Files, 4, "Modified", 100)
  AddGadgetColumn(#Files, 5, "Attributes", 150)
  AddGadgetColumn(#Files, 6, "Size", 100)
  
  ; Laden der Dateien in die Listenansicht.
  ForEach Files()
    ; Anzeigen der Eintragsnummer und des Dateinamens.
    Num = StrU(ListIndex(Files()) + 1)
    
    ; Diese Zeilen konvertieren die drei Datumswerte in eine gebräuchlichere Ansicht.
    Create = FormatDate("%dd/%mm/%yyyy", Files()\DateCreated)
    Access = FormatDate("%dd/%mm/%yyyy", Files()\DateAccessed)
    Modify = FormatDate("%dd/%mm/%yyyy", Files()\DateModified)

    ; Konvertiert die Dateigröße in einen String - genauso wie vorhin den Index-Wert,
    ; lässt aber Platz für die maximale Größe eines Quad-Wertes.
    Size = StrU(Files()\Size)
    
    ; Konvertiert die Attribute vorerst in einen String.
    Attrib = StrU(Files()\Attributes)
    
    ; Erstellt einen String für die gesamte Zeile.
    ; Das Zeilenvorschub-Zeichen 'Chr(10)' sagt dem Gadget, dass es zur nächsten Spalte springen soll.
    Msg = Num + Chr(10) + Files()\Name + Chr(10) + Create + Chr(10) + Access + Chr(10) + Modify + Chr(10) + Attrib + Chr(10) + Size
    
    ; Hinzufügen der Zeile zum Listen-Gadget.
    AddGadgetItem(#Files, -1, Msg)
  Next Files()
  
  ; Dies ist die Ereignis-Schleife des Fensters.
  ; Sie wird sich um all die Ereignisse aus der Interaktion mit dem Anwender kümmern, welche wir unterstützen möchten.
  
  Repeat
    ; Warten bis ein neues Fenster- oder Gadget-Ereignis auftritt.
    Event = WaitWindowEvent()
    ; In Programmen mit mehr als einem Fenster ermitteln wir, in welchem Fenster das Ereignis auftrat.
    EventWindow = EventWindow()
    ; Bei welchem Gadget trat das Ereignis auf.
    EventGadget = EventGadget()
    ; Welche Art von Ereignis trat auf.
    EventType = EventType()
    
    ; Hier beginnen nun die entsprechenden Aktionen.
    Select Event
      Case #PB_Event_Gadget
        ; Ein Gadget-Ereignis ist aufgetreten.
        If EventGadget = #Folder
        ElseIf EventGadget = #Files
        EndIf
      Case #PB_Event_CloseWindow
        ; Das Fenster wurde geschlossen.
        If EventWindow = #WindowFiles
          CloseWindow(#WindowFiles)
          Break
        EndIf
    EndSelect

    ; Wir gehen zurück und tuen das gleiche erneut.
    ; In der Praxis ist diese Schleife nicht unendlich, weil sie durch Anklicken des Schließ-Knopfes vom Fenster gestoppt werden kann.
  ForEver
An diesem Punkt hat die Applikation bereits einige nützliche Feature. Sie hat jedoch auch noch einige Probleme:
1) Sie können kein Verzeichnis zum Anzeigen auswählen.
2) Sie können die Inhalte der Liste nicht aktualisieren, ohne das Programm zu schließen und neu zu starten.
3) Wenn Sie das Fenster in der Größe verändern, werden die Gadgets nicht entsprechend in der Größe angepasst.
4) Die Spalte mit den Eigenschaften ist immer noch nicht sehr nützlich.
Wir werden uns das Programm später erneut ansehen, um all diese Unzulänglichkeiten zu beheben.

Einsteiger-Kapitel Navigation

< Vorheriges: Anzeigen von Text-Ausgabe (Konsole) | Überblick | Nächstes: Anzeigen von Grafik-Ausgabe & einfaches Zeichnen >