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.
- Comment récupérer le texte affiché dans la barre de titre d'une fenêtre quelconque ?
- Comment changer la couleur d'un TProgressBar ?
- Comment créer un fichier temporaire ?
- Comment effectuer des chronométrages précis ?
- Comment obtenir le code de sortie de l'application ?
- Comment obtenir le message correspondant à une erreur Windows obtenue ?
- Comment obtenir la hauteur de la barre des tâches ?
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; |
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; |
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; |
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.
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. |
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 ; |
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'; |
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; |
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; |
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. |
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; |
Code delphi : | Sélectionner tout |
1 2 | Raise Exception.Create(SysErrorMessage(GetLastError)); |
Note : sur D6 et supérieur, RaiseLastWin32Error existe toujours, mais génère un avertissement à la compilation. La fonction ne fait qu'appeler RaiseLastOSError.
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; |
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.