windows - Delphi XE2 tildele Application.MainForm.Handle til Application.Handle inde i en DLL

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et lille problem med formularer, der oprettes indefra en DLL.


Grundlæggende hvad der sker, når en formular (Form1) fra en dll viser (jeg synes at den skal forblive øverst), og du åbner en anden formular (Form2), som er adskilt fra hovedapplikationen (dvs. ikke lever i dll'en) . Hvis du lægger markøren over en kontrol på Form2, så hinten vises, vil Form2 straks gå bag Form1.


Dette sker kun med MainFormOnTaskBar er sandt. I øjeblikket passerer vi hovedapplikationen 's Application.Handle til DLL'en og tildele det til Application.Handle of DLL.


Jeg har formået at løse problemet ved at passere Application.MainForm.Handle til DLL'en, der skal tildeles Application.Handle i DLL'en.


Er det sikkert? kender nogen den rigtige måde at løse dette problem på?

Bedste reference


Din løsning er helt fornuftig. Jeg har en Excel COM add-in, der gør noget meget ens. I den kode sætte jeg Application.Handle i DLL'en for at være vindueshåndtaget i Excel hovedvinduet. Det er analogt med hvad du laver.


Problemet er, at du skal få vindue ejerskabet korrekt indstillet. Du har brug for kæden af ​​ejerskab for at komme helt tilbage til din apps hovedform. Former i en DLL har ingen kendskab til, hvad hovedformularen er, og så skal du give den viden.


Bemærk, at jeg taler om begrebet vindueejeren som brugt af Windows og ikke VCL-konceptet af ejeren, som er helt anderledes. I VCL-terminologi er dette kendt som popup-forælder, og du kan løse dit problem ved udtrykkeligt at indstille DLL-formularens popup-forælder til at være hovedformularen. De relevante egenskaber er PopupMode og PopupParent. For de formularer, der lever i hovedappen, VCL vil naturligvis få deres popup-forælder til at være hovedformularen.


Men efter at have talt om eksplicit at angive popup-forælder, vil jeg understrege, at din nuværende løsning er enklere og mere praktisk.


Hvad begge disse løsninger gør, er at sikre, at alle hjælpeskemaer ejes af hovedformularen. Det betyder, at disse former altid er oven på hovedformen. Det betyder, at hjælpeskemaerne vil blive minimeret, hvis hovedformularen minimeres. Læs om ejede vinduer her: Vinduesfunktioner. [1]


Hvis du i stedet havde brugt runtime-pakker frem for en DLL, ville koden i pakken være forbundet med samme VCL som hovedformularen. Så den pakkede kode vil kunne se hovedformularen og sætte vinduets ejer korrekt. Dette er helt sikkert en fordel ved at bruge pakker. Selvfølgelig kan der meget vel være en god grund til, at du skal bruge DLL'er i stedet for pakker.