Einzelnen Beitrag anzeigen

ustra

Registriert seit: 12. Mär 2003
Ort: Geesthacht
138 Beiträge
 
Delphi 5 Professional
 
#1

Problem beim Erzeugen eines 2. Objekts von einer Klasse.

  Alt 5. Mär 2005, 15:09
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
Ulrich Strauer
  Mit Zitat antworten Zitat