![]() |
wieso hat jede anwendung in delphi zwei handles?
hallo
also mich wunderte jetzt, als ich ein programm geschrieben habe, welches alle handles auflistet, dass jedes von mir mit delphi geschriebene programm immer 2 handles hat. zum einen TApplication und zum andern beim Standard TForm1. dieses TForm1 kann ich ja im prinzip umbenennen, indem ich einfach den namen des Form1 änder. aber wie änder ich den den namen von TApplication? (sonst sieht ja jeder gleich: "ah mit delphi erstellt") und wieso hat jede anwendung von delphi bei mir immer zwei handles?? (jede andere anwensung macht doch auch nur eins oder) mfg :) Timi-loader |
Re: wieso hat jede anwendung in delphi zwei handles?
Hi Timi-loader.
Zitat:
Zitat:
Zitat:
Zitat:
Gruß, Waldteufel |
Re: wieso hat jede anwendung in delphi zwei handles?
Für die Kommunikation mit dem Betriebssystem verwendet Delphi ein nicht sichtbares Fenster. Dieses wird durch das Applikationsobjekt erzeugt. Du müßtest also diese Überschreiben umd den handle zu ändern.
|
Re: wieso hat jede anwendung in delphi zwei handles?
Wenn dir das TApplication nicht gefällt dann programmiere einfach NonVCL dann sind deine Anwendungen schön klein und du kannst dich um alles selbst kümmern (also auch die Klassennamen)
|
Re: wieso hat jede anwendung in delphi zwei handles?
Alternativ kann er auch TApplication ableiten (und nix verändern) und verwenden - dann ist das Handle halt eins auf SeinEigenerKlassenname.
|
Re: wieso hat jede anwendung in delphi zwei handles?
dann hat er aber das Problem das er die VCL ändern muss oder die unit Forms nicht verwenden sollte damit keine Instanz von TApplication erzeugt wird.
|
Re: wieso hat jede anwendung in delphi zwei handles?
Soweit ich weiss geht das mit einem kleinen Getrickse. Man muss nur vor dem EInbinden der Unit Forms in der Projektcode-Datei eine eigene Unit einbinden die im initialization die abgeleitet Application-Klasse erzeugt und der globalen Variable Application zuweist. Dann wird TApplication nämlich soweit ich weiss nicht nochmal erzeugt.
Ist aber schon länger her das ich mit sowas gerabeitet hab, das kann also auch schon deprecated sein. Zumal ging das mit Delphi 5. |
Re: wieso hat jede anwendung in delphi zwei handles?
Zitat:
Ohne VCL Code Änderung oder API Hooks wird das so nicht gehen. |
Re: wieso hat jede anwendung in delphi zwei handles?
Eben nicht. Das war irgendwie der Trick an der Geschichte. Die Variable wurde vorbelegt und erst in einer später aufgeführten Unit wurde Forms includiert, so dass TApplication nicht nochmal neu erzeugt wurde. Aber das ist inzwischen knapp 6 Jahre her, ich hab echt keine Details mehr im Kopf. Muss mal gucken ob ich die alten Sourcen noch Zuhause in einem meiner zahlreichen Archive hab.
Auf jeden Fall ging das, ohne die VCL auch nur schräg anzugucken geschweige denn anzufassen. |
Re: wieso hat jede anwendung in delphi zwei handles?
Ich dachte eben, so naiv wie ich nun mal bin, dass die Borländer einfach den ClassName der Application-Instanz als ClassName für das Fenster nehmen.
Demnach hätte das hier schon gereicht:
Delphi-Quellcode:
Als es nicht klappte, schaute ich in die dunklen Abgründe der Forms.pas (*uärks*... :? ) und musste feststellen, dass sie dort tatsächlich ein Stringliteral benutzen. :wall:
type
MyApplication = class(TApplication); PClass = ^TClass; begin PClass(Application)^ := MyApplication; Application.Initialize; ... Es gibt also keinen hübschen, delphischen Weg. Du müsstest schon den Klassennamen über die Windows API ändern (kA wie/ob das geht), oder einfach damit leben. Ich wüsste nicht was schlimm daran sein könnte. Delphi ist ja nicht peinlich, wie dieses komische Viech namens VB. ;) |
Re: wieso hat jede anwendung in delphi zwei handles?
eine andere Variante die eventuell funktioniert:
- Unit Forms einbinden - Application freigeben - Eigenes von TApplication abgeleitetes Object erstellen und der Instanzvariablen Application zuweisen. |
Re: wieso hat jede anwendung in delphi zwei handles?
Zitat:
|
AW: Re: wieso hat jede anwendung in delphi zwei handles?
Zitat:
Das Fenster für meine Message-Loop wird immer "TApplication" heißen und ich habe keine Möglichkeit das zu ändern, richtig? Die TApplication.Instanz zu zerstören und mit einer Unterklassen-Instanz welche eine neue CreateHandle()-Methode mitbringt fühlt sich irgendwie ... gefährlich an. |
AW: Re: wieso hat jede anwendung in delphi zwei handles?
Doch, es hat sich was geändert.
In der Taskleiste ist nicht mehr TApplication, sondern die MainForm. Und da man auch die MainForm im laufenden Betrieb tauschen kann, ist es auch vollkommen legitim, daß es eine MessageOnly-Form gibt, die sich um globale Messages kümmert. Außer daß Borland/Codegear/Embarcadero nach jahrzehnten immernoch nicht kappiert hat, wie man ein Message-Only-Window richtig erstellt. > z.B. HWND_MESSAGE als Owner Oder hat sich diesbezüglich in TApplication.CreateHandle > CreateWindowEx inzwischen was geändert? |
AW: wieso hat jede anwendung in delphi zwei handles?
Ich kenne mich mit dem ganzen Message-Handler-Unterbau nicht wirklich aus, so tief runter habe ich nie gebuddelt. Mir wäre es lieber gewesen dieses TApplication-Fenster zu haben, aber zur Not tut es (wahrscheinlich) auch das "Haupt"formular der VCL-Anwendung.
Ist mir trotzdem unverständlich warum man das so fest einbacken muss. TApplication.CreateHandle() sieht in XE7.1 so aus:
Delphi-Quellcode:
Ich rege mich nur auf dass WindowClass eine Record-Variable im implementation-Teil ist. Ich komme also von außen auch nicht dran.
LHandle := CreateWindowEx(WS_EX_TOOLWINDOW, WindowClass.lpszClassName, {$IFNDEF CLR}PChar{$ENDIF}(FTitle),
WS_POPUP or WS_CAPTION or WS_CLIPSIBLINGS or WS_SYSMENU or WS_MINIMIZEBOX, GetSystemMetrics(SM_CXSCREEN) div 2, GetSystemMetrics(SM_CYSCREEN) div 2, 0, 0, 0, 0, HInstance, nil);
Delphi-Quellcode:
var
WindowClass: TWndClass = ( style: 0; lpfnWndProc: @DefWindowProc; cbClsExtra: 0; cbWndExtra: 0; hInstance: 0; hIcon: 0; hCursor: 0; hbrBackground: 0; lpszMenuName: nil; lpszClassName: 'TApplication'); |
AW: wieso hat jede anwendung in delphi zwei handles?
Zitat:
Zitat:
Nur lpszMenuName, lpszClassName und lpfnWndProc lässt sich nicht ändern. Letzteres doch, durch hooken von ![]() Was willst du eigentlich erreichen? |
AW: wieso hat jede anwendung in delphi zwei handles?
Ich wollte eigentlich einfach nur eine VCL-Anwendung die Aufforderung zum Beenden schicken. Also ein WM_CLOSE (oder WM_QUIT?). Und ich fand es "richtiger" es an das "TApplication"-"Formular" als an das sichtbare Formular zu senden. Naja, egal.
|
AW: wieso hat jede anwendung in delphi zwei handles?
Im Notfall einfach an alle Top-Level-Fenster der Anwendung schicken und schon hat man keine Probleme.
bzw. WM_QUIT an TApplication WM_CLOSE oder WM_QUIT an die TForm. Aber du kannst es dir einfach machen, denn in Delphi reagiert keine TForm/TApplication auf WM_QUIT, sondern der Thread, egal an welches seiner Fenster es geschickt wird. In Kurz:
Delphi-Quellcode:
GetWindowThreadProcessId + PostThreadMessage(WM_QUIT) an den GUI-Thread (oder an alle Threads, wo Fenster dran hängen)
function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
begin if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then if Msg.Message <> WM_QUIT then .. else FTerminate := True; // Application.Terminate; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:02 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