Zwischenablage verwenden

#include <Clipbrd.hpp>

// Zwischenablage löschen
Clipboard()->Clear();

// Text in Zwischenablage kopieren
char caText[80] = "Testtext";
Clipboard()->SetTextBuf(caText);

// Text aus der Zwischenablage kopieren
char caTextBuffer[1024];
Clipboard()->GetTextBuf(caTextBuffer, sizeof(caTextBuffer));
AnsiString sOutput = caTextBuffer;

AnsiString in Teile (Tokens) splitten, ähnlich explode() bei PHP

TStringList *slTokens = new TStringList();

AnsiString sData = "Meier, Schulze, Lehmann";

// sData in Tokens aufsplitten und führende und folgende Leerzeichen trimmen
Explode(sData, ",", slTokens, true);

...
irgendwas mit slTokens machen
...

delete sl;

void __fastcall Explode(AnsiString sData, AnsiString sSeparator, TStringList *slTokens, bool bTrim)
{
    // wurde eine Liste übergeben?
    if (slTokens != NULL)
    {

        if (bTrim)
        {
           sData = sData.Trim();
        }

        // Datenstring nicht leer?
        while (sData.Length() > 0)
        {
            // ersten Separator im String suchen
            int iPos = sData.Pos(sSeparator);
            
            // wenn Separator gefunden
            if (iPos -> 0)
            {
                // vorderen Stringteil (Token) in Liste einfügen
                slTokens->Add(sData.SubString(0, iPos - 1));
                // Reststring für neue Suche kürzen
                sData = sData.SubString(iPos + 1, sData.Length() - iPos);

                if (bTrim)
                {
                    sData = sData.Trim();
                }
            }
            else
            {
                // nur noch ein Token
                slTokens->Add(sData);
                // Reststring ist leer, führt zu Abbruch der while-Schleife
                sData = "";
            }
        }
    }
}

Drag & Drop verwenden

// Im Beispiel wird ein Element (Node) aus einem Treeview in ein Listview gezogen
//
// Quelle: Node auf Level 1 (1. Unterverzweigung) eines Treeviews "tvDatapoints"
// DragCursor: crDrag
// DragKind: dkDrag
// DragMode: dmAutomatic
//
// Ziel: Listview "lvInputs" Spalte 1 (Caption von TListItem)
//
// DragCursor: crDrag
// DragKind: dkDrag
// DragMode: dmManual
//
// akzeptiert das Ziel überhaupt das Element unter der Maus?
void __fastcall Form1::lvInputsDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept)
{
     bool bAccept = false;

     TTreeView* pTV = dynamic_cast<TTreeView*->(Source);

     if (pTV)
     {
        bAccept = (pTV->Selected->Level == 1); // z.B. nur wenn Node-Level == 1
     }

     Accept = bAccept;
}
// Zuordnung des akzeptierten Elements im Zielobjekt
void __fastcall Form1::lvInputsDragDrop(TObject *Sender, TObject *Source, int X, int Y)
{
     TTreeView* pTV = dynamic_cast<TTreeView*->(Source);

     if (pTV)
     {
        TTreeNode *pSelNode  = pTV->Selected; // Quelle
        TListItem *pListItem = lvInputs->GetItemAt(X, Y); // Ziel

        if (pSelNode && pListItem)
        {
           pListItem->Caption = pSelNode->Text;
        }
     }
}

BIOS Seriennummer mit WMI auslesen (Win32_BIOS-Klasse)

AnsiString GetBiosSerialNum()
{
    AnsiString ret;
    CoInitializeEx(0, COINIT_MULTITHREADED) ;
    CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);

    IWbemLocator *t_Locator = NULL ;
    HRESULT t_Result = CoCreateInstance (CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IUnknown, ( void ** ) & t_Locator);

    if ( SUCCEEDED ( t_Result ) )
    {
        BSTR t_Namespace = SysAllocString ( L"rootcimv2" ) ;
        if ( t_Namespace )
        {
            IWbemServices *t_Service = NULL ;
            t_Result = t_Locator->ConnectServer (t_Namespace, NULL, NULL, NULL, 0, NULL, NULL, &t_Service) ;

            if ( SUCCEEDED ( t_Result ) )
            {
                // die Property "SerialNumber" der Klasse "Win32_BIOS" auslesen
                BSTR t_Query = SysAllocString ( L"SELECT SerialNumber FROM Win32_BIOS" );
                BSTR t_QueryLanguage = SysAllocString ( L"WQL" );

                if ( t_Query && t_QueryLanguage )
                {
                    // Query starten
                    IEnumWbemClassObject *t_Enumeration = NULL ;
                    t_Result = t_Service->ExecQuery (t_QueryLanguage, t_Query, 0, NULL, & t_Enumeration);

                    // wenn Query erfolgreich
                    if ( SUCCEEDED ( t_Result ) )
                    {
                        t_Enumeration->Reset ();
                        IWbemClassObject *t_ClassObject = NULL;
                        ULONG t_Count = 0;

                        while ( t_Enumeration->Next ( INFINITE, 1, &t_ClassObject, &t_Count ) == WBEM_NO_ERROR )
                        {
                            BSTR t_PropertyName = NULL;
                            CIMTYPE t_CimType;
                            VARIANT t_Variant;
                            VariantInit ( & t_Variant );

                            t_ClassObject->BeginEnumeration ( WBEM_FLAG_NONSYSTEM_ONLY );

                            // alle von der Query angeforderten Properties der Klasse durchgehen
                            while ( t_ClassObject->Next ( 0, &t_PropertyName, &t_Variant, &t_CimType, NULL ) == WBEM_NO_ERROR )
                            {
                                // String zusammenbauen
                                ret += t_Variant.bstrVal;
                                SysFreeString ( t_PropertyName );
                                VariantClear ( & t_Variant );
                            }

                            t_ClassObject->Release ();
                        }

                        t_Enumeration->Release ();
                    }
                }

                SysFreeString ( t_Query );
                SysFreeString ( t_QueryLanguage );
            }

            t_Service->Release ();
            SysFreeString ( t_Namespace );
        }
    }

    t_Locator->Release () ;

    return ret;
}

Opendialog-Multiselect

OpenDialog->Options = OpenDialog->Options <<  ofAllowMultiSelect;

if (OpenDialog->Execute())
{
    // selektierte Files einer Listbox hinzufügen
    ListBox->Items->Text = ListBox->Items->Text + OpenDialog->Files->Text;
}

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);
}

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);