Autor Beitrag
JRegier
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Mo 29.08.05 13:38 
Hi, sagt mal muß ich vor dem aufruf Free ein Casting durchführen?

Also ich habe eine TControl namens FField
(bevor Ihr Fragt, ich nehme TControl deshalb, damit der Administrator den Feldtyp ändern kann)

und ich erzeuge zum Beispiel mit

ausblenden Delphi-Quelltext
1:
2:
FField := TDBEdit.Create(Self);
FField := TDBLookupComboBox.Create(Self);


und dann Realese ich mit

FField.Free; und hier gibts ein Problemm

bei allen Componenten gehts aber bei einer gibts immer Zugriffsverletzung!

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.
Moderiert von user profile iconChristian S.: Topic aus VisualCLX (Component Library for Cross Platform) verschoben am Mo 29.08.2005 um 15:21
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 29.08.05 13:49 
user profile iconUdontknow hat folgendes geschrieben:
Hallo!

Welches Steuerelement wäre das?

Cu,
Udontknow
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mo 29.08.05 13:59 
Der Destruktor ist immer virtual, d.h. er sollte immer den Destruktor der laut RTTI tatsächlich instanzierten Klasse aufrufen. Mit anderen Worten: Eigentlich ist ein Casten vor Free nicht nötig. Was bei dir schief geht, weiß ich aber so auch nicht.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
JRegier Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Mo 29.08.05 13:59 
user profile iconUdontknow hat folgendes geschrieben:
user profile iconUdontknow hat folgendes geschrieben:
Hallo!

Welches Steuerelement wäre das?

Cu,
Udontknow


Was meinst du?

Wenn du genauer wissen willst! Eine DB Anwendungs - Baukasten wo der Administrator den FeldTyp im PopupMenü auswählt!
Soll das eine DBEdit oder DBLookupComboBox oder eine DBMemo usw. sein!

Dafür habe ich noch ein Typ angelegt

TFieldTyp = (EDIT, COMBO, MEMO ... )

das setze ich wenn ein FeldTyp gesetzt wird! Und dementsprechend Caste ich das Control auch wo es sein muß!

Aber muß ich nun auch Casting vor Free machen oder nicht, ich meine wird den der ganze Speicher geräumt
wenn ich

FField.Free; afrufe

oder muß ich schon

TDBEdit(FField).Free; aufrufen?

Achso du meinst bei welchem Steuerelement gibts Problemme? Bei DBPlannerDatePicker
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 29.08.05 14:02 
Nein du musst nicht casten. Free ist in TObject definiert. Du solltest aber deinen destructor Destroy als override definiert haben.
JRegier Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Mo 29.08.05 14:08 
user profile icondelfiphan hat folgendes geschrieben:
Nein du musst nicht casten. Free ist in TObject definiert. Du solltest aber deinen destructor Destroy als override definiert haben.


Ja, aber was mache ich im Grunde genommen im Destructor? Also wenn es Komponenten sind die einen Owner haben
und ich nicht irgendwelche Objecte habe die Freigegeben werden müssen warum brauche ich ein Destroy zu überschreiben?

Eigentlich ist mein FField ja die eigentliche EditierComponente die als Feld in der Componente die vom der class
TCustomPanel abgeleitet ist weil ich da auch direkt ein Label links neben der EditierComponente habe!
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 29.08.05 14:11 
Die Tatsache, dass ein TComponent einen Owner haben kann, heisst noch lange nicht, dass er keinen Destruktor braucht. Klar, wenn nichts freizugeben ist, dann musst du natürlich keinen Destruktor definieren. Aber wenn du es tust, dann richtig ;)
Wo genau (im Destruktor) tritt denn der Fehler auf? (Debugging?)
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mo 29.08.05 14:13 
user profile iconJRegier hat folgendes geschrieben:
Ja, aber was mache ich im Grunde genommen im Destructor?
Speicher freigeben, der im Laufe der Lebzeit des Objektes vom Objekt reserviert werden könnte.

JRegier hat folgendes geschrieben:
Also wenn es Komponenten sind die einen Owner haben und ich nicht irgendwelche Objecte habe die Freigegeben werden müssen warum brauche ich ein Destroy zu überschreiben?
Du musst Destroy nicht überschreiben, wenn im Objekt kein Speicher angefordert wird und keine weiteren Objekte instanziert werden.

Wenn du eine Professional oder besser hast, könntest du ja mal mit den Quellcodes der VCL-Klassen anfangen, den Destruktor, den du aufrufst, zu debuggen. Vielleicht schlägt in dem irgendwas fehl.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
JRegier Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Mo 29.08.05 15:05 
user profile icontommie-lie hat folgendes geschrieben:
user profile iconJRegier hat folgendes geschrieben:
Ja, aber was mache ich im Grunde genommen im Destructor?
Speicher freigeben, der im Laufe der Lebzeit des Objektes vom Objekt reserviert werden könnte.

JRegier hat folgendes geschrieben:
Also wenn es Komponenten sind die einen Owner haben und ich nicht irgendwelche Objecte habe die Freigegeben werden müssen warum brauche ich ein Destroy zu überschreiben?
Du musst Destroy nicht überschreiben, wenn im Objekt kein Speicher angefordert wird und keine weiteren Objekte instanziert werden.

Wenn du eine Professional oder besser hast, könntest du ja mal mit den Quellcodes der VCL-Klassen anfangen, den Destruktor, den du aufrufst, zu debuggen. Vielleicht schlägt in dem irgendwas fehl.


Hey mann ich habs rausgefunden!

Das Debuggen ging eben nicht, weil ich eine Componente zum Testen da habe von der ich nicht den
SourceCode habe!

Aber es war folgendes! Ich habe, obwohl noch keine DB Verbindung besteht den PlannerDatePicker.Calendar schon auf
Active := True gesetzt und da tritt die Zugriffsverletzung bei Free auf!


Trotzdem Danke Jungs! :wink: