Auf dieser Seite sind einige von mir geschriebene Funktionen und diverse Informationen für die Programmiersprache PureBasic zu finden.
Funktionsbibliotheken
In diesem Abschnitt werden komplexere Funktionen und Sammlungen mehrerer solcher Funktionen bereitgestellt.
Die Quelltexte können einfach mit XIncludeFile in anderen Programmen eingebunden werden.
Variablen formatiert in Strings einsetzen
Die Funktion FormatString() dient dazu, Variablen verschiedener Typen in einen String einzufügen und dabei auf eine bestimmte Art zu formatieren.
Sie erfüllt damit einen vergleichbaren Zweck wie sprintf() unter C.
Eine ausführliche Beschreibung und einige Beispiele sind im Quelltext enthalten.
Quelltext: NhFormatString.pbi.
Öffnen- und Speichern-Dialogfenster mit erweiterten Funktionen
Mit den Funktionen OpenFileDialog() und SaveFileDialog() können Dialogfenster zum Öffnen und Speichern von Dateien angezeigt werden.
Im Gegensatz zu den PureBasic-Befehlen OpenFileRequester() und SaveFileRequester() bieten diese Funktionen einige nützliche Extras.
Dies sind zum Beispiel die Verwendung eines vom Betriebssystem vorgegebenen Fenstertitels,
das automatische Anfügen einer Erweiterung an den Dateinamen, oder die Anzeige einer Warnung beim Überschreiben vorhandener Dateien.
Die Benutzung der Funktionen wird ausführlich im Quelltext beschrieben.
Nur für Windows.
Quelltext: NhOpenSaveDialog.pbi.
Codeschnipsel
In diesem Abschnitt sind einige Quelltextfragmente und kleinere Funktionen zu finden.
String rotieren
Mit RotateString() können die Zeichen in einem String um eine beliebige Anzahl von Stellen rotiert werden.
Dabei werden die Zeichen innerhalb des Strings verschoben und die an einem Ende „herausfallenden“ Zeichen am anderen Ende wieder eingefügt.
*String ist ein Zeiger auf der String, welcher bearbeitet werden soll.
Es wird direkt die entsprechende Variable geändert; die Funktion hat keinen Rückgabewert.
Pos gibt die Anzahl von Stellen an, um welche der String rotiert werden soll.
Wenn Pos negativ ist, werden die Zeichen linksherum rotiert, andernfalls rechtsherum.
Die Funktion wurde darauf ausgelegt, das gewünschte Ergebnis mit minimalem Aufwand zu erreichen.
; String um bestimmte Anzahl von Stellen rotieren
Procedure RotateString(*String, Pos)
Protected Length, Dir, TempLen, *TempStr
Length = MemoryStringLength(*String)
If Length = 0
ProcedureReturn #True
EndIf
Pos % Length
If Pos = 0
ProcedureReturn #True
EndIf
If Pos < 0
Pos = -Pos
Dir = -1
Else
Dir = 1
EndIf
If Pos > Length / 2
Pos = Length - Pos
Dir = -Dir
EndIf
TempLen = Length - Pos
*TempStr = AllocateMemory(TempLen*SizeOf(Character), #PB_Memory_NoClear)
If Not *TempStr
ProcedureReturn #False
EndIf
If Dir = 1
CopyMemory(*String, *TempStr, TempLen*SizeOf(Character))
CopyMemory(*String+TempLen*SizeOf(Character), *String, Pos*SizeOf(Character))
CopyMemory(*TempStr, *String+Pos*SizeOf(Character), TempLen*SizeOf(Character))
ElseIf Dir = -1
CopyMemory(*String+Pos*SizeOf(Character), *TempStr, TempLen*SizeOf(Character))
CopyMemory(*String, *String+TempLen*SizeOf(Character), Pos*SizeOf(Character))
CopyMemory(*TempStr, *String, TempLen*SizeOf(Character))
EndIf
FreeMemory(*TempStr)
ProcedureReturn #True
EndProcedure
; Beispiel
For n = -12 To 12
s$ = "Abcdef"
RotateString(@s$, n)
Debug Str(n) + ": " + s$
Next
String ROT13-kodieren
Mit der folgenden Funktion kann ein String ROT13-kodiert werden. Die Funktion erwartet einen Zeiger auf den String als Parameter.
; String ROT13-kodieren
Procedure Rot13(*String.Character)
While *String\c
Select *String\c
Case 'A' To 'M', 'a' To 'm'
*String\c + 13
Case 'N' To 'Z', 'n' To 'z'
*String\c - 13
EndSelect
*String + SizeOf(Character)
Wend
EndProcedure
; Beispiel
s$ = "Falsches Üben von Xylophonmusik quält jeden größeren Zwerg."
Debug s$
Rot13(@s$)
Debug s$
Rot13(@s$)
Debug s$
Wert eines HTTP-Header-Feldes ermittlen
Mit der folgenden Funktion kann der Wert eines bestimmten Feldes in einem HTTP-Header ermittelt werden. Die Funktion erwartet den Header und den Namen des Feldes als Parameter. Wenn das Feld nicht existiert, wird ein leerer String zurückgegeben.
; Wert eines Feldes aus einem HTTP-Header ermitteln
Procedure.s GetHTTPHeaderFieldValue(Header$, FieldName$)
Protected n, Pos, Line$
n = 2 ; Mit zweiter Zeile beginnen, da erste Zeile den Statuscode enthält
Line$ = StringField(Header$, n, #CRLF$)
While Line$ <> ""
Pos = FindString(Line$, ":")
If Pos > 0
If LCase(Left(Line$, Pos-1)) = LCase(FieldName$)
ProcedureReturn Trim(Mid(Line$, Pos+1))
EndIf
EndIf
n + 1
Line$ = StringField(Header$, n, #CRLF$)
Wend
EndProcedure
; Beispiel
InitNetwork()
Debug GetHTTPHeaderFieldValue(GetHTTPHeader("http://www.google.de/"), "Date")
Popup-Menü unter einem Gadget anzeigen
Mit DisplayPopupMenuBelowGadget() kann ein Popup-Menü unterhalb eines Gadgets angezeigt werden.
; Popup-Menü unterhalb eines Gadgets anzeigen
Procedure DisplayPopupMenuBelowGadget(Menu, WindowID, Gadget)
Protected Position.POINT
MapWindowPoints_(GadgetID(Gadget), #Null, @Position, 1)
DisplayPopupMenu(Menu, WindowID, Position\x, Position\y+GadgetHeight(Gadget))
EndProcedure
; Beispiel
If OpenWindow(0, 0, 0, 200, 200, "", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If CreatePopupMenu(0)
MenuItem(0, "Eintrag")
EndIf
ButtonGadget(0, 5, 5, 100, 20, "Menü")
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
If EventGadget() = 0
DisplayPopupMenuBelowGadget(0, WindowID(0), 0)
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf