AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Event-Typen und warum deren Inhalte manchmal nicht stimmen
Thema durchsuchen
Ansicht
Themen-Optionen

Event-Typen und warum deren Inhalte manchmal nicht stimmen

Ein Thema von BAMatze · begonnen am 22. Jul 2009 · letzter Beitrag vom 3. Aug 2009
Antwort Antwort
Seite 1 von 3  1 23      
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

Event-Typen und warum deren Inhalte manchmal nicht stimmen

  Alt 22. Jul 2009, 16:00
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
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von hazard999
hazard999

Registriert seit: 2. Okt 2008
38 Beiträge
 
#2

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

  Alt 22. Jul 2009, 16:10
probiers mal mit FOnTischChange
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 22. Jul 2009, 16:13
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.
$2B or not $2B
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#4

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

  Alt 24. Jul 2009, 07:48
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
2. Account Sero
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

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

  Alt 24. Jul 2009, 07:52
Besorge Dir FastMM, lies Dir die Gebrauchsanweisung gut durch, verwende es und fertig.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#6

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

  Alt 24. Jul 2009, 08:27
@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)?
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 24. Jul 2009, 08:33
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 24. Jul 2009, 08:37
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 24. Jul 2009, 08:53
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.
Uwe Raabe
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#10

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

  Alt 24. Jul 2009, 09:01
Jetzt bin ich glaube ich vollends verwirrt

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.
Miniaturansicht angehängter Grafiken
fastmmbericht_164.jpg  
2. Account Sero
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:18 Uhr.
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