Delphi-Version: 5
Klasse die mit DB verbindet erstellen?
Hallo,
ich möchte mich mehr mit Klassen bzw. Objekten beschäftigen und schreibe gerade eine Klasse, die meine Anwendung mit der SQLite DB verbinden soll. Aber irgendwie habe ich noch eine Wissenslücke. Die Variablen "SQLite3Connection", "SQLTransaction", "SQLQuery" wollen nicht createt werden. Der Fehler lautet: Zitat:
Delphi-Quellcode:
unit myobj;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, sqlite3conn, sqldb; type { TSQLiteDB } TSQLiteDB = class procedure Connect; end; var SQLiteDB: TSQLiteDB; SQLite3Connection: TSQLite3Connection; SQLTransaction: TSQLTransaction; SQLQuery: TSQLQuery; implementation { TSQLiteDB } procedure TSQLiteDB.Connect; begin SQLite3Connection := TSQLite3Connection.Create(Self); SQLTransaction := TSQLTransaction.Create(Self); SQLQuery := TSQLQuery.Create(Self); try SQLite3Connection.DatabaseName := ExtractFilePath(Application.ExeName) + 'db.db'; SQLite3Connection.Params.Add('foreign_keys=on;'); SQLTransaction.DataBase := SQLite3Connection; SQLQuery.Transaction := SQLTransaction; except end; end; end. |
AW: Klasse die mit DB verbindet erstellen?
TSQLite3Connection.Create erwartet als Übergabeparameter ein TComponent oder eine von TComponent abgeleitete Klasse.
Du kannst das Create auch mit nil aufrufen, musst dich aber dann selbst um die Freigabe kümmern. |
AW: Klasse die mit DB verbindet erstellen?
Ok... ist es eigentlich ok, wenn ich das wie folgt mache? Muss ich dann "TSQLiteDB.Create;" und "TSQLiteDB.Destroy;" manuell aufrufen, oder geht das automatisch?
Bekomme noch diese Warnung, was heißt sich eigentlich? Zitat:
Delphi-Quellcode:
{ TSQLiteDB }
TSQLiteDB = class constructor Create; destructor Destroy; procedure Connect; end; var SQLiteDB: TSQLiteDB; SQLite3Connection: TSQLite3Connection; SQLTransaction: TSQLTransaction; SQLQuery: TSQLQuery; implementation { TSQLiteDB } constructor TSQLiteDB.Create; begin SQLite3Connection := TSQLite3Connection.Create(nil); SQLTransaction := TSQLTransaction.Create(nil); SQLQuery := TSQLQuery.Create(nil); end; destructor TSQLiteDB.Destroy; begin SQLite3Connection.Free; SQLTransaction.Free; SQLQuery.Free; end; |
AW: Klasse die mit DB verbindet erstellen?
Delphi-Quellcode:
constructor TSQLiteDB.Create;
begin inherited; SQLite3Connection := TSQLite3Connection.Create(nil); SQLTransaction := TSQLTransaction.Create(nil); SQLQuery := TSQLQuery.Create(nil); end; destructor TSQLiteDB.Destroy; begin SQLite3Connection.Free; SQLTransaction.Free; SQLQuery.Free; inherited; end; |
AW: Klasse die mit DB verbindet erstellen?
Aber muss ich irgendwo
Zitat:
Zitat:
|
AW: Klasse die mit DB verbindet erstellen?
Ja oder in der Unit (initialization bzw. finalization)
|
AW: Klasse die mit DB verbindet erstellen?
Zitat:
Delphi-Quellcode:
Hier stürzt das Programm beim Schließen ab. :gruebel:
procedure TForm1.FormCreate(Sender: TObject);
begin SQLiteDB.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin SQLiteDB.Destroy; end; |
AW: Klasse die mit DB verbindet erstellen?
In der Unit, in welcher Du die Klasse deklarierst.
Btw. warum kein Datenmodul? |
AW: Klasse die mit DB verbindet erstellen?
Zitat:
|
AW: Klasse die mit DB verbindet erstellen?
Der initialization Abschnitt einer Unit wird beim Laden der Unit ( Einbinden in uses einer anderen Unit) automatisch aufgerufen und der finalization Abschnitt beim Entladen (Programmende).
Ein Datenmodul ist ein spezielels Formular für nicht sichtbare Komponenten. |
AW: Klasse die mit DB verbindet erstellen?
Aber wie es scheint muss man den Konstruktor und Destruktor doch nicht manuell aufrufen. Siehe hier -> http://www.delphibasics.co.uk/RTL.asp?Name=Constructor
Auch sonst schweigen viele Tutorials dazu. |
AW: Klasse die mit DB verbindet erstellen?
Woraus leitest Du das ab?
|
AW: Klasse die mit DB verbindet erstellen?
Natürlich musst du den Konstruktor aufrufen - woher soll Delphi sonst wissen, dass eine Instanz der Klasse erstellt werden soll.
Bis auf einige Ausnahmen (Interfaces, Owner-verwaltete Komponenten) sollte auch der destructor aufgerufen werden. Dabei solltest du dir angewöhnen Free statt Destroy zu verwenden. Free prüft zuerst auf nil und zerstört nur, wenn die Instanz assigned ist. |
AW: Klasse die mit DB verbindet erstellen?
Zitat:
|
AW: Klasse die mit DB verbindet erstellen?
Dann schau Dir mal den (automatisch erzeugten) Code des hauptprogramm ( Projekt) an.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz