Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Rätsel über Rätsel... AV, wo es keine geben *kann* (https://www.delphipraxis.net/50771-raetsel-ueber-raetsel-av-wo-es-keine-geben-%2Akann%2A.html)

Meflin 31. Jul 2005 13:09


Rätsel über Rätsel... AV, wo es keine geben *kann*
 
Aloha!

Ich habe ein Problem, das sich eigentlich niemand den ich bis jetzt fragte erklären kann: im constructor meiner Komponente erstelle ich u.a. eine TStringList, aber diese wird nicht erzeugt, der Debugger sagt mir dass sie nil ist.

Delphi-Quellcode:
 
private
  fPasswords: TStringList;
...
public
  constructor Create(AOwner: TComponent); reintroduce;
...
constructor TPasswordList.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fPasswords := TStringList.Create;
  fCount := fPasswords.Count;
  fCS := TCriticalSection.Create;
end;
wenn ich dann versuche z.b. die addmethode meiner kompo aufzurufen, die so aussieht:
Delphi-Quellcode:
function TPasswordList.Add(const s: string): Integer;
begin
  if ThreadSave then CS.Enter;
  Result := fPasswords.Add(s);
  if ThreadSave then CS.Leave;
  fCount := fPasswords.Count;
end;
und ich da einen Breakpoint setze, zeigt der Debugger an dass fPasswords nil ist und folglich endet das ganze in einer AV.

Aber wieso?


fkerber 31. Jul 2005 13:11

Re: Rätsel über Rätsel... AV, wo es keine geben *kann*
 
Hi!

Und Zeile 11 des ersten Blocks gibt keine AV?


Ciao Frederic

Jens Schumann 31. Jul 2005 13:12

Re: Rätsel über Rätsel... AV, wo es keine geben *kann*
 
Hallo,
die Sourceausschnitt sieht natürlich Ok aus. Schieb doch mal den kompletten Quelltext rüber.

Keldorn 31. Jul 2005 13:17

Re: Rätsel über Rätsel... AV, wo es keine geben *kann*
 
ist die Stringliste eine property? wenn ja, dann brauchst du dort eine Set-methode, wo du assign verwendest, eine einfache Zuweisung reicht hier nicht.
Delphi-Quellcode:
procedure Set...
  fpasswords.assign(value);
Mfg Frank

xaromz 31. Jul 2005 13:31

Re: Rätsel über Rätsel... AV, wo es keine geben *kann*
 
Hallo,

Zitat:

Zitat von Meflin
Delphi-Quellcode:
constructor Create(AOwner: TComponent); reintroduce;
...

was für einen Vorfahrtyp hat denn dein Objekt? normalerweise braucht man kein reintroduce für den Konstruktor. Wird dieser denn überhaupt aufgerufen?

Gruß
xaromz

SirThornberry 31. Jul 2005 13:49

Re: Rätsel über Rätsel... AV, wo es keine geben *kann*
 
wenn ich mir das so anschaue sieht es aus als ob der constructor die gleichen parameter hat wie der vorgänger. Dementsprechend solltest du anstelle von reintroduce lieber override nehmen und schon sollte das ganze funktionieren. Allerdings würde ich dann auch vermuten das der constructor bisher nie aufgerufen wurde sondern immer der des vorfahren

Meflin 31. Jul 2005 15:27

Re: Rätsel über Rätsel... AV, wo es keine geben *kann*
 
Merci, mit override funktioniert das ganze wunderbarst :)


sakura 31. Jul 2005 16:31

Re: Rätsel über Rätsel... AV, wo es keine geben *kann*
 
Zitat:

Zitat von Keldorn
ist die Stringliste eine property? wenn ja, dann brauchst du dort eine Set-methode, wo du assign verwendest, eine einfache Zuweisung reicht hier nicht.

Der von Dir vorgeschlagene Weg ist zwar der korrekte, aber der andere ist auch eine theoretische Möglichkeit, auch wenn einen OOP-Freak das Grausen bei solch einem Anblick bekommt :zwinker:

...:cat:...

SirThornberry 1. Aug 2005 15:19

Re: Rätsel über Rätsel... AV, wo es keine geben *kann*
 
falls man doch mal den Constructor von einer Componente neu definieren will dann geht das so (in dem Beispiel soll dem Constructor noch ein String übergeben bekommen)
Delphi-Quellcode:
  TTestcomp = class(TComponent)
  private
    fCaption: String;
  public
    constructor Create(AOwner: TComponent); overload; override;
    constructor Create(AOwner: TComponent; ACaption: String); overload;
  end;

constructor TTestcomp.Create(AOwner: TComponent);
begin
  Create(AOwner, 'StandardString');
end;

constructor TTestcomp.Create(AOwner: TComponent; ACaption: String);
begin
  fCaption := ACaption;
  inherited Create(AOwner);
end;
Wird also der ursprungsconstructor aufgerufen (zum Beispiel weil auf TComponent gecastet wurde so wie delphi es beim automatischen creieren macht, so ruft der überschriebene Constructor den neuen Constructor mit einem Standardwert auf welcher dann die eignetliche Aufgaben erledigt.

Sidorion 1. Aug 2005 15:37

Re: Rätsel über Rätsel... AV, wo es keine geben *kann*
 
Ich will nicht pedantisch erscheinen, aber es muss heissen:
Delphi-Quellcode:
    constructor Create(AOwner: TComponent); overload; override;
    constructor Create(AOwner: TComponent; ACaption: String); reintroduce; overload;
Fragt mich bitte nicht warum die Reihenfolge bei den direktiven andersrum ist, aber da steckt man nicht drin :wink:
Wenn du das reintroduce weglasst meckert wegen der Überschreiberei rum


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 Uhr.
Seite 1 von 2  1 2      

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