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 2 von 3     12 3      
Benutzerbild von himitsu
himitsu
Online

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

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

  Alt 24. Jul 2009, 09:22
ups

$if Declared() und nicht $if Defined()
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
BAMatze

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

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

  Alt 24. Jul 2009, 09:45
jupp jetzt funktioniert es.

ist die FastMM4_Readme.txt = Anleitung?

Edit1: ok hab mich jetzt zumindest mal durch alle Anleitungen durchgewurschtelt, die ich hier gefunden hab und auch die Event-Log-Datei erstellt bekommen. Ich glaube gelesen zu haben, dass man diese von unten lesen soll und werde auch versuchen, mittels Auskommentieren, die Probleme zu finden und somit zu beseitigen. Bei einigen Speicherlecks steht ja auch glücklicher Weise drin, wo sie Auftreten, also die Unit.
Hänge mal die Log hier an, vieleicht kann ja mal jemand schauen, ob so ein Fehler drin ist (weiß ja nicht, ob man sowas auf einen Blick erkennt), der mir die Probleme bereitet, die zur Post-Topic gehören.

Vielen Dank
BAMatze
Angehängte Dateien
Dateityp: txt eventlog_212.txt (25,2 KB, 4x aufgerufen)
2. Account Sero
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.465 Beiträge
 
Delphi 12 Athens
 
#13

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

  Alt 24. Jul 2009, 16:26
Ich vermute du hast nicht ganz verstanden was Uwe Raabe dir sagen wollte:
if Assigned(OnTischChange) then OnTischChange; FOnTischChange wird abgerufen und sofort ausgeführt.
Dann wird geprüft ob das nicht vorhandene Funktionsergebnis ungleich nil ist.
Sollte das der Fall sein, wird FOnTischChange erneut abgerufen und ausgeführt.

if Assigned(FOnTischChange) then FOnTischChange; Es wird geprüft ob FOnTischChange ungleich nil ist.
Sollte das der Fall sein, wird FOnTischChange ausgeführt.

Deshalb führt die erste Variante zur Zugriffsverletzung.

Unabhängig davon würde ich jedem Event immer den Sender mitliefern.
  Mit Zitat antworten Zitat
BAMatze

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

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

  Alt 25. Jul 2009, 19:45
Ah ok dann werde ich die Variante auch nochmal testen am Montag. Wobei der Hinweis mit den Speicherlecks und so ja wie ich sehe auch berechtigt war.

Vielen Dank
BAMatze
2. Account Sero
  Mit Zitat antworten Zitat
BAMatze

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

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

  Alt 27. Jul 2009, 08:08
Also hab heute mal beide Varianten nochmal durchprobiert, sowohl:

if assigned(OnTischChange) then OnTischChange; also auch

if assigned(FOnTischChange) then FOnTischChange; Bei beiden gibt der Debugger als Wert für FOnTischChange/ OnTischChange eine Zugriffsverletzung bei 00000000 aus. Sieht für mich aus, als wenn er sie gar nicht erzeugt. Hab nochmal direkt in die Komponente, in der ich dieses Event implementieren will geschaut und die dcu-Datei kontrolliert, ob sie im Verzeichnis liegt, wo Delphi drauf zugreift. Das scheint zu passen.

Kann es aber trotzdem sein, dass dort ein Problem mit dem Erzeugen des Events vorliegt?

BAMatze

Edit 1: Der Fehler hat sich gerade erledigt. Habe die Komponente nach dem Motto "keep it simple" in eine leere Form mal gezogen und und das Event getestet. Dort funktioniert es wunderbar. Darauf hin habe ich auch im großen Projekt nochmal die Procedure aus dem Objektinspektor und aus der Deklaration gelöscht. Alles kompilieren lassen, so dass die Event-Prozeduren auch wirklich weg waren und dann nochmal neu erzeugen lassen. Jetzt gibt es keine Probleme und das Event wird so erzeugt, wie ich das möchte. Bleibt eigentlich noch nur die Frage: Ist die Auslösung des Events mit OnTischChange (ist die published Variable) oder FOnTischChange (die private Variable)richtig, auf die OnTischChange eigentlich zurück greift? Denke mal FOnTischChange, sonst könnte man die private Variable ja ganz weg lassen, allerdings bin ich da überhaupt nicht sicher.
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

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

  Alt 27. Jul 2009, 08:37
Zitat von BAMatze:
Bleibt eigentlich noch nur die Frage: Ist die Auslösung des Events mit OnTischChange (ist die published Variable) oder FOnTischChange (die private Variable)richtig, auf die OnTischChange eigentlich zurück greift? Denke mal FOnTischChange, sonst könnte man die private Variable ja ganz weg lassen, allerdings bin ich da überhaupt nicht sicher.
Die (meiner Meinung nach) beste Art einen Event auszulösen ist eine eigene Methode (protected oder public), die das erledigt. Da das private Feld FOnTischChange (auf das man sicher nicht verzichten kann, da es den Methodenzeiger speichert!) wäre für abgeleitete Klassen nicht zugänglich - somit könnten diese den Event auch nicht auslösen. Daher:

