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. ; 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: Einsteiger-Kapitel Navigation
< Vorheriges: Anzeigen von Text-Ausgabe (Konsole) | Überblick | Nächstes: Anzeigen von Grafik-Ausgabe & einfaches Zeichnen >