Delphi Unit direkt ins Projekt einbinden

  • eigenes BC++Builder Projekt erstellen
  • die gewünschte Delphi-Unit (*.pas) unter “Projekt->Dem Projekt hinzufügen” auswählen und mit OK zum Projekt hinzufügen
  • bevor die Delphi-Unit im Projekt verwendet wird, erst das ganze Projekt compilieren, somit wird für die *.pas eine *.hpp Datei generiert, die man im Projekt verwenden kann
  • jetzt kann mit #include “Delphiunit.hpp” auf die Funktionen der Delphi-Unit zugegriffen werden

BLOBStream (Bild) aus einer Datenbank Laden/Speichern

  • ein Bild in eine Tabelle (Table-Element) mit der Spalte “PICTURE” speichern
void __fastcall TForm1::SaveImageBtnClick(TObject *Sender) 
{ 
    if (OpenDialog1->Execute() == false)
    {
        Table->Active = true; 
        Table->Append(); 
        Table->FieldByName("Name")->AsString = ExtractFileName(OpenDialog1->FileName); 

        TBlobField* blobField = dynamic_cast <TBlobField*-> (Table->FieldByName(&quot;PICTURE&quot;)); 
        if (blobField) blobField->LoadFromFile(OpenDialog1->FileName); 
        Table->Post(); 
    }
}
  • ein Bild aus einer Tabelle laden (Spalte “PICTURE”)
void __fastcall TForm1::LoadImageBtnClick(TObject *Sender) 
{ 
    TBlobField* blobField = dynamic_cast <TBlobField*-> (Table->FieldByName(&quot;PICTURE&quot;)); 
    if (blobField == NULL)
    {
        Table->Active = true; 
        TMemoryStream* memStream = new TMemoryStream; 
        blobField->SaveToStream(memStream); 
        memStream->Position = 0; 
        Image1->Picture->Bitmap->LoadFromStream(memStream); 
        delete memStream; 
    }
}

Daten aus einer Datenbank-Tabelle in einem ListView anzeigen

  • Im Beispiel liegen die für den Datenbankzugriff benötigten Komponenten (TDatabase, TQuery) auf einem DataModul (TDataModule).
#include "DataModule.h"

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    SqlQuery(true, "SELECT * FROM TabellenName"); // Daten holen, siehe Beispiel weiter oben

    ListView->Items->Clear(); // Listviel erstmal leeren

    // alle Datensätze aus der Query in das ListView holen
    for (int i=0; i<DataModule->SQLQuery->RecordCount; i++)
    {
        ListItem = ListView->Items->Add();

        // fiktiven Namen und Alter ins Listview übertragen
        ListItem->Caption = DataModule->SQLQuery->FieldByName("name")->AsString);
        ListItem->SubItems->Add(DataModule->SQLQuery->FieldByName("alter")->AsString);

        // zum nächsten Datensatz springen
        DataModule->SQLQuery->Next();
    }
}

Zeilen in ein Listview einfügen

  • im Objektinspektor sollte ViewStyle = vsReport und RowSelect = true gesetzt sein
  • evtl. sollten im Objektinspektor auch unter Columns Spalten vordefiniert werden (hier im Beispiel sind es 3)
void __fastcall TfrmMain::Button1Click(TObject *Sender)
{
    TListItem *ListItem; // als erstes einen Zeiger auf ein Listitem definieren
    ListView->Items->Clear();

    ListItem = ListView->Items->Add(); // neues Item hinzufügen
    ListItem->Caption = &quot;Text1&quot;; // ItemText festlegen
    ListItem->SubItems->Add(&quot;Text2&quot;); // 2 Subitems hinzufügen
    ListItem->SubItems->Add(&quot;Text3&quot;);
}

Daten von einer TQuery holen

AnsiString sTempString = SQLQuery->FieldByName(&quot;Spaltenname&quot;)->AsString;
float fZahl = SQLQuery->FieldByName(&quot;Spaltenname&quot;)->AsFloat;
int iWert = SQLQuery->FieldByName(&quot;Spaltenname&quot;)->AsInteger;

oder

AnsiString sTempString = SQLQuery->Fields->Fields[SpaltenNummer]->AsString;
float fZahl = SQLQuery->Fields->Fields[SpaltenNummer]->AsFloat;
int iWert = SQLQuery->Fields->Fields[SpaltenNummer]->AsInteger;

Arbeit mit TQuery und SQL

  • Um die Arbeit mit SQL Strings und den TQuery-Objekten zu vereinfachen sollte man sich eine Funktion schreiben, an die nur noch der SQL-String und der Typ der Rückgabemenge übergeben wird.
// &quot;true&quot; für Abfragen mit Rückgabemenge
SqlQuery(true, &quot;SELECT * FROM tablename&quot;);

// &quot;false&quot; für Abfragen ohne Rückgabemenge
SqlQuery(false, &quot;INSERT INTO tablename (col1, col2, ...) VALUES (0, 'String', NULL)&quot;);

void TDataModule::SqlQuery(bool QueryType, AnsiString Sql)
{
    SQLQuery->Close();
    SQLQuery->SQL->Clear();
    SQLQuery->SQL->Add(Sql);

    if (QueryType) SQLQuery->Open();
    else SQLQuery->ExecSQL();
}

Beispiel für einen Datenbankzugriff mit MySQLDAC-Komponenten

Auf eine Form eine mySQLDatabase, mySQLQuery, Datasource, DBGrid und einen DBNavigator ziehen und im Objektinspektor folgendes einstellen:

mySQLDatabase1->DatabaseName = beliebiger Name
mySQLDatabase1->Host = IP-Adresse des mySQL-Servers;
mySQLDatabase1->Port = 3306;
mySQLDatabase1->UserName = ein Username;
mySQLDatabase1->UserPassword = gültiges Passwort;
mySQLDatabase1->Active = true;

mySQLQuery1->DataBase = mySQLDatabase1
mySQLQuery1->sql: SELECT * FROM TabellenName
mySQLQuery1->Active = true;

DataSource1->DataSet = Query1

DBGrid1->DataSource = Datasource1

DBNavigator->DataSource = Datasource1

Beispiel für einen Datenbankzugriff mit BDE-Komponenten

Auf eine Form eine Database, Query, Datasource, DBGrid und einen DBNavigator ziehen und im Objektinspektor folgendes einstellen:

Database1->Aliasname = BCDemos
Database1->DatabaseName = TestDB
Database1->LoginPrompt = false
Database1->Active = true;

Query1->DatabaseName = TestDB
Query1->sql: SELECT * FROM animals
Query1->Active = true;

DataSource1->DataSet = Query1

DBGrid1->DataSource = Datasource1

DBNavigator->DataSource = Datasource1