FAQ DelphiConsultez toutes les FAQ

Nombre d'auteurs : 119, nombre de questions : 909, dernière mise à jour : 22 décembre 2016  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.

Commentez


SommaireInterface utilisateurComposantsUtilisation des fonctions des APIs (7)
précédent sommaire suivant
 

Il peut parfois être utile de récupérer le texte affiché dans la barre de titre d'une fenêtre quelconque (en dehors de notre application). C'est très facile à réaliser à l'aide des fonctions de l'API Windows.
Dans l'exemple qui suit, nous récupérons le caption de la fenêtre active.

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
function GetActiveWindowCaption: string; 
var 
  h : hwnd; 
  sz: Integer; 
begin 
  // Nous commençons par récupérer le handle de la fenêtre 
  // située au premier plan 
  h := GetForegroundWindow; 
  
  // Nous changeons la dimension de la chaîne de retour pour qu'elle puisse 
  // contenir le texte dont nous ne connaissons pas encore la longueur. 
  // 255 caractères paraissent suffisant dans cet exemple 
  SetLength(result, 255); 
  
  // Nous appelons la fonction afin d'obtenir le texte de la fenêtre 
  sz:= GetWindowText(h, PChar(result), 255); 
  
  // Nous redimensionnons la chaîne de retour pour éliminer les caractères en trop 
  SetLength(result, sz); 
end;

Mis à jour le 21 janvier 2014 Pierre Castelain

Le composant TProgressBar ne dispose pas de propriété color. Par contre, il existe un message Windows pour modifier directement le contrôle : PBM_SETBARCOLOR.

Code Delphi : Sélectionner tout
1
2
3
4
5
6
7
8
Const 
  { Définition du numéro de message} 
  PBM_SETBARCOLOR = WM_USER + 9; 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  { Envoi du message avec la couleur voulue} 
  SendMessage(ProgressBar1.Handle,PBM_SETBARCOLOR,0,clLime); 
end;
Le code ci-dessus ne fonctionne pas avec les thèmes XP activés.

Mis à jour le 13 octobre 2013 Mac LAK Nono40

L'API Win32 fournit plusieurs fonctions sur le sujet : GetTempPath pour obtenir le répertoire temporaire du compte courant, et GetTempFileName qui permet de créer un nom de fichier unique de manière fiable.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{ 
   Retourne un nom de fichier absolu, aléatoire, dans le répertoire  
temporaire. Le fichier est créé, mais fermé. 
   Le préfixe (3 caractères max), optionnel,  sert à "isoler" les fichiers  
temporaires de son application des autres. 
   Si le répertoire temporaire n'est pas trouvé, ce sera le répertoire de  
l'application. 
} 
Function GetScratchName ( Const Prefix : String = 'TMP' ) : String    ; 
Var 
   Path, Name : Array[0..MAX_PATH] Of Char ; 
Begin 
     // Récupération du répertoire temporaire (éventuellement, celui de l'application). 
     If (GetTempPath(MAX_PATH,@Path)=0) Then 
        StrCopy(@Path,PChar(ExtractFileDir(Application.ExeName))); 
     // Création d'un fichier temporaire unique. 
     If (GetTempFileName(@Path,PChar(Prefix),0,@Name)=0) Then Result:=EmptyStr 
     Else Result:=String(@Name); 
End;
À la sortie de la fonction, le fichier dont le nom est retourné existe, est vide, et il est possible de l'ouvrir pour l'utiliser selon les besoins.

Aucun élément de l'OS (ni de Delphi) n'effacera le fichier pour vous à la fin du programme, vous devez vous en occuper manuellement.

Mis à jour le 21 janvier 2014 Mac LAK

Pour le faire, il faut utiliser les fonctions de compteur hautes performances (CHP) de l'API Win32.
Il s'agit entre autres des fonctions QueryPerformanceFrequency et QueryPerformanceCounter (Windows.pas).
La première renvoie la fréquence (en hertz) du compteur HP de la machine et la seconde renvoie la valeur courante d'un compteur libre. La résolution est souvent de l'ordre d'une nanoseconde (un milliardième de seconde).

Déclarez ces variables :

Code delphi : Sélectionner tout
1
2
3
4
Var 
   FFrequency    : Int64    ;    // Fréquence du compteur hautes performances. 
   FStart, FStop : Int64    ;    // Valeurs du compteur au début et à la fin du chrono. 
   FElapsed      : Extended ;    // Durée finale, en secondes.
Pour effectuer le chronométrage lui-même :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
// Initialisation du compteur hautes performances, et début du chronométrage. 
If Not QueryPerformanceFrequency(FFrequency) Then 
   Raise Exception.Create('Pas de compteur hautes performances.'); 
QueryPerformanceCounter(FStart) ; 
  
// Insérer ici l'opération à chronométrer, ou un appel de fonction. 
  
// Fin de chronométrage, conversion du temps écoulé en secondes. 
QueryPerformanceCounter(FStop) ; 
FElapsed := (FStop-FStart)/FFrequency ;
La résolution de ce compteur est en général très élevée : il n'est pas rare que ce soit la fréquence du processeur qui serve de base. Sur un système donné, elle ne change jamais, mais elle varie d'un système à un autre: il est donc impératif de toujours récupérer la fréquence par un appel au système. Cet appel peut n'être fait qu'une seule fois dans le programme. De même, certaines machines ne possèdent pas ce compteur : il est donc nécessaire également de tester le retour de QueryPerformanceFrequency (les tests ultérieurs peuvent souvent être omis, car ils n'échouent normalement jamais si l'obtention de la fréquence a réussi la première fois).

