![]() |
Wozu TNotifyEvent oder TEvent?
Hi
Ich beschäftige mich grad mit threads, events und windows messages. Jetzt stell ich mir die Frage wozu ist ein TNotifyEvent gut? Von dem Methoden ist mir klar man kann hald mit waitforsingleobjekt darauf warten aber viel mehr, als das setzen einer boolean variable ist das doch eigentlich auch nicht oder?. Wozu wird das also verwendet? - die Frage stell ich mir eigentlich. Arnulf |
Re: Wozu TNotifyEvent oder TEvent?
Ein TNotifyEvent ist einfach Ereignistyp folgender Form:
Delphi-Quellcode:
Wo genau liegt den Dein Problem?
procedure (Sender : TObject) of object
|
Re: Wozu TNotifyEvent oder TEvent?
Hi,
![]() Welchen Zusammenhang Du da beschreibst, verstehe ich jedoch nicht... mfG mirage228 |
Re: Wozu TNotifyEvent oder TEvent?
Naja eigentlich ist es genau das was ich machen will.
Aber ganz verstehen tu ich es nicht. Ich möchte ein event für ein objekt generieren. In meinem fall ein OnProgressBar - hier soll der bentzer einfach seine prozedur aufrufen können die eine ProgressBar weiterschiebt. Übergeben bekommt er nur den fortschritt in form eines integers. Ich versteh einfach den ganzen zusammenhang nicht. Ich kann doch einfach das OnProgressBar als prozedur in mein objekt einfügen, und der user kann doch von dort aus seine Progress Bar weiterschieben. Ich bekomm einfach gedanklich die kurfe nicht, deshalb hab ich gehofft jemand erklärt mir wozu das genau gut ist. Danke Arnulf |
Re: Wozu TNotifyEvent oder TEvent?
Es gibt zwei Richtungen.
1. der Benutzer/das Programm möchte die Position des Progressbar von Hand setzen Dies hat nix mit Events zu tun Du setzt einfach den Progress-Wert 2. Die Progressbat möchte Dir mitteilen, wie der Fortschritt gerade steht. Du registrierst Dich bei der ProgressBar für das OnProgressBar -Event indem Du der Eigenschaft OnProgressBar eine Funktion mit dem entsprechenden Aufbau zuweist - z.B. eine TNotifyEvent-Methode |
Re: Wozu TNotifyEvent oder TEvent?
eher nr 2 :)
Ok ich werd mal spezieller genau mein beispiel hald - und warum ich mich frag wozu das genau gut ist. Ich hab einen thread laufen der eine video abspielt. jetzt möchte ich eine ProgressBar im Hauptprogramm weiterschieben. Bisher übergeb ich einfach die absolute position indem ich vom Thread aus mit Syncronize die ProgressBar Procedur aufrufe. Wenn ich das allerdings jetzt in ein objekt oder ein component kapseln will, dann wäre doch eine OnProgressBar methode am bessten. Aber wozu brauch ich ein Event, wenn ich doch sowieso vom Thread aus die Prozedur aufrufen kann bzw. muß. Was ich bisher verstanden hab, geht es nur darum, daß der user meines objekts den pointer auf seine eigene prozedur umleiten kann - oder wie jetzt??? Noch hat es nicht klick gemacht tut leid :) Arnulf |
Re: Wozu TNotifyEvent oder TEvent?
:gruebel: alles etwas wirr
Delphi-Quellcode:
Das funktionier ohne Events.
Bisher übergeb ich einfach die absolute position indem ich vom Thread aus mit Syncronize die ProgressBar Procedur aufrufe.
Wenn ich es richtig verstanden habe, möchtest Du die OnProgressBar-Methode in ein eigenes Objekt packen. Gut, geht auch. was soll den in der OnProgressBar passieren? Die Position der Bar setzt Du ja schon im Thread. |
Re: Wozu TNotifyEvent oder TEvent?
Naja gedacht ist das eigentlich als Video Player objekt ohne GUI.
Also das GUI kann jeder selbst programmieren. Deshalb möchte ich ja von dem Thread aus ein ProgressBar.Progress und ein ProgressBar.Max in absoluten zahlen also sekunden übergeben. Das sollen ja nur methoden sein mit der man dann seine eigene Progress Bar in das Programm einbauen kann. Der Thread kümmert sich ja nur ums abspielen und liefert infos bzw. hald events die von einer Progressbar benötigt werden. Ich würde das ganze hald letzten endes gerne als component programmieren, deshalb schau ich mich bei allen methoden die etwas damit zu tun haben einmal um. Und darum frag ich mich hald auch wozu ist TNotifyEvent den wirklich da? Deshalb klingt das: Zitat:
Arnulf |
Re: Wozu TNotifyEvent oder TEvent?
Hi Arnulf,
es ist doch so, dass die Komponente völlig unabhängig von deiner Applikation agieren soll. Also soll sie von einer ProgressBar gar nichts wissen. Kann ja sein, der Entwickler benutzt eine ganz andere, nicht von TProgressBar abgeleitete Komponente. Also soll er darüber informiert werden, wann die Progressbar neu gezeichnet werden soll.
Delphi-Quellcode:
Eine andere Alternative wäre, ein Published Property vom Typ TProgressBar.
unit Unit2;
interface uses Classes; type TMyVideoObject = class(TComponent) private FOnProgressBarPosChange: TNotifyEvent; FProgressBarPos: Integer; FProgressBarSteps: Integer; procedure doProgressBarPosChange; published // nur Lesen Property zum Setzen der PB property ProgressBarPos: Integer read FProgressBarPos; // Max - Wert der Progressbar, also - setze ich auf 100, so muss meine Komponente // das Ereignis insgesamt 100 mal auflösen property ProgressBarSteps: Integer read FProgressBarSteps write FProgressBarSteps; // mein Event, welches der Entwickler per OI setzen kann // damit er die PB weiter setzen kann property OnProgressBarPosChange: TNotifyEvent read FOnProgressBarPosChange write FOnProgressBarPosChange; end; implementation // du musst dafür sorgen, dass eben in sinnvollen bzw. // entsprechend der Propertys eingestellten Schritten // in deinem Code doProgressBarPosChange aufgerufen wird. // und natürlich musst du FProgressBarPos auch setzen. procedure TMyVideoObject.doProgressBarPosChange; begin if Assigned(FOnProgressBarPosChange) then FOnProgressBarPosChange(Self); end; end. Da kannst du dich dann um das setzten selbst kümmern. Gruß, Frank |
Re: Wozu TNotifyEvent oder TEvent?
Also ich hab in einer Komponente eine Progressbar eingefügt, das sieht so aus:
Delphi-Quellcode:
Wenn du die Komponente jetzt im Objektinspektor anschaust kannst du eine Progressbar zuweisen, d.h. du nimmst eine Progbar, ziehst die auf die Form und wählst dann in der Progressbareigenschaft deine Progbar aus(wie bei "Menu" bei der Form)
private
FProgressBar: TProgressBar; published property ProgressBar: TProgressBar read FProgressBar write SetProgressBar; procedure TKomponente.SetProgressBar(const Value: TProgressBar); begin if FProgressBar <> Value then begin FProgressBar := Value; if Value <> nil then Value.FreeNotification(Self); end; end; das müsste bei einem Objekt auch gehen, die musst dann eben per Code das ganze zuweisen
Delphi-Quellcode:
im Objekt selber kannst du dann der FProgressbar die Werte zuweisen die dann im Programm von der Progressbar1 übernommen werden.
Kompo.Progressbar:=Progressbar1
Mfg :angel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 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 by Thomas Breitkreuz