Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TApplication für Komponente (https://www.delphipraxis.net/91881-tapplication-fuer-komponente.html)

xZise 11. Mai 2007 10:09


TApplication für Komponente
 
Wie kann ich auf "Application.Terminated" und "Application.ProcessMessages" von einer Komponente aus zugreifen?

Bernhard Geyer 11. Mai 2007 10:16

Re: TApplication für Komponente
 
Uses-Anweisung um Forms ergänzen?

Robert Marquardt 11. Mai 2007 10:38

Re: TApplication für Komponente
 
Warum? Wer Application.ProcessMessages in einer Komponente braucht hat die VCL nicht richtig verstanden.

Bernhard Geyer 11. Mai 2007 10:48

Re: TApplication für Komponente
 
Zitat:

Zitat von Robert Marquardt
Warum? Wer Application.ProcessMessages in einer Komponente braucht hat die VCL nicht richtig verstanden.

Dast stimmt natürlich auch.
Mit Application.ProcessMessages kann man in teufels Küche kommen wenn man nicht aufpasst und sich "versehentlich" während Berechnungen das berechnende Objekt löschen.

xZise 11. Mai 2007 13:33

Re: TApplication für Komponente
 
Okay... ProcessMessages ist wirklich ungünstig ;) Dass kann dann der Nutzer machen. Oder ich lagere es in einen Thread aus.
Aber ich bräuchte noch terminated, weil ich eine Pseudo-Endlosschleife habe ...

Robert Marquardt 11. Mai 2007 13:37

Re: TApplication für Komponente
 
Wieso? Wenn du die Arbeit in einen Thread auslagerst, dann beendest du den Thread natuerlich im Destruktor.

xZise 11. Mai 2007 14:30

Re: TApplication für Komponente
 
Hab ich nicht klug gesagt ^^ ich meinte damit, die Threadlose möglichkeit ;)

pertzschc 11. Mai 2007 15:34

Re: TApplication für Komponente
 
Zitat:

Zitat von Robert Marquardt
Warum? Wer Application.ProcessMessages in einer Komponente braucht hat die VCL nicht richtig verstanden.

Könntest Du bitte das nochmal erklären, was Deiner Meinung nach das Problem der Verwendung von Application.ProcessMessages in einer Komponente ist?
Mich würden Details ernsthaft interessieren.

Danke,
Christoph

marabu 11. Mai 2007 16:25

Re: TApplication für Komponente
 
Hallo Christoph,

Robert hat das sicher nicht so pauschal gemeint, wie er es geschrieben hat. Kernstück der Indy AntiFreeze Komponente ist beispielsweise Application.ProcessMessages und auch die VCL-Macher haben bei der Kapselung der IDAPI-Schnittstelle einen entsprechenden Herzschrittmacher eingebaut. Tatsache ist, dass man für sowas sehr gute Gründe haben und genau verstehen sollte, was man da tut. Normalerweise werden die Methoden einer Komponente so entworfen, dass sie in kürzest möglicher Zeit die Nachrichten des Dispatchers abarbeiten und die Kontrolle wieder zurückgeben.

Freundliche Grüße

Robert Marquardt 11. Mai 2007 17:16

Re: TApplication für Komponente
 
Die Gemeinheit bei Application.ProcessMessages ist das eben Messages verarbeitet werden. Die eine oder andere Komponente mag es ueberhaupt nicht wenn das passiert. Ltztlich werden alle Methoden/Events von anderen Methoden aufgerufen. Man kann da in garstige Rekursionen laufen. Zusatzlich kann es sehr lange dauern bis ProcessMessages abgearbeitet ist.
Man sollte also ProcessMessages meiden. Eine Komponente sollte passiv am Tropf der Messages haengen. Hintergrundarbeiten macht ein Thread.

shmia 11. Mai 2007 17:23

Re: TApplication für Komponente
 
Ich kann mich meinen Vorrednern nur anschliesen. Du könntest der Komponente ja ein Event (vom Typ TNotifyEvent) namens OnWork hinzufügen und regelmässig abfeuern.
Somit kann der Benutzer deiner Kompo selbst entscheiden, was er damit anfangen möchte.
Vielleicht möchte er ja einen PrograssBar bewegen und dann ProccessMessages aufrufen.

Keinesfalls solltest du ProcessMessages direkt aus deiner Komponente aufrufen.
Dies vermeidet ausserdem, dass du die Unit Forms einbinden musst, was ja bei Konsolenanwendungen unerwüscht wäre.

pertzschc 11. Mai 2007 23:07

Re: TApplication für Komponente
 
Danke für die Erläuterungen!!

Gruß,
Christoph


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 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-2025 by Thomas Breitkreuz