FAQ DelphiConsultez toutes les FAQ
Nombre d'auteurs : 124, nombre de questions : 934, dernière mise à jour : 23 octobre 2024 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).
Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.
L'équipe Delphi de Developpez.com.
Solution proposée par IgorK
Les problèmes suivants peuvent survenir pour une application Delphi publiée sous Citrix Metaframe XP :
- Quand l'application s'ouvre, elle n'apparait pas dans la barre des tâches, il faut minimiser l'application concernée pour qu'elle apparaisse, mais aussitôt maximisée elle disparait à nouveau.
- Dans certains cas les fenêtres modales repassent devant la fenêtre active et ce malgré l'installation des derniers correctifs Citrix.
- Dans d'autres et de façon aléatoire, lorsque l'on minimise la fenêtre de l'application puis la maximise, on ne peut plus la minimiser (sauf si on termine et ré exécute l'application).
Note : l'application sur une workstation stand alone fonctionne normalement.
Une solution pour corriger ce probléme est de modifier un fichier du runtime de Delphi. Dans l'unité Forms.pas, procédure TApplication.CreateHandle trouvez l'appel CreateWindow et remplacez-le par le code suivant ( CreateWindowEx):
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // Modification -> 02/2005 // Updated to create the application form as visible (by removing WS_POPUP) // but it is created transparent with 1 transparent pixel in the top // left corner of the screen, which means top left corner of the // application in front off for seamless applications under citrix; FHandle := CreateWindowEx(WS_EX_APPWINDOW or WS_EX_TRANSPARENT , WindowClass.lpszClassName, PChar(FTitle) , WS_CAPTION or WS_CLIPSIBLINGS or WS_SYSMENU or WS_MINIMIZEBOX // or WS_POPUP //, GetSystemMetrics(SM_CXSCREEN) div 2 //, GetSystemMetrics(SM_CYSCREEN) div 2, 0, 0 , -199, -19, 200, 20 , 0, 0 , HInstance , nil); |
Citrix propose ces API au travers d'objet COM, nommées MetaFrame COM (MFCOM).
Pour énumérer une collection on utilise l'interface IEnumVariant, vous devez déclarer l'unité Activexdans la clause uses pour l'utiliser.
Une fois une collection récupérée, on utilise une interface IEnumVariant qui implémente des fonctions d'énumération sur des données de type variant.
Elle nécessite le transtypage suivant sur un objet de type collection, ici UneFerme de type MetaFrameFarm :
Code delphi : | Sélectionner tout |
ObjSrvEnumerator := (UneFerme.Servers._NewEnum) as IEnumVariant;
L'élément récupéré de type OleVariant doit à son tour être transtypé pour permettre de le manipuler correctement :
Code delphi : | Sélectionner tout |
unServeur := IUnknown(ArrayVariant) as MetaFrameServer;
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | var UneFerme : MetaFrameFarm; unServeur : MetaFrameServer; i : Integer; ObjSrvEnumerator : IEnumVariant; ArrayVariant : OleVariant; NumberItem : LongWord; begin ListBox1.Clear; try UneFerme := CoMetaFrameFarm.Create; uneFerme.Initialize(MetaFrameWinFarmObject ); ListBox1.AddItem('Citrix Farme : '+ UneFerme.FarmName, Self ); ObjSrvEnumerator := (UneFerme.Servers._NewEnum) as IEnumVariant; while (ObjSrvEnumerator.Next(1, ArrayVariant, NumberItem) = S_OK) do begin unServeur := IUnknown(ArrayVariant) as MetaFrameServer ; ListBox1.AddItem('Serveur : '+ unServeur.ServerName , Self ); end; finally uneFerme := nil; end; end; |
Dans une application Delphi sous Citrix uniquement, un message d'erreur peut apparaitre aléatoirement lorsqu'on ferme une fenêtre se trouvant en arrière plan.
Le message d'erreur étant :
Code other : | Sélectionner tout |
Erreur Win32. Code : 1400.. Handle de fenêtre non valide.
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | Interface ... maForm=class(TForm) ... private ... procedure WMMouseActivate(var Message: TWMMouseActivate); message WM_MOUSEACTIVATE; ... Implementation ... procedure maForm.WMMouseActivate(var Message: TWMMouseActivate); begin Message.Result := MA_ACTIVATE; if (maForm.Handle <> GetForegroundWindow) and (maForm.Handle <> Handle) and (maForm.Handle <> 0) then begin SetForegroundWindow(maForm.Handle); Windows.SetFocus(maForm.Handle); end; end; ... |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.