Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Event-Typen und warum deren Inhalte manchmal nicht stimmen (https://www.delphipraxis.net/137518-event-typen-und-warum-deren-inhalte-manchmal-nicht-stimmen.html)

BAMatze 22. Jul 2009 15:00


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:
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;
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.

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

hazard999 22. Jul 2009 15:10

Re: Event-Typen und warum deren Inhalte manchmal nicht stimm
 
probiers mal mit FOnTischChange

himitsu 22. Jul 2009 15:13

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:

probiers mal mit FOnTischChange
klar wäre es besser, wenn intern auch die internen Möglichkeiten genutzt würden,
aber dennoch würde das hier nix ändern, da eh direkt auf die Variable zugegriffen wird.

BAMatze 24. Jul 2009 06:48

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

alzaimar 24. Jul 2009 06:52

Re: Event-Typen und warum deren Inhalte manchmal nicht stimm
 
Besorge Dir FastMM, lies Dir die Gebrauchsanweisung gut durch, verwende es und fertig.

BAMatze 24. Jul 2009 07:27

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 (FastMM4 von SourceForge und Optionssoftware für FastMM). Allerdings ergeben sich hier noch ein paar Fragen, weil ich gelesen hab, dass FastMM ab D2007 wohl schon der Standardmanager sein soll (kann das aber auch falsch verstanden haben). Zumindest kann man wohl mit:
Delphi-Quellcode:
{$WARN SYMBOL_PLATFORM OFF}
  {$IF RTLVersion > 15.0}
   ReportMemoryLeaksOnShutDown := DebugHook<>0;
  {$IFEND}
{$WARN SYMBOL_PLATFORM ON}
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)?

Bernhard Geyer 24. Jul 2009 07:33

Re: Event-Typen und warum deren Inhalte manchmal nicht stimm
 
Zitat:

Zitat von BAMatze
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)?

Die Sourceforge-Version ist neuern Datums. Schau doch mal was in der Release-Info (FastMM4Options.inc) steht was seit dem Release-Datum von D2007 neues dazu gekommen ist.

himitsu 24. Jul 2009 07:37

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:
{$IF Declared(ReportMemoryLeaksOnShutDown}
  ReportMemoryLeaksOnShutDown := DebugHook <> 0;
{$IFEND}
willst du alle Features (Speicheranalyse, besseren Fehlerreport usw.) nutzen, dann mußt du dir aber ein "vollständiges" FastMM installieren.

Uwe Raabe 24. Jul 2009 07:53

Re: Event-Typen und warum deren Inhalte manchmal nicht stimm
 
Zitat:

Zitat von BAMatze
Ich habe schon das OnTischChange := nil gesetzt und trotzdem bleibt assigned(OnTischChange) = false.

Was anderes wäre auch mehr als seltsam!

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.

BAMatze 24. Jul 2009 08:01

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 10:00 Uhr.
Seite 1 von 3  1 23      

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