| Autor |
Beitrag |
JRegier
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: 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
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 Christian S.: Delphi-Tags hinzugefügt.Moderiert von Christian S.: Topic aus VisualCLX (Component Library for Cross Platform) verschoben am Mo 29.08.2005 um 15:21
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 29.08.05 13:49
Udontknow hat folgendes geschrieben: | Hallo!
Welches Steuerelement wäre das?
Cu,
Udontknow |
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: 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 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Mo 29.08.05 13:59
Udontknow hat folgendes geschrieben: | Udontknow 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Mo 29.08.05 14:08
delfiphan 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Mo 29.08.05 14:13
JRegier 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 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Mo 29.08.05 15:05
tommie-lie hat folgendes geschrieben: | JRegier 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! 
|
|