AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Problem beim Erzeugen eines 2. Objekts von einer Klasse.
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beim Erzeugen eines 2. Objekts von einer Klasse.

Offene Frage von "ustra"
Ein Thema von ustra · begonnen am 5. Mär 2005 · letzter Beitrag vom 5. Mär 2005
Antwort Antwort
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, 16: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
Muetze1
(Gast)

n/a Beiträge
 
#2

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

  Alt 5. Mär 2005, 16:14
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
  Mit Zitat antworten Zitat
ustra

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

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

  Alt 5. Mär 2005, 16:31
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: 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
Ulrich Strauer
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#4

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

  Alt 5. Mär 2005, 16:36
dreimal darfst du raten wo der Unterschied ist.
Zitat von ustra:
  dbf.create(Form1);   db1 := TDatenbank.create(Form1);
db1 kann doch nicht aus dem Nichts instanziert werden um sich selbst im eigenen Konstruktor zu instanzieren.
Der zweite Fall geht, der 1. kann gar nicht gehen.
  Mit Zitat antworten Zitat
ustra

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

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

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 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