AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Assigned

Ein Thema von Pseudemys Nelsoni · begonnen am 26. Aug 2004 · letzter Beitrag vom 12. Sep 2004
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

Assigned

  Alt 26. Aug 2004, 11:30
hoi,

ja ich weiss, wurde in einem anderem thread (nebenbei) erklärt, aber ich versteh diese funktion nicht ganz....das heisst wie sie funktioniert weiss ich schon, nur die verwendung versteh ich bei einigen sachen nicht. Gerade in der klassenprogrammierung wie z.b das hier:

Delphi-Quellcode:
procedure TNumEdit.KeyPress(var Key: Char);
begin
  if not Key in ['0'..'9'] then
  begin
    if Assigned(OnFehler) then
      OnFehler(Self);
    key:=#0;
  end;
  inherited KeyPress(Key);
end;
( Source: http://www.delphi-treff.de/content/t...dex.php4?kat=6 )


ich weiss das assigned true ist wenn OnFehler nicht nil ist, aber ich verstehe nie WANN hier OnFehler nil ist und wann nicht und wie es hier geprüft wird...ich verstehs irgendwie alles nich mit dieser doofen funktion
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#2

Re: Assigned

  Alt 26. Aug 2004, 11:42
Hallo,

Eine Membervariable einer Klasse ist von "Natur aus" nicht zugewiesen. D.h. Integers sind 0, Strings sind Leerstrings und Pointer sind nil, usw ...

Die Funktion Assigned überprüft jetzt, ob der Parameter <> nil ist.
Der Pointer OnFehler ist also am Anfang nil. Wenn er erstmalig zugewiesen wird, zeigt er nicht mehr auf nil, sondern irgendwo in den Speicher. Jetzt gibt Assigned(OnFehler) true zurück.

Nachdem du das nächste mal OnFehler nil zuweist, wird Assigned wieder false zurückgeben.

Wenn du jetzt allerdings ein erzeugtes Objekt mit Free freigibst, wird Assigned trotzdem true zurückliefer, weil der Pointer noch irgendwo in den Speicher zeigt.

z.B.
Delphi-Quellcode:
var Liste : TStringlist;
begin
  Liste := TStringlist;

  Liste.Free;

  if Assigned(Liste) then begin
    Liste.Add('abc'); //<-- hier gibts ne AV
  end;
end;
Deshalb sollte man statt .Free FreeAndNil() verwendet, weil es der Variable gleich nil zuweist.

Ich hoffe das war verständlich.

grüße, daniel

[EDIT] Hoppla, bei den Tags verklickt [/EDIT]
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Assigned

  Alt 26. Aug 2004, 11:43
OnFehler ist wohl ein Event. Events sind nichts weiter als Zeiger auf Methoden, die meist als Properties implementiert sind. Beim Erzeugen des Objekts existieren keine Ereignisbehandlungsroutinen, OnFehler ist also nil. Erst wenn eine Behandlungsroutine gesetzt wird (MyObject.OnFehler := MyEventHandler), ist Onfehler nicht mehr nil. Durch die Prüfung mit Assigned wird Onfehler also nur aufgerufen, wenn es auch gesetzt ist.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von Treffnix
Treffnix

Registriert seit: 25. Jun 2003
Ort: AC
740 Beiträge
 
Delphi 7 Professional
 
#4

Re: Assigned

  Alt 26. Aug 2004, 11:45
OnFehler wird ein Event der Klasse TNumEdit sein. Das heisst, es ist eine Procedure of object, die von ausserhalb erst zugewiesen werden kann ( nicht muss ).

Beispielsweise wie das onClick eines Buttons.
Wenn dem Ereignis keine Prozedur zugeordnet ist, ist das Event nil. Würde man versuchen eine nichtexistente Prozedur aufzurufen, gäbs ne Exception. Daher muss man das vorher prüfen.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#5

Re: Assigned

  Alt 26. Aug 2004, 11:57
Hallo Sanchez,

danke für die ausführliche beschreibung, soweit hatte ich das auch schon verstanden. Ich verstehe es nur nicht wieso es in meinem beispiel benutzt wird (klar verstehe ich es das assigned da prüft ob OnFehler<>nil ist)... ich kapiers irgendwie nicht....fragen wir mal anders...wieso sollte der geprüfte methodenzeiger denn nil sein? sorgt man beim programmieren nicht sowieso vorher dafür das das ding irgendwo hinzeigt bevor man es benutzt(womit aissgned überflüssig wäre)?

Zitat:
OnFehler ist wohl ein Event. Events sind nichts weiter als Zeiger auf Methoden, die meist als Properties implementiert sind. Beim Erzeugen des Objekts existieren keine Ereignisbehandlungsroutinen, OnFehler ist also nil. Erst wenn eine Behandlungsroutine gesetzt wird (MyObject.OnFehler := MyEventHandler), ist Onfehler nicht mehr nil. Durch die Prüfung mit Assigned wird Onfehler also nur aufgerufen, wenn es auch gesetzt ist.
wer setzt denn OnFehler? ich dachte eigentlich das man das bereits in der klasse alles drin hat hm.

Zitat:
OnFehler wird ein Event der Klasse TNumEdit sein. Das heisst, es ist eine Procedure of object, die von ausserhalb erst zugewiesen werden kann ( nicht muss ).
was heisst das von ausserhalb? wenn ich z.b eine komponente habe , dann im OI irgendeinem ereignis ein code hinzufüge...ist das mit zuweisen gemeint?

Delphi-Quellcode:
Beispielsweise wie das onClick eines Buttons.
Wenn dem Ereignis keine Prozedur zugeordnet ist, ist das Event nil. Würde man versuchen eine nichtexistente Prozedur aufzurufen, gäbs ne Exception. Daher muss man das vorher prüfen.
Genau das ist irgendwie meine Frage, wieso sollte ich in meiner klasse versuchen die prozedur aufzurufen wenn sie nicht da ist. ich meinte wer tut denn das hmmm.

hab da so ne theorie... ist das so gemeint, das wenn ich bei einem button z.b kein OnClick ereignis definiert habe und dann versuche mit button1.click die procedure aufzurufen? oder wie?

danke für eure antworten
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von Treffnix
Treffnix

Registriert seit: 25. Jun 2003
Ort: AC
740 Beiträge
 
Delphi 7 Professional
 
#6

Re: Assigned

  Alt 26. Aug 2004, 12:04
Stell dir vor, TButton wurde von dir programmiert. Du weisst, wann der Benutzer auf den Button klickt. Was machst du nun? Du animierst den Button erstmal ein bisschen, damit es nach Klick aussieht und nun? Woher weisst du, was der Programmierer machen will, wenn einer auf den Button klickt? - Du schaust nach, ob dem OnClick-Event eine externe Prozedur zugewiesen ist. Wenn ja, rufst du sie auf.

Nichts anderes ist das bei dem OnFehler. Dem Event muss keine Prozedur zugewiesen sein, aber vielleicht will der Programmierer, der deine Komponente benutzt ja im Fehlerfall reagieren, z.B. eine Fehlermeldung ausgeben. Dann kann er dem Event eine Prozedur zuweisen, in der er das macht.
  Mit Zitat antworten Zitat
Benutzerbild von Steve
Steve

Registriert seit: 2. Mär 2004
Ort: Würzburg
730 Beiträge
 
Delphi 2006 Personal
 
#7

Re: Assigned

  Alt 26. Aug 2004, 12:04
Hi,

nimm als Beispiel mal TButton.OnClick her...

Solange Du dem OnClick nichts zuweist (z.B. PROCEDURE TForm1.Button1Click(Sender: TObject); ), wird bei einem Klick darauf nichts ausgeführt, da Assigned(OnClick)=NIL (Genauer: in TControl Assigned(FOnClick)) ist.

Gruß
Stephan

{edit: wiedermal zu langsam }
Stephan B.
Wer andern eine Grube gräbt ist Bauarbeiter!
Wer im Glashaus sitzt, sollte sich lieber im Dunkeln ausziehen!
Außerdem dieser Satz kein Verb...
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#8

Re: Assigned

  Alt 26. Aug 2004, 12:12
Zitat:
Du schaust nach, ob dem OnClick-Event eine externe Prozedur zugewiesen ist. Wenn ja, rufst du sie auf.
das meine ich ja, wann genau tu ich denn das? ich meine im OnClick selbst brauch ich das ja nicht prüfen ob assigned ist, weil doe prozedur ja nur aufgerufen wenn überhaupt etwas in der OnClick routine ist, oder?


Zitat:
Solange Du dem OnClick nichts zuweist (z.B. PROCEDURE TForm1.Button1Click(Sender: TObject); ), wird bei einem Klick darauf nichts ausgeführt, da Assigned(OnClick)=NIL (Genauer: in TControl Assigned(FOnClick)) ist.
gleiche frage wie oben, wo und wann wird das geprüft
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
woki

Registriert seit: 29. Mär 2003
563 Beiträge
 
Delphi 2006 Architect
 
#9

Re: Assigned

  Alt 26. Aug 2004, 12:14
Zitat von Pseudemys Nelsoni:
hab da so ne theorie... ist das so gemeint, das wenn ich bei einem button z.b kein OnClick ereignis definiert habe und dann versuche mit button1.click die procedure aufzurufen? oder wie?
Eben.

Hinter jedem Event im Objektinspector steht ein Methodenzeiger, fast alle davon sind nil, bzw sind nil bis du einen Eventhandler implementierst. Die Abfrage prüft also, ob ein Eventhandler, der ausgeführt werden soll, zugewiesen wurde. Diese Architektur macht Klassen viel flexibler einsetzbar, als wenn man immer eine neue Klasse ableiten müßte, um Änderungen bei der Behandlung von events zu implementieren. Und wie könnte soetwas wie Delphi sonst funktionieren?

Grüsse
Woki
  Mit Zitat antworten Zitat
Benutzerbild von Treffnix
Treffnix

Registriert seit: 25. Jun 2003
Ort: AC
740 Beiträge
 
Delphi 7 Professional
 
#10

Re: Assigned

  Alt 26. Aug 2004, 12:19
Zitat von Pseudemys Nelsoni:
das meine ich ja, wann genau tu ich denn das? ich meine im OnClick selbst brauch ich das ja nicht prüfen ob assigned ist, weil doe prozedur ja nur aufgerufen wenn überhaupt etwas in der OnClick routine ist, oder?
Eben. Sonst gibts nen Fehler. Und genau deshalb musst du das prüfen.
Du befindest dich aber ( im Beispiel ) innerhalb der TButton-Klasse. Das OnKlick ist ein Property, das von dir nach aussen gelegt wird. Und erst wenn jemand, der eine Instanz deiner Klasse erzeugt, diesem Property etwas zugewiesen hat, kannst du die zugewiesene Prozedur auch aufrufen. Im Falle des Buttons geschieht das, wenn du feststellst, dass der Benutzer mit der Maus auf deinen Button klickt. In deinem Beispiel wäre das sobald deine Klasse einen Fehler feststellt.
  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 21:44 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