verschiedene Hints in einem Treeview anzeigen

void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
    Application->ShowHint = true;
    Application->OnShowHint = DoShowHint;
    Application->HintPause = 10;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::DoShowHint(System::AnsiString &HintStr, bool &CanShow, THintInfo &HintInfo)
{
    if (HintInfo.HintControl->ClassNameIs("TTreeView"))
    {
        HintInfo.HintMaxWidth = 200;
        HintInfo.HintPos.x += 10;
        HintInfo.ReshowTimeout = 50;
    }
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::TreeViewMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
    if (Sender->ClassNameIs("TTreeView"))
    {
        TTreeNode *Node;
        Node = ((TTreeView*)Sender)->GetNodeAt(X, Y);

        if (Node == NULL)
        {
            ((TTreeView*)Sender)->ShowHint = false;
        }
        else
        {
            ((TTreeView*)Sender)->Hint = Node->Text;
            ((TTreeView*)Sender)->ShowHint = true;
        }
    }
}

In einem TreeView TreeNode->Data eine Struktur zuweisen

// erst ein Struct definieren
struct BeispielStruct
{
    AnsiString BeispielString;
    int iZahl;
}

// Struct dem TTreeNode zuweisen 
BeispielStruct* Test = new BeispielStruct;
Test->BeispielString = "Test";
Test->iZahl = 5;
TreeNode->Data = (void*)Test;

// Aufruf 
if (TreeNode->Data)
{
    BeispielStruct *Test = (BeispielStruct*)TreeNode->Data;
    ShowMessage(Test->BeispielString);
}

// Beim Beenden delete der einzelnen in TreeNode->Data gespeicherten Structe nicht vergessen! 

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