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