Autor Beitrag
TheEquinox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Mo 20.06.11 17:06 
Hallo zusammen,

ich hab zuletzt vor Ewigkeiten delphi programmiert und muss jetzt für ein Projekt nochmal ran (mit Delphi 7). Sehr weit komme ich allerdings nicht, schon beim Aufruf des Konstruktors meiner Klasse scheppert es.

Hier mal der Code, vielleicht sieht ja jemand etwas ungewöhnliches ...

Klassendefinition:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
type
  { Oracle database interaction class }
  TDBConn = class

  private

    mSession : TOracleSession; //oracle session object
    mPackage : TOraclePackage; //oracle package object
    mLevel : Integer; //assigned client level
    mConnStr : String//connection string
    mStatus : Integer; //current client status

    procedure Init(); //initialize the database connection
    procedure Login(); //perform a BXCT login
    procedure Logout(); //perform a BXCT logout    
    procedure UpdateStatus(); //read the current status from the database

    //returns whether the instance is currently connected to the database or not
    function IsConnected() : Boolean;

  public

    constructor Create(connstr : string; level : integer); Overload;    
    constructor Create(connstr : string); Overload;

    // custom destructor
    procedure MyDestroy(Sender : TObject);

  end;


Konstruktor-Implementierung :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
constructor TDBConn.Create(connstr : string; level : integer);
  begin
    inherited Create(); //inherit default constructor

    //store connection info
    mConnStr := connstr;
    mLevel := level;

    //try database connection
    Init();
  end;


Aufruf / Instanziierung der Klasse :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var DB : TDBConn;

initialization
  TActiveFormFactory.Create(
    ComServer,
    TActiveFormControl,
    BXCT,
    Class_BXCT,
    1,
    '',
    OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,
    tmApartment);

    DB := TDBConn.Create('test'1);
end.


Ich hab einen Breakpoint beim Aufruf von TDBConn.Create gesetzt und gehe dann mit F7 weiter. Er springt dann auch in den Konstruktor, allerdings knallts beim "inherits Create();" dann schon mit Zugriffsverletzung. Ich hab auch schon versucht, das inherits komplett weg zu lassen, dann knallt es mit derselben Zugriffsverletzung bei der ersten Zuweisung, also "mConnStr := connstr;"

Ich bin momentan ziemlich ratlos, wäre super wenn mir jemand auf die Sprünge helfen könnte...

Danke schonmal


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 20.06.2011 um 17:25
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 20.06.11 17:31 
Dass es mit inherited nicht geht, liegt an einem bekannten Fehler in alten Delphiversionen. Mit inherited Create kommst du theoretisch zum Konstruktor von TObject, praktisch knallt es. Deshalb darfst du den Aufruf nicht machen oder musst einen anderen Vorfahren benutzen.

Warum es ohne nicht geht, weiß ich nicht. Hast du einmal das overload weggelassen und nur den einen Konstruktor einzeln getestet?

Nebenbei:
Mit Delphi XE funktioniert der Quelltext natürlich problemlos.

Und zu deinem "custom destructor": Das sieht etwas seltsam aus, bist du sicher, dass das konzeptmäßig sinnvoll ist statt einem echten Destruktor? :gruebel:
TheEquinox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Mo 20.06.11 20:34 
Hallo jaenicke,

danke für die Antwort, aber ich glaube mittlerweile eher, dass es ein Problem des Debuggers ist. Wenn ich den Breakpoint erst auf den Aufruf der Init-Funktion setze, knallt es auch erst ab dort und die Anweisungen davor werden problemlos ausgeführt (auch das inherit).

Kann es vielleicht daran liegen, dass ich die Klasse TDBConn in einer Unit innerhalb eines ActiveX Projektes definiert habe ? Ich wüsste zwar nicht, was dagegen sprechen sollte aber das ist wohl das einzige, was nicht standard ist in dem bisherigen Projekt.