Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem beim Erzeugen eines 2. Objekts von einer Klasse. (https://www.delphipraxis.net/41585-problem-beim-erzeugen-eines-2-objekts-von-einer-klasse.html)

ustra 5. Mär 2005 15:09


Problem beim Erzeugen eines 2. Objekts von einer Klasse.
 
Hallo,

ich habe folgende Klasse geschrieben um mir den Zugriff auf eine MySQL-Datenbank zu erleichtern (einige Methoden habe ich zum Posten wegen der Übersichtlichkeit entfernt, die mit dem Problem nichts zu tun haben):

Delphi-Quellcode:
unit UDatenbank;

interface

uses Sysutils, UIni, classes, ZConnection, Db, ZAbstractRODataset, ZAbstractDataset, ZDataset;

type TFehlerEvent = procedure(sFehlercode: integer) of object;
type TDatenbank = class(TComponent)
  private
    FMysql : TZConnection;
    FAbfrage : TZQuery;
    ini : TIni;
    FOnFehler: TFehlerEvent;
    procedure SetOnFehler(Value: TFehlerEvent);
    procedure Fehler (sFehler : integer);
    procedure iniOnFehler(sFehlercode: integer);
    procedure verbinden;
    procedure beenden;
  public
    constructor create;
    destructor destroy;  
    procedure abfrage(sAbfrage : String);
  published
      property onFehler: TFehlerEvent read FOnFehler write SetonFehler;
end;

implementation

{ TDatenbank }

constructor TDatenbank.create;
begin
  try
    FMysql := TZConnection.create(self);
    FAbfrage := TZQuery.create(self);
    FAbfrage.Connection := FMysql;
    Ini := TIni.create(self);
    Ini.onFehler := iniOnFehler;
  except
    Fehler(10000);
  end;
end;

destructor TDatenbank.destroy;
begin
  beenden;
  FMysql.Free;
  FAbfrage.free;
  Ini.free;
end;

procedure TDatenbank.SetOnFehler(Value: TFehlerEvent);
begin
  FOnFehler := Value;
end;

procedure TDatenbank.Fehler(sFehler: integer);
begin
  If Assigned(FOnFehler) then
     FOnFehler(sFehler);
end;

procedure TDatenbank.iniOnFehler(sFehlercode: integer);
begin
  Fehler(sFehlercode);
end;

procedure TDatenbank.beenden;
begin
 if FMysql.Connected then
    FMysql.Disconnect;
end;

procedure TDatenbank.verbinden;
begin
  beenden;
  FMysql.HostName := ini.lese('db', 'host');
  FMysql.port := StrToInt(ini.lese('db', 'port'));
  FMysql.user := ini.lese('db', 'benutzer');;
  FMysql.password := ini.lese('db', 'passwort');;
  FMysql.Database := ini.lese('db', 'datenbank');
  FMysql.protocol := 'mysql-3.23';
  FMysql.ReadOnly := false;
  FMysql.connect;
  if not FMysql.connected
  then
    Fehler(10001);
end;

procedure TDatenbank.abfrage(sAbfrage: String);
var q: string;
    ex: boolean;
begin
  verbinden;
  FAbfrage.SQL.text := sAbfrage;
  FAbfrage.open;
  beenden;
end;

end.
Hinweis: Die Klasse TIni ist eine weitere Klasse, in der ich den Zugriff auf eine INI-Datei gekapselt habe.
Ich benutze als Komponenten die ZEOS-Komponenten für den Datenbankzugriff.

Nun zum eigentlichen Problem: Erzeuge ich mir von der Klasse TDatenbank ein Objekt, so funktioniert dies auch problemlos; kann Daten in die Datenbank schreiben und lesen. Wenn ich aber während der Laufzeit ein 2. Objekt von der Klasse erzeugen will, bekomme ich immer Zugriffsverletzung.

Weiss jemand Rat?

Besten Dank

Ulrich

Muetze1 5. Mär 2005 15:14

Re: Problem beim Erzeugen eines 2. Objekts von einer Klasse.
 
Moin!

Erstmal würde ich dir grundlegend empfehlen die alten Constructoren und Destructoren aufzurufen:

Delphi-Quellcode:
Type
  ...
    Constructor Create(AOwner : TComponent); Override;
    Destructor Destroy; Override;

....
....
....

constructor TDatenbank.Create(AOwner : TComponent);
begin
  Inherited Create(AOwner);
  try
    FMysql := TZConnection.create(self);
    FAbfrage := TZQuery.create(self);
    FAbfrage.Connection := FMysql;
    Ini := TIni.create(self);
    Ini.onFehler := iniOnFehler;
  except
    Fehler(10000);
  end;
end;

destructor TDatenbank.destroy;
begin
  beenden;
  FMysql.Free;
  FAbfrage.free;
  Ini.free;

  Inherited Destroy;
end;
Und dann solltest du den Constructor auch ordentlich überschreiben und nicht einen neuen definieren der sich dann um nix kümmert (Owner fehlt)...
Und den Destructor entsprechend...

MfG
Muetze1

ustra 5. Mär 2005 15:31

Re: Problem beim Erzeugen eines 2. Objekts von einer Klasse.
 
Hi,

danke für die Antwort. Ich habe Deine Verbesserungen eingepflegt. Jetzt bekomme ich immer die Meldung: Eine Komponente mit dem Namen "Button 2" existiert schon. Ein Button heißt auch "Button 2". Allerdings verstehe ich nicht, warum er Button2 als Bezeichner nimmt. Die Fehlermeldung taucht in folgender Zeile auf:
Delphi-Quellcode:
dbf.create(Form1);
und nciht in der Konstruktor-Methode. Ich erzeuge das Objekt wie folgt:
Delphi-Quellcode:
procedure TForm2.Button2Click(Sender: TObject);
var dbf : TDatenbank;
begin
  dbf.create(Form1);
  dbf.destroy;
end;
Beim Start des Programms rufe ich im onCreate des Formulars so auf (ohne Fehlermeldung):
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  db1 := TDatenbank.create(Form1);
  db1.onFehler := dbFehler;
end;
Ulrich

Robert_G 5. Mär 2005 15:36

Re: Problem beim Erzeugen eines 2. Objekts von einer Klasse.
 
dreimal darfst du raten wo der Unterschied ist. ;)
Zitat:

Zitat von ustra
Delphi-Quellcode:
  dbf.create(Form1);
Delphi-Quellcode:
  db1 := TDatenbank.create(Form1);

db1 kann doch nicht aus dem Nichts instanziert werden um sich selbst im eigenen Konstruktor zu instanzieren. :freak:
Der zweite Fall geht, der 1. kann gar nicht gehen. ;)

ustra 5. Mär 2005 15:48

Re: Problem beim Erzeugen eines 2. Objekts von einer Klasse.
 
Hi,

ich alte Tröte. Ich frage mich gerade selber, warum ich das nicht gesehen habe. Ich habe schon an mir selber gezweifelt. Sonst hatte ich so was auch immer problemlos hinbekommen.

@Robert_G: Danke für Dein hinsehen. Habe den Wald vor lauter Bäumen nicht mehr gesehen.

Ulrich


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 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