Delphi-Quellcode:
procedure TTischSteuerung.TischChange;
begin
  if Assigned(FOnTischChange) then FOnTischChange;
end;
Uwe Raabe
  Mit Zitat antworten Zitat
BAMatze

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

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

  Alt 27. Jul 2009, 09:42
Das ist schonmal gut zu wissen. Meine Erfahrung besteht ja eigentlich nur daraus, dass ich einige Varianten hier aus der DP genommen hab, die ich gefunden (oder genannt bekommen) habe und dann ausprobiert (wobei meistens noch mindestens so viele Fehler aufgetreten sind, dass ich hier nochmal nachfragen musste). Habe dich jetzt so verstanden, dass ich meine Komponente wie folgt abändern sollte:

Delphi-Quellcode:
Type TTischsteuerung = class(TWinControl)
  private
    ...
    //Variablen für Events
    FOnTischChange: TOnTischChange;
    ...
  protected
    //Events
    // OnTischChange soll dem Programm die Möglichkeit geben alle Eigenschaften auf den
    // ausgewählten Tisch auszurichten.
    property OnTischChange: TOnTischChange read FOnTischChange write FOnTischChange;
    ...
  published
    ...
  public
    //alternativ könnte auch die property OnTischChange hier aufgeführt sein
    ...
end;

// Rest wie am Anfang des Threats, außer dass if assigned(OnTischChange) then OnTischChange; in if assigned(FOnTischChange) then FOnTischChange; geändert wird
2. Account Sero
  Mit Zitat antworten Zitat
TheReaper

Registriert seit: 27. Feb 2003
Ort: chemnitz
90 Beiträge
 
Delphi 2005 Personal
 
#18

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

  Alt 27. Jul 2009, 12:14
Zitat von BAMatze:
Das ist schonmal gut zu wissen. Meine Erfahrung besteht ja eigentlich nur daraus, dass ich einige Varianten hier aus der DP genommen hab, die ich gefunden (oder genannt bekommen) habe und dann ausprobiert (wobei meistens noch mindestens so viele Fehler aufgetreten sind, dass ich hier nochmal nachfragen musste). Habe dich jetzt so verstanden, dass ich meine Komponente wie folgt abändern sollte:
Naja, falsch ist es nicht aber auch nicht wirklich richtig. Ich nutze immer eine do-Procedur um events zu triggern. Außerdem sollte Immer der Sender mit angegeben werden.
Delphi-Quellcode:
{$M+}

TOnTischChange = procedure(Sender: TObject) of object;

Type TTischsteuerung = class(TWinControl)
  private
    ...
    //Variablen für Events
    FOnTischChange: TOnTischChange;
    ...
  protected
    // die event auslöser
    procedure doTischChange;
    ...
  published
    property OnTischChange: TOnTischChange read FOnTischChange write FOnTischChange;
    ...
  public
    //alternativ könnte auch die property OnTischChange hier aufgeführt sein
    ...
end;

procedure TTischsteuerung.doTischChange;
begin
  if Assigned(FOnTischChanged) then
    FOnTischChanged(self);
end;

procedure TTischsteuerung.foo
begin
  ...
  // Event(s) auslösen
  doTischChange;
  ...
end;
Das Ganze sieht erstmal etwas komplizierter aus aber es bringt viele Vorteile beim erweitern oder debuggen. Außerdem macht es Borland genauso.
  Mit Zitat antworten Zitat
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#19

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

  Alt 27. Jul 2009, 12:45
möchte mich mal kurz hier einklinken, hoffe dass ich damit nicht gegen eine Regel verstoße.

warum verwendet ihr
TOnTischChange = procedure(Sender: TObject) of object; für den Event und nicht TNotifyEvent

Danke und Gruß Dieter
  Mit Zitat antworten Zitat
TheReaper

Registriert seit: 27. Feb 2003
Ort: chemnitz
90 Beiträge
 
Delphi 2005 Personal
 
#20

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

  Alt 27. Jul 2009, 13:16
Zitat von Optiplex:
möchte mich mal kurz hier einklinken, hoffe dass ich damit nicht gegen eine Regel verstoße.

warum verwendet ihr
TOnTischChange = procedure(Sender: TObject) of object; für den Event und nicht TNotifyEvent

Danke und Gruß Dieter
Weil es hier nur um das Prinzip von Events geht und TNotifyEvent und ähnliches steht nicht zum Thema.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 19:57 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