Botschaftsbehandlungsroutinen für OnMouseOver & OnMouseOut

// *.h:

protected:

    void __fastcall OnMouseOver(TMessage & Msg);
    void __fastcall OnMouseOut(TMessage & Msg);

    BEGIN_MESSAGE_MAP

        VCL_MESSAGE_HANDLER(CM_MOUSEENTER , TMessage, OnMouseOver)
        VCL_MESSAGE_HANDLER(CM_MOUSELEAVE , TMessage, OnMouseOut)

    END_MESSAGE_MAP(TForm)

// *.cpp:

void __fastcall TForm1::OnMouseOver(TMessage & Msg)
{
    if (((TLabel *)Msg.LParam) == myLabel)
    {
        myLabel->Caption = "Mouse Over";
    }
}

void __fastcall TForm1::OnMouseOut(TMessage & Msg)
{
    if ( ((TLabel *)Msg.LParam) == myLabel)
    {
        myLabel->Caption = "Mouse Out";
    }
}

Drag & Drop mit einer ToolBar

// ToolBar und Button auf die Form ziehen und im Objektinspektor einstellen:
//
// bei der Form: DockSite = true, DragKind = dkDrag
// beim ToolBar: DockSite = false, DragKind = dkDock, DragMode = dmAutomatic
//
// statt dem Toolbar kann z.B. auch ein Panel verwendet werden
// auf dem Element können beliebig Buttons usw. ausgelagert werden
void __fastcall TForm1::FormDockDrop(TObject *Sender, TDragDockObject *Source, int X, int Y)
{
    if (Y < 50)
    {
        ToolBar1->DockSite = false;
        ToolBar1->Align = alTop; // Toolbar beim Hineinziehen oben in der Form verankern
    }
}

void __fastcall TForm1::FormGetSiteInfo(TObject *Sender, TControl *DockClient, TRect &InfluenceRect, TPoint &MousePos, bool &CanDock)
{
    CanDock = (MousePos.y - Top) -> 50 ? false : true;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ToolBar1->Visible = true; // falls das Toolbar-Window geschlossen wurde, wieder sichtbar machen
}

Mehrfachstart einer Anwendung verhindern

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    // neuen Mutex creieren
    HANDLE hInstanceMutex = ::CreateMutex(NULL,TRUE, "MUTEXNAME");

    // wenn Mutex "MUTEXNAME" schon existiert, d.h. die Anwendung schon
    // einmal geöffnet war, wird der Fehler ERROR_ALREADY_EXISTS erzeugt
    if (GetLastError() == ERROR_ALREADY_EXISTS)
    {
        // Handle auf den Mutex zerstören
        if (hInstanceMutex) CloseHandle(hInstanceMutex);

        // Anwendung beenden
        return 0;
    }

    // normale Abarbeitung der Anwendung
    try
    {
        Application->Initialize();
        Application->CreateForm(__classid(TForm1), &Form1);
        Application->Run();
    }
    catch (Exception &exception)
    {
        Application->ShowException(&exception);
    }

    // nach normalem Beenden der Anwendung den Mutex wieder freigeben
    ReleaseMutex(hInstanceMutex);
    CloseHandle(hInstanceMutex);
    return 0;
}

Menuitems aus einer ini erstellen

// im *.h der Form:
private:
void __fastcall OnUserMenuClick(TObject *Sender);

.
.
.

// in *.cpp der Form:

// beim Klick auf Button1 wird das Menu im Hauptmenu erzeugt
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TMenuItem *NewItem = new TMenuItem(Application);
    TStringList *ssMenuItems = new TStringList();

    // instanz der inidatei erstellen (liegt im programmpfad)
    TIniFile *iniDatei = new TIniFile(AnsiString(ExtractFilePath(Application->ExeName)) + &quot;PROGRAMM.INI&quot;);

    iniDatei->ReadSection(&quot;Default&quot;, ssMenuItems);

    // hauptmenü-punkt erstellen
    NewItem->Caption = &quot;Default&quot;;
    MainMenu1->Items->Add(NewItem);

    for (int j = 0; j < ssMenuItems->Count; j++)
    {
        // untermenü-punkte erstellen
        TMenuItem *NewSubItem = new TMenuItem(Application);
        NewSubItem->Caption = ssMenuItems->Strings[j];

        // OnClick-Methode für den Menüpunkt festlegen
        // -> hier alle ein und die selbe Methode
        NewSubItem->OnClick = OnUserMenuClick;

        // untermenüpunkt dem hauptpunkt zuordnen
        NewItem->Add(NewSubItem);
    }

    // müssen bei programmende freigegeben werden,
    // da sonst das menü sofort wieder verschwindet
    // oder übernimmt die Anwendung die Freigabe??
    // delete NewItem;

    delete ssMenuItems;
    delete iniDatei;
}

void __fastcall TForm1::OnUserMenuClick(TObject *Sender)
{
    // caption des geklickten Menüpunktes anzeigen
    ShowMessage(dynamic_cast <TMenuItem*-> (Sender)->Caption);
}

Projekt als Standalone-EXE kompilieren

Um im Borland C++ Builder ein Projekt als Standalone-EXE zu compilieren, muss man in den Projekt-Optionen folgendes einstellen:

  • Registerkarte Linker: dynamische RTL verwenden
  • Registerkarte Packages: mit Laufzeit-Packages kompilieren

Anwendung zusätzlich auf Geschwindigkeit optimieren und überflüssige Debug-Infos entfernen:

  • Registerkarte Compiler: statt ‘Voll-Debug’ ‘Endgültig’ wählen

Dezimalpunkt global in der Anwendung festlegen

Standardmäßig werden bei allen FloatToString-Konvertierungen die ‘.’ zu ‘,’ gewandelt, um das zu umgehen kann man global den Dezimal-Separator festlegen.

__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
    DecimalSeparator='.'; // z.B. Punkt als Separator
}