
| auteur : hachesse
| Un SplashScreen est un écran qui apparaît pendant le chargement d'une application. Pour réaliser un tel écran, il suffit de faire apparaître la fenêtre voulue dès l'initialisation de l'application et ce jusqu'à l'affichage de la fenêtre principal, c'est a dire la fin jusqu'au chargement complet de l'application.
begin
Application.Initialize;
SplashScreen := TSplashScreen.Create(Application); // On crée la fenetre de Splash
SplashScreen.Show; // On affichage de cette fenetre
SplashScreen.Update; // On force l'affichage de la fenetre (sinon elle n'aparait que partiellement)
Application.CreateForm(TForm1, Form1); // On crée les autres fiches de l'application
SplashScreen.Close; // On ferme la fenetre de Splash
SplashScreen.Release; // On détruit la fenêtre et on libère la mémoire
Application.Run;
end.
|
lien : Comment mettre une image en fond de fiche ?
téléchargement : splashscreen [11,4 ko]
|
| auteur : Al-Yazdi
| On va créer une bitmap et dire à notre fiche de l'afficher dans le coin en haut à gauche. Si notre image est trop grande, elle sera tronquée, et si elle est petite, le reste de la fiche sera rempli par la couleur de fond.
var
Bitmap: TBitmap;
procedure TMyForm.FormPaint(Sender: TObject);
begin
Canvas.Draw(0, 0, Bitmap);
end;
procedure TMyForm.FormCreate(Sender: TObject);
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile('MyBitmap.bmp');
end;
procedure TMyForm.FormDestroy(Sender: TObject);
begin
Bitmap.Free;
end;
|
lien : Comment mettre une image dans le fond d'une application MDI en Delphi ?
|
| auteur : Gysmo
| Voici une fonction qui récupère cette information :
function ApplicationVersion: String
var
VerInfoSize, VerValueSize, Dummy: DWord;
VerInfo: Pointer;
VerValue: PVSFixedFileInfo;
begin
VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
//Deux solutions :
if VerInfoSize <> 0 then
//- Les info de version sont inclues
begin
//On alloue de la mémoire pour un pointeur sur les info de version :
GetMem(VerInfo, VerInfoSize);
//On récupére ces informations :
GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
//On traite les informations ainsi récupérées :
with VerValue^ do
begin
Result := IntTostr(dwFileVersionMS shr 16);
Result := Result + '.' + IntTostr(dwFileVersionMS and $FFFF);
Result := Result + '.' + IntTostr(dwFileVersionLS shr 16);
Result := Result + '.' + IntTostr(dwFileVersionLS and $FFFF);
end;
//On libère la place précedement allouée :
FreeMem(VerInfo, VerInfoSize);
end
else
//- Les infos de version ne sont pas inclues
//On déclenche une exception dans le programme :
raise EAccessViolation.Create('Les informations de version de sont pas inclues');
end;
Il faut pour que cela fonctionne que vous spécifiez l'option Inclure les informations de version dans le projet dans menu Projet|Option|Information de version, ainsi la fonction retournera '1.0.0.0' par exemple, sinon la fonction déclenchera une erreur EAccessViolation. |
| auteur : Al-Yazdi
| Il existe deux manières pour faire cela : 1. La méthode Sleep Il suffit de mettre Application.Sleep(duree_voulue) où duree_voulue est exprimée en millisecondes. Cette méthode présente le désavantage de ne pas traiter les messages. 2. La méthode GetTickCount La procédure GetTickCount nous informe sur le nombre de millisecondes écoulées depuis l'allumage du PC. Le problème est que cette quantitée est stockée sur un DWord et que forcément un jour (49,7 jours après l'allumage du PC), elle va revenir à zéro. Pour corriger ce problème, nous allons donc utiliser des cardinaux.
var
Tc: Cardinal;
begin
Tc := GetTickCount;
repeat
Application.ProcessMessages;
until Cardinal(GetTickCount - Tc) > {Temps d'attente en ms};
end;
Cette méthode est à préférer, car elle ne bloque pas la distribution des messages exterieurs. |
| auteur : Al-Yazdi
| Delphi possède dans ce but deux fonctions : ParamCount: Integer et ParamStr(Index: Integer): String La première nous indique combien de paramètres on été passés au programme, et la seconde nous indique quels sont-ils. Ainsi ParamStr(0) nous renseigne sur le nom du programme et son chemin, ParamStr(1) nous donne le premier paramètre reçu et ainsi de suite. Exemple : On a lancé notre application en faisant glisser des fichiers sur l'icône. On va remplir une ListBox des chemins de tous les fichiers.
var
i: Integer;
begin
for i := 1 to ParamCount do
MyListBox.Items.Append(ParamStr(i));
end;
|
| auteur : hachesse
| Il existe de nombreuses méthodes pour n'autoriser qu'une seule instance d'un même programme. La plus élégante étant sans aucun doute l'utilisation des Mutex. Les Mutex sont en fait des variables globales qui génèrent un message d'erreur lorsque l'on tente de les instancier alors que cela a déjà été fait. Pour interdire de lancer 2 fois une même application, il suffit donc de tester si une erreur est produite lors de la création d'un Mutex pour notre application. Cela se fait dès le lancement de l'application, c'est à dire dans le code de base du projet accessible par le menu Projet|Voir la source. Le code source d'un nouveau projet étant :
program Project1;
uses
Forms,
Unit1 in 'Unit {Form1};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Toutes les fonctions relatives aux Mutex se trouvant dans l'unité Windows, il est donc nécessaire de l'ajouter dans la clause uses. Afin d'être totalement sûr qu'une autre erreur ne vienne perturber le lancement de notre programme, il est préférable d'effacer toute trace de la dernière erreur survenue dans le système. On utilise pour cela la commande SetLastError(NO_ERROR). Il est à présent temps de créer le Mutex pour l'application. On utilise pour se faire la commande CreateMutex(lpMutexAttributes: PSecurityAttributes, bInitialOwner: LongBool, lpName: PChar): Cardinal où les paramètres correspondent respectivement aux attributs de sécurité du Mutex, au thread qui en est le propriétaire et au nom du Mutex. Si le Mutex existe déjà, l'erreur ERROR_ALREADY_EXISTS sera alors déclenchée.
Il faut donc tester la dernière erreur intervenue dans le système et lancer ou non une instance de l'application. Le code de base du projet étant donc :
program Project1;
uses
Windows, Forms,
Unit1 in 'Unit {Form1};
{$R *.RES}
begin
SetLastError(NO_ERROR);
CreateMutex (nil, False, 'Nom de l application');
if GetLastError = ERROR_ALREADY_EXISTS then
Exit;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
|
lien : MSDN - CreateMutex
lien : Comment passer au premier plan une application instanciée une seconde fois ?
téléchargement : 1instance [2,77 ko]
|
| auteur : hachesse
| La première chose à faire est de tester si l'application est déjà instanciée. Pour ce faire, on utilise les Mutex comme décrits précédement. Ce test amène donc à 2 cas de figures : L'application n'est pas lancée Si l'application n'est pas instanciée, il faut le faire, pour cela, le déroulement classique du lancement d'une programme suffit. Il faudra tout de même récupérer certaines informations sur l'application. Ces information servirons à faire repasser l'application au premier plan dans le cas d'un second lancement du programme. Pour cela, nous avons besoins de 2 handles : celui du programme lui même et celui de la form principale. Ces 2 valeurs qui devront être accessibles en dehors du programme seront stockées dans la base de registres de Windows sous la clé HKEY_CLASSES_ROOT\software\nom_de_la_clé et sous les noms FirstApplicationHandle et FirstFormHandle.
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Registre := TRegistry.Create;
try
Registre.RootKey := HKEY_CLASSES_ROOT;
Registre.OpenKey('\Software\nom_de_la_clé', True);
Registre.WriteInteger('FirstApplicationHandle', Application.Handle);
Registre.WriteInteger('FirstFormHandle', Form1.Handle);
Registre.CloseKey;
Registre.Free;
except
MessageDlg('Une erreur est survenue lors de l''écriture dans la base de registre.',
mtError, [mbOk], 0);
Registre.Free;
end;
Application.Run;
L'application est déjà lancée Si l'application est déjà lancée, rien ne sert de la faire une seconde fois, c'est-à-dire que le chargement de l'application sera tout simplement stoppé. Mais avant de quitter le lancement de l'application, il faut redonner le focus à la première instance du programme. C'est là que les données qu'il aura déposées dans la base de registres seront utiles pour l'identifier. La première chose à faire est donc d'aller chercher les 2 handles voulus dans la base de registre. Une fois que le programme aura le handle de l'application et celui de la fenêtre principale il pourra donner le focus à cette dernière. Cela se fait grace à 2 fonctions de l'API Windows ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL et SetForegroundWindow(hWnd: HWND): BOOL.
Registre := TRegistry.Create;
try
Registre.RootKey := HKEY_CLASSES_ROOT;
Registre.OpenKey('\Software\nom_de_la_clé', True);
FirstApplicationHandle := Registre.ReadInteger('FirstApplicationHandle');
FirstFormHandle := Registre.ReadInteger('FirstFormHandle');
ShowWindow(FirstApplicationHandle, SW_NORMAL);
SetForegroundWindow(FirstFormHandle);
Registre.CloseKey;
Registre.Free;
except
MessageDlg('Une erreur est survenue lors de la lecture dans la base de registre.',
mtError, [mbOk], 0);
Registre.Free;
end;
PS: il est préférable de nettoyer la base de registres à la fin de l'exécution du programme. |
lien : Comment n'instancier qu'une seule fois un programme ?
téléchargement : 1instance [2,77 ko]
|
Ce document issu de
www.developpez.com
est soumis à la licence
GNU FDL
traduit en français
ici
Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement.
|