![]() |
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:
Hinweis: Die Klasse TIni ist eine weitere Klasse, in der ich den Zugriff auf eine INI-Datei gekapselt habe.
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. 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 |
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:
Und dann solltest du den Constructor auch ordentlich überschreiben und nicht einen neuen definieren der sich dann um nix kümmert (Owner fehlt)...
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 den Destructor entsprechend... MfG Muetze1 |
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:
und nciht in der Konstruktor-Methode. Ich erzeuge das Objekt wie folgt:
dbf.create(Form1);
Delphi-Quellcode:
Beim Start des Programms rufe ich im onCreate des Formulars so auf (ohne Fehlermeldung):
procedure TForm2.Button2Click(Sender: TObject);
var dbf : TDatenbank; begin dbf.create(Form1); dbf.destroy; end;
Delphi-Quellcode:
Ulrich
procedure TForm1.FormCreate(Sender: TObject);
begin db1 := TDatenbank.create(Form1); db1.onFehler := dbFehler; end; |
Re: Problem beim Erzeugen eines 2. Objekts von einer Klasse.
dreimal darfst du raten wo der Unterschied ist. ;)
Zitat:
Der zweite Fall geht, der 1. kann gar nicht gehen. ;) |
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 04:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz