Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   FreePascal Klasse die mit DB verbindet erstellen? (https://www.delphipraxis.net/186301-klasse-die-mit-db-verbindet-erstellen.html)

AlexII 21. Aug 2015 16:22

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:

myobj.pas(29,54) Error: Incompatible type for arg no. 1: Got "TSQLiteDB", expected "TComponent"
Kann mir da jemand auf die Sprünge helfen? Danke!

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.

SProske 21. Aug 2015 16:38

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.

AlexII 21. Aug 2015 19:00

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:

Warning: An inherited method is hidden by "destructor TSQLiteDB.Destroy;"
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;

mkinzler 21. Aug 2015 19:02

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;

AlexII 21. Aug 2015 19:32

AW: Klasse die mit DB verbindet erstellen?
 
Aber muss ich irgendwo
Zitat:

"TSQLiteDB.Create;"
und
Zitat:

"TSQLiteDB.Destroy;"
manuell in der Anwendung aufrufen?

mkinzler 21. Aug 2015 19:35

AW: Klasse die mit DB verbindet erstellen?
 
Ja oder in der Unit (initialization bzw. finalization)

AlexII 21. Aug 2015 19:44

AW: Klasse die mit DB verbindet erstellen?
 
Zitat:

Zitat von mkinzler (Beitrag 1313035)
Ja oder in der Unit (initialization bzw. finalization)

Hm... in der Unit von der Form1, oder in meiner unit myobj?

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  SQLiteDB.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SQLiteDB.Destroy;
end;
Hier stürzt das Programm beim Schließen ab. :gruebel:

mkinzler 21. Aug 2015 19:48

AW: Klasse die mit DB verbindet erstellen?
 
In der Unit, in welcher Du die Klasse deklarierst.

Btw. warum kein Datenmodul?

AlexII 21. Aug 2015 20:20

AW: Klasse die mit DB verbindet erstellen?
 
Zitat:

Zitat von mkinzler (Beitrag 1313038)
In der Unit, in welcher Du die Klasse deklarierst.

Btw. warum kein Datenmodul?

Aber wie rufe ich es da auf bzw. wo? Da gibt's doch keine Methode dafür, und wenn ich dafür eine Procedure schreibe, was ruft wiederum diese Procedure auf? Was ist ein Datenmodul?

mkinzler 21. Aug 2015 20:28

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 Uhr.
Seite 1 von 2  1 2      

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