IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

FAQ DelphiConsultez toutes les FAQ

Nombre d'auteurs : 124, nombre de questions : 929, dernière mise à jour : 31 décembre 2023  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.

SommaireInterface utilisateurCitrix (3)
précédent sommaire suivant
 

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);

Mis à jour le 24 janvier 2014 Laurent Dardenne

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;
La méthode Next permet une itération pour un ou plusieurs éléments. Elle renvoie S_OK tant qu'il reste des éléments à extraire.
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;
Le transtypage de l'élément récupéré doit correspondre au type d'objet de la collection. Ici l'objet ArrayVariant est transtypé vers la variable unServeur de type MetaFrameServer. On peut ensuite utiliser les propriétés et méthodes de la variable unServeur.
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;
Note : sous Delphi 2005 il n'est pas possible d'itérer sur une interface de type IMetaFrameServers en utilisant la syntaxe For-In-Do, car elle n'implémente pas le modèle de collection propre à Delphi (cf. les méthodes publiques GetEnumerator, MoveNext…)

Mis à jour le 24 janvier 2014 Laurent Dardenne

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.
En fait l'application est affichée en mode fenêtre transparente et il faut forcer le focus de la fenêtre que l'on souhaite fermer.
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;  
...
On intercepte l'événement clic de la fenêtre et si le handle courant ne correspond pas à celui de la fenêtre concernée, on force la focalisation.

Mis à jour le 24 janvier 2014 Laurent Dardenne

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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.