Si la version de Delphi utilisée ne déclare pas ces fonctions, insérer ces déclarations dans le code :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
Uses Windows ; 
  
// Requiert Delphi 4 ou supérieur, ou de réimplémenter des entiers 64 bits. 
function QueryPerformanceCounter(var lpPerformanceCount: TLargeInteger):  
BOOL; stdcall; external kernel32 name 'QueryPerformanceCounter'; 
function QueryPerformanceFrequency(var lpFrequency: TLargeInteger): BOOL;  
stdcall; external kernel32 name 'QueryPerformanceFrequency';

Mis à jour le 21 janvier 2014 Mac LAK

Il faut utiliser la fonction GetExitCodeProcess de l'API Win32.
Cette fonction demande un handle sur le processus dont on veut le code de sortie, comme celui obtenu par CreateProcess ou OpenProcess par exemple.

Il faut le handle du processus, pas celui de sa fenêtre principale.

Exemple avec CreateProcess :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Function RunAndGetExitCode ( Const  
CommandLine : String ) : LongWord ; 
Var 
   StartupInfo : TStartupInfo; 
   ProcessInfo : TProcessInformation; 
Begin 
     FillChar(StartupInfo,SizeOf(StartupInfo),#0); 
     StartupInfo.cb := SizeOf(StartupInfo); 
     If Not CreateProcess( Nil, PChar(CommandLine), Nil, Nil, True, 0, Nil, Nil, StartupInfo, ProcessInfo) Then 
           RaiseLastOSError; 
     // Attente de la fin du processus. 
     WaitForSingleObject(ProcessInfo.hProcess, INFINITE); 
     // Récupération du code de sortie. 
     GetExitCodeProcess(ProcessInfo.hProcess,Result); 
End;
Exemple avec OpenProcess :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
Function GetExitCode ( Const PID : LongWord  
) : LongWord ; 
Var 
   hApp     : THandle ; 
   ExitCode : LongWord  ; 
Begin 
     hApp:=OpenProcess(PROCESS_QUERY_INFORMATION,False,PID); 
     // Récupération du code de sortie. 
     GetExitCodeProcess(hApp,Result); 
End;
Note : si le processus est toujours actif, son code de sortie vaut STILL_ACTIVE.

Exemple d'application renvoyant un code d'erreur :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
Program  
StopWithExitCode ; 
  
{$APPTYPE CONSOLE} 
  
Begin 
     // Cette instruction arrête le programme proprement, avec un code de sortie. 
     // Par convention, la valeur zéro est utilisée pour indiquer une sortie sans erreur. 
     Halt(3); 
End.

Mis à jour le 21 janvier 2014 Mac LAK

Windows ne renvoie ses erreurs internes que sous forme de codes numériques, obtenus en général par un appel à GetLastError.
Pour obtenir le message d'erreur "en clair", plusieurs solutions :

  • Utiliser la fonction Delphi Win32Check pour appeler l'API Win32, mais ne marche que si la fonction renvoie un BOOL TRUE sur erreur.
  • Utiliser RaiseLastOSError (ou RaiseLastWin32Error sur D5 ou inférieur), mais ne marche pas si l'on a déjà lu la valeur de GetLastError.

Mais ces fonctions lancent des exceptions, ce qui n'est pas toujours souhaitable.

Une solution plus fine consiste à passer le code numérique à la fonction Delphi SysErrorMessage.
Toutes ces fonctions sont dans l'unité SysUtils.pas. Exemple :
Code delphi : Sélectionner tout
1
2
3
4
5
6
If CreateFile(....)=INVALID_HANDLE_VALUE Then 
   Begin 
   ErrorCode:=GetLastError; 
   // Traitement additionnel. 
   ShowMessage(SysErrorMessage(GetLastError)); 
   End;
À peu de choses près, écrire
Code delphi : Sélectionner tout
1
2
Raise  
 Exception.Create(SysErrorMessage(GetLastError));
revient à appeler RaiseLastOSError / RaiseLastWin32Error.

Note : sur D6 et supérieur, RaiseLastWin32Error existe toujours, mais génère un avertissement à la compilation. La fonction ne fait qu'appeler RaiseLastOSError.

Mis à jour le 21 janvier 2014 Mac LAK

Pour obtenir la taille de la barre des tâches, nous utilisons la fonction de l'API Windows, SystemParametersInfo avec comme action SPI_GETWORKAREA.
On peut utiliser le code suivant pour informer l'utilisateur de la hauteur de la barre des tâches :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
procedure TFormMain.btnHauteurBarreClick(Sender: TObject); 
Var 
  Rect: TRect; 
begin 
  SystemParametersInfo(SPI_GETWORKAREA, 0, @Rect, 0); 
  ShowMessage(IntToStr(Screen.Height - Rect.Bottom)); 
end;
Cette fonction peut être utilisée pour avoir bien d'autres informations tels que le délai de répétitions des touches du clavier par exemple.

Mis à jour le 21 janvier 2014 Pierre Castelain

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 © 2017 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.

 
Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -