Eine eindeutige ID (GUID) generieren

  • Manchmal ist es notwendig, eine für einen bestimmten Computer eindeutige ID zu generieren. Die Windows-Funktion CoCreateGuid() erzeugt dazu aus verschiedenen Systemparametern (u.a. Mac-Adresse) einen eindeutigen 128Bit-Schlüssel, die UUID oder auch GUID.
  • Die ID sieht dann beispielsweise so aus: {416703BD-49F1-4D9A-BC78-34AB4C6C9995}
#include <objbase.h> // nicht vergessen!

...

AnsiString TForm1::GetUUID()
{
    GUID guid;
    CoCreateGuid(&guid);
    return GUIDToString(guid);
}

Komponenten einer Form Speichern und Laden (binär)

// Im Beispiel wird gezeigt, wie man ein TPanel mit einem daraufliegenden TEdit in
// eine Datei (binär) speichert und diese später wieder laden kann.
// Auf der Form befinden sich 2 Buttons (Laden/Speichern) und 1 Panel.
// Das TEdit wird zur Laufzeit erstellt.
// Zum Speichern/Laden wird ein TFilestream und dessen Funktionen
// WriteComponent() und ReadComponent() benutzt.
// Die geladenen Komponenten müssen noch mit RegisterClass(__classid(Typ)) registriert werden.
// Testweise kann etwas in das TEdit geschrieben werden, dieser Text wird dann mit gespeichert.

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    TEdit *e = new TEdit(Panel1); // Editfeld erzeugen, Owner wird das Panel, das ist
    e->Parent = Panel1;           // wichtig, damit das TEdit automatisch mit gespeichert wird.
}
// speichern
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // Filestream erzeugen, in dem die Komponenten gespeichert werden
    TFileStream *fs = new TFileStream("Test.dat", fmCreate);
    fs->WriteComponent(Panel1);
    delete fs;

    // Panel testweise entfernen
    delete Panel1;
}
// laden
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    // Filestream erzeugen, in dem die Komponenten geladen werden
    TFileStream *fs = new TFileStream("Test.dat", fmOpenRead);
    RegisterClass(__classid(TPanel)); // TPanel registrieren
    RegisterClass(__classid(TEdit)); // TEdit registrieren

    TComponent* comp = fs->ReadComponent(NULL);
    ((TControl*)comp)->Parent = this;
    delete fs;
}

Schriftart zur Laufzeit laden/entladen

// Schrift laden:

AddFontResource("arial.ttf");
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

// Schrift verwenden:

TestLabel->Font->Name = "Arial";
TestLabel->Font->Size = 10;
TestLabel->Caption = "Arial font test";

// Schrift entfernen:

RemoveFontResource("arial.ttf");
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

CHM-Datei im Quellcode aufrufen

#include "HtmlHelp.h"

...

// Typdeklaration für die HTML-Help Funktion
typedef HWND (__stdcall *FPHH) (HWND, LPCSTR, UINT, DWORD);
// Objekt anlegen
FPHH htmlHelp;
// HTMLHilfe-DLL Laden
HINSTANCE inst = LoadLibrary( "HHCTRL.OCX" );
// Funktion "HtmlHelpA" suchen und zuweisen
( FARPROC& ) htmlHelp = GetProcAddress( inst, "HtmlHelpA" );

// Contents anzeigen:
htmlHelp(0, "hilfe.chm", HH_DISPLAY_TOC, NULL );

// Index anzeigen:
htmlHelp(0, "hilfe.chm", HH_DISPLAY_INDEX, NULL );

// bestimmte Topic öffnen Version 1
htmlHelp(0, "hilfe.chm::/HTMLPfad_zur_HTMLDateiDatei.htm", HH_DISPLAY_TOPIC, 0);

// bestimmte Topic öffnen Version 2
htmlHelp(0, "hilfe.chm", HH_HELP_CONTEXT, 1040); // 1040 ist die Topic-ID

// "Suchen"-Register öffnen:
tagHH_FTS_QUERY q;

q.cbStruct = sizeof(q);
q.fStemmedSearch = 0;
q.fTitleOnly = 0;
q.fUniCodeStrings = 0;
q.iProximity = 0;
q.pszSearchQuery = "culture";
q.pszWindow = "";
q.fExecute = 1;

htmlHelp(0, "hilfe.chm", HH_DISPLAY_SEARCH, ( DWORD )&q );

Fehlerbehandlung auf der Systemebene (z.B. LoadLibrary, GetProcAddress)

void __fastcall ErrorHandling(HWND hwnd, String Caption)
{
    DWORD lErr = GetLastError();

    if (lErr != ERROR_SUCCESS)
    {
        LPVOID lpMsgBuf;
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, lErr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL);

        MessageBox(hwnd, (LPCTSTR)lpMsgBuf, Caption.c_str(), MB_OK |MB_ICONERROR );

        LocalFree(lpMsgBuf);
    }

    SetLastError(0);
}