![]() |
Event-Typen und warum deren Inhalte manchmal nicht stimmen
Hallo,
Hab nochmal eine Verständnisfrage zu Events. Lustiger Weise funktionieren sie irgendwann genau immer so, wie ich das will aber hab hier zum x.ten mal Anfangschwierigkeiten bei dem Einfügen eines neuen Events. Folgender Maßen führe ich in eine meiner Komponenten die Events ein:
Delphi-Quellcode:
Also ich habe sicherlich in der Art und Weise schon mehrfach Events eingeführt und irgendwie funktioniert das am Anfang immer überhaupt nicht (so wie jetzt) und irgendwann ohne für mich ersichtlichen Grund (derzeit) funktioniert es. Ich habe schon das OnTischChange := nil gesetzt und trotzdem bleibt assigned(OnTischChange) = false.
Type TOnTischChange = procedure of Object;
Type TTischsteuerung = class(TWinControl) private ... // Variablen für Events FOnTischChange: TOnTischChange; published // OnTischChange soll dem Programm die Möglichkeit geben alle Eigenschaften auf den // ausgewählten Tisch auszurichten. property OnTischChange: TOnTischChange read FOnTischChange write FOnTischChange; ... end; ... // irgendwo in der createwnd-Procedure FCombBoxTischauswahl := CreateComboBox(17,35, 200); FCombBoxTischauswahl.Items.Add('Test1'); FCombBoxTischauswahl.Items.Add('Test2'); FCombBoxTischauswahl.Items.Add('Test3'); FCombBoxTischauswahl.ItemIndex := 0; FCombBoxTischauswahl.OnChange := Tischaenderung; // Die Procedure Tischaenderung procedure TTischsteuerung.Tischaenderung(Sender: TObject); begin case FCombBoxTischauswahl.ItemIndex of 0: Komponentenanpassung(1); 1: Komponentenanpassung(2); 2: Komponentenanpassung(3); end; if assigned(OnTischChange) then OnTischChange; end; Der Sinn hinter dem Event ist eigentlich, dass ich in meinem Composite Control das onChange-Event der Combonox weitergeben will. Dafür habe ich auch schon die Komponente deinstalliert und neu installiert (verwende hier auf Arbeit Rad2007, nicht wie in Profil TD2006). Kann mir jemand vieleicht sagen, warum das anscheinend derart flüchtig ist, was aus assigned(On...) herauskommt? Vielen Dank BAMatze |
Re: Event-Typen und warum deren Inhalte manchmal nicht stimm
probiers mal mit FOnTischChange
|
Re: Event-Typen und warum deren Inhalte manchmal nicht stimm
Ganz ehrlich:
* an dem hier gezeigtem Code kann ich keinen Fehler finden, welcher dieses Problem erklären würde * und ich äußere meine Vermutung gern nochmal (hab so langsam das Gefühl), wenn ich hier und da den einen oder anderen Post/Thread lese: ein Bufferoverrun, bzw. ein verirrter Pointer oder Ähnliches, würden dieses Verhalten erklären. Zitat:
aber dennoch würde das hier nix ändern, da eh direkt auf die Variable zugegriffen wird. |
Re: Event-Typen und warum deren Inhalte manchmal nicht stimm
Hallo @himitsu und alle anderen natürlich auch,
Gibt es für mich als Anfänger da eine Möglichkeit eine Art Fehleranalyse zu machen, ohne den Quellcode Schritt für Schritt noch einmal durchzugehen (der Debugger an sich bringt mir ja keinen Fehler)? Ich glaube gelesen zu haben, dass es für Speicherlecks etwas in der Art gibt. Leider ist das Programm mittlerweile doch so groß, dass eine direkte Suche ohne Anhaltspunkt sehr lange dauern würde. Vielen Dank BAMatze |
Re: Event-Typen und warum deren Inhalte manchmal nicht stimm
Besorge Dir FastMM, lies Dir die Gebrauchsanweisung gut durch, verwende es und fertig.
|
Re: Event-Typen und warum deren Inhalte manchmal nicht stimm
@alzaimar: Danke schonmal, dass scheint genau das zu sein, was ich jetzt brauche. habe hier und in Google mal geschaut und folgende 2 Sachen gefunden (
![]() ![]()
Delphi-Quellcode:
Speicherlecks ohne Installation von FastMM finden/ erkennen. Ich verwende hier auf Arbeit D2007 für Win32 Professional. Muss ich jetzt das FastMM installieren (oder ist es eventuell nicht nötig, weil es ja schon der Standardmanager ist)?
{$WARN SYMBOL_PLATFORM OFF}
{$IF RTLVersion > 15.0} ReportMemoryLeaksOnShutDown := DebugHook<>0; {$IFEND} {$WARN SYMBOL_PLATFORM ON} |
Re: Event-Typen und warum deren Inhalte manchmal nicht stimm
Zitat:
|
Re: Event-Typen und warum deren Inhalte manchmal nicht stimm
eine etwas abgespeckte FastMM-Version ist bei dir schon im Delphi drinnen
Codegear hatte den alten DelphiMM durch eine einfachere/schnellere FastMM-Version ersetzt. falls du dir mit der Version nicht sicher bist, dann geht auch dieses:
Delphi-Quellcode:
willst du alle Features (Speicheranalyse, besseren Fehlerreport usw.) nutzen, dann mußt du dir aber ein "vollständiges" FastMM installieren.
{$IF Declared(ReportMemoryLeaksOnShutDown}
ReportMemoryLeaksOnShutDown := DebugHook <> 0; {$IFEND} |
Re: Event-Typen und warum deren Inhalte manchmal nicht stimm
Zitat:
Events sind Zeiger auf Methoden. Durch die Zuweisung "OnTischChange := <irgendwas>" weist du diesem Zeiger eine Methode zu, bei "OnTischChange := nil" wird auf keine Methode verwiesen. Da Methoden auch Funktionen mit Rückgabewerten sein können, würde ein Vergleich "if OnEvent <> nil then" nicht prüfen, ob OnEvent eine Methode zugewiesen ist, sondern ob das Funktionsergebnis von OnEvent ungleich nil ist. Daher gibt es die Funktion Assigned, die prüft, ob ein Pointer (in diesem Fall eine Methodenzeiger) auf einen (hoffentlich) gültigen Wert zeigt oder nicht. Bei Klassen-Instanzen oder Pointer auf Records oder einfache Typen ist Assigned(P) das Gleiche wie (P <> nil). Bei Methodenzeigern geht das aus oben genannten Gründen nicht. Und nun sollte auch klar sein, warum nach einem "OnTischChange := nil" natürlich "Assigned(OnTischChange) = false" sein muss. |
Re: Event-Typen und warum deren Inhalte manchmal nicht stimm
Liste der Anhänge anzeigen (Anzahl: 1)
Jetzt bin ich glaube ich vollends verwirrt :shock:
Hab ebend den von himitsu geposteten Quellcode verwendet Resultat -> keine Fehlermeldung nach Beenden des Programmes *grübel Vorher hatte ich den von mir geposteten Quellcode drin Resultat siehe Bild im Anhang. Hab ich da irgendwas übersehen oder falsch gemacht? @Uwe Raabe: Ah gute Erklärung, danke dir dafür. Das mit dem nil, war auch nur mal ein Versuch und ist nach dem nicht funktionieren gleich wieder aus dem Quellcode geflogen und die Implementierung des Events entspricht somit der oben geposteten Variant und funktioniert leider immer noch nicht. :evil: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz