>Delphi<



Liste des valeurs possibles pour Key
VK_LBUTTON : bouton Gauche Souris
VK_RBUTTON : bouton Droite Souris
VK_MBUTTON : bouton Central Souris
VK_CANCEL : Arrêt Exec. programme
VK_BACK : Retour Arrière
VK_TAB : Tabulation
VK_RETURN : Entrée
VK_SHIFT : Touche de contrôle MAJ
VK_CONTROL : Touche de contrôle CTRL
VK_MENU : Touche de contrôle ALT
VK_PAUSE : Pause
VK_ESCAPE : Echappement
VK_SPACE : Barre d'espacement
VK_PRIOR : Page Haut
VK_NEXT : Page Bas
VK_END : Fin
VK_HOME : Début
VK_LEFT : Flèche gauche
VK_UP : Flèche haut
VK_RIGHT : Flèche droite
VK_DOWN : Flèche bas
VK_SNAPSHOT : Impression d'écran
VK_INSERT : Insérer
VK_DELETE : Supprimer
VK_HELP : Aide
VK_NUMPAD0 : Touche 0 du pavé numérique
VK_NUMPAD1 : Touche 1 du pavé numérique
VK_NUMPAD2 : Touche 2 du pavé numérique
VK_NUMPAD3 : Touche 3 du pavé numérique
VK_NUMPAD4 : Touche 4 du pavé numérique
VK_NUMPAD5 : Touche 5 du pavé numérique
VK_NUMPAD6 : Touche 6 du pavé numérique
VK_NUMPAD7 : Touche 7 du pavé numérique
VK_NUMPAD8 : Touche 8 du pavé numérique
VK_NUMPAD9 : Touche 9 du pavé numérique
VK_MULTIPLY : Touche pavé numérique *
VK_ADD : Touche pavé numérique +
VK_SEPARATOR : Touche pavé numérique Entrée
VK_SUBTRACT : Touche pavé numérique -
VK_DECIMAL : Touche pavé numérique . (décimal)
VK_DIVIDE : Touche pavé numérique /
VK_F1 : Touche de Fonction F1
VK_F2 : Touche de Fonction F2
VK_F3 : Touche de Fonction F3
VK_F4 : Touche de Fonction F4
VK_F5 : Touche de Fonction F5
VK_F6 : Touche de Fonction F6
VK_F7 : Touche de Fonction F7
VK_F8 : Touche de Fonction F8
VK_F9 : Touche de Fonction F9
VK_F10 : Touche de Fonction F10
VK_F11 : Touche de Fonction F11
VK_F12 : Touche de Fonction F12
VK_NUMLOCK : Verrouillage pavé numérique
VK_SCROLL : Verrouillage scrolling
VK_CAPITAL : Verrouillage majuscules
Exemple d'utilisation ( Mettre le code ci-dessous dans l'événement OnKeyDown de votre composant).
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
begin
    if Key = (VK_LEFT) then
  begin
    {mettez ici les instructions à réaliser ...}
  end;
end;

Raccourci clavier
Le raccourci Ctrl + F9 permet de compiler un projet sans l'exécuter.
Mettre en majuscule la première lettre
Il faut associer les instructions ci-dessous à l'événement OnKeyPress (ici un TEdit).
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key:Char);
begin
with Sender as TEdit do
if(SelStart =0) or
(Text[SelStart]='') then
if Key in ['a'..'z'] then
Key := UpCase(Key);
end;

Appeler un autre fichier d'aide
Pour appeler momentanément un autre fichier d'aide que celui déclaré dans les options du projet.
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.HelpFile := 'nom_du_fichier.HLP';
Application.HelpCommand(HELP_CONTENTS, 0);
Application.HelpFile := 'LOGICIEL.HLP');
{restaure le fichier d'aide du projet}
end;

Comment installer le fichier d'aide d'un composant XX
Certains composants que vous installez sont accompagnés d'un fichier .hlp. Voilà comment installer ce fichier .hlp pour qu'il soit consultable à partir de Delphi.
- Placer dans le répertoire Delphi \hlp les fichiers XX.hlp et XX.KWF.
- Lancer HELPINST.EXE
- Ouvrir le fichier DELPHI.HDX
- Ajouter XX.KWF
- Sauver et quitter
Le fichier d'aide du composant est installé, pour le vérifier mettez votre nouveau composant sur une fiche et cliquez F1.


Comment afficher une Form sans la barre de titre
Il suffit de mettre sa propriété Caption à vide, sa propriété BorderStyle à bsNone et les borderIcons à false.

Ouvrir un fichier .txt en cliquant sur un bouton
Pour ouvrir un fichier TOTO.txt qui se trouve dans le répertoire du programme.
procedure TForm1.Button1Click(Sender: TObject);
var
F : Text ;
Ligne : String ;
begin
AssignFile (F, 'TOTO.txt) ;
Reset (F);
while not EOF (F) do
ReadLn (F, ligne)
closeFile (F);
end;

Séparateur décimal
Pour imposer le séparateur décimal qu'utilise votre application vous ajoutez, par exemple dans le gestionnaire OnCreate de la fiche principale :

procedure TForm1.FormCreate(Sender: TObject);
begin
DecimalSeparator := ',' ;
end;

Fonction FindClose
Si vous compilez du code Delphi 1 utilisant cette fonction, le compilateur de Delphi 2, 3 s'emmêlera les crayons car il y a deux FindClose dans Delphi 2, 3, l'un dans l'unité SysUtils et l'autre dans l'unité Windows.
Ecrivez donc SysUtils.FindClose.


Utilisation de Speed boutons comme des Radio boutons
Si vous fixez la propriété GroupIndex d'un groupe de Speed boutons à une valeur supérieure à 0 (valeur par défaut), les boutons fonctionneront ensemble comme un groupe.
Lorsque l'utilisateur clique sur l'un des Speed boutons, celui-ci reste enfonçé jusqu'à ce que l'utilisateur clique sur un autre bouton du groupe.
Vous pouvez placer les boutons dans un GroupBox de manière à indiquer à l'utilisateur que ceux-ci constituent une famille de choix.(L'objet GroupBox n'intervient en rien dans la constitution du groupe, il est purement décoratif).


Faire apparaître le nom du composant en phase conception.(D2 et D3)
Vous pouvez faire apparaître le nom du composant en phase de conception en cochant la case Montrer les libellés du composant de la boîte de dialogue Outils/Options.
C'est souvent bien pratique pour les composants non visuels.

Limiter la saisie
Pour limiter la saisie dans un mémo par exemple aux 26 lettres vous ajoutez l'instruction suivante dans OnKeyPRESS du mémo:

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in [#8,#27,'a'..'z','A'..'Z']) then key:=#0;
end;

Economiseur d'écran
Pour lancer l'économiseur d'écran.

procedure TForm1.Button1Click(Sender: TObject);
begin
Windows.PostMessage(Windows.GetDesktopWindow,WM_SYSCOMMAND,SC_SCREENSAVE,0);
end;

Touche Enter
Si vous préférez la touche Enter à la touche Tab.

procedure TForm1.FormKeyPress(sender: TObject; var key : char);
begin
if Key = #13 then
begin
key := #0;
Perform(wm_NextDlgCtl,0,0);
end;
end;

Déplacer un panel à l'exécution
Pour déplacer un panel à l'exécution utilisez l'événement OnMouseDown.

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Panel1.Perform(WM_sysCommand,$F012,0);
end


Fichiers ini
Vous créez un programme qui à l'exécution écrit dans un fichier ini. Si ce programme est exécuté depuis un CD Rom vous aller obtenir un message d'erreur en écriture avec impossibilité de fermer le logiciel ! C'est désagréable pour l'utilisateur et en plus ça fait mauvais effet ! Afin d'éviter ce désagrément voici quelques lignes de code. Dans le cas où le programme est exécuté à partir d'un CD-Rom le fichier sera créé dans le répertoire Windows sinon il sera créé (comme celà doit se faire) dans le répertoire de l'application.
Delphi 1.0
{CREATION DU FICHIER INI...}
if GetDriveType(ord(application.exename[1])-65)<>DRIVE_fixed
{...DANS WINDOWS SI DEPART D'UN DISQUE AUTRE QUE DUR...}
then
ini:=TIniFile.create('Nom_du_fichier.INI')
{...SINON DANS REPERTOIRE DE L'APPLICATION.}
else
ini:=TIniFile.create(extractfilepath(application.exename)+'Nom_du_fichier.INI');
Delphi 2.0 et supérieur
{CREATION DU FICHIERS INI ...}
if GetDriveType(PChar(Copy(application.exename,1,3)))<>DRIVE_fixed
{...DANS WINDOWS SI DEPART D'UN DISQUE AUTRE QUE DUR...}
then
ini:=TIniFile.create('Nom_du_fichier.INI')
{...SINON DANS REPERTOIRE DE L'EXE.}
else
ini:=TIniFile.create(extractfilepath(application.exename)+'Nom_du_fichier.INI');
Vous pouvez ensuite écrire et lire dans le fichier ainsi créé.
Ne pas oublier que pour écrire dans un fichier *.ini, il faut référencer l'unité "TIniFiles" (ajouter Inifiles dans la close uses de la 1ère partie de l'unité).
 


Création dynamique d'un bouton
procedure creerbouton;
Var
MonBouton : TButton;
BEGIN
MonBouton := TButton.Create(Form1);
with MonBouton do begin
Parent := MyForm;
height := 20;
width := 2000;
caption := 'nouveau bouton';
left := 20;
top := 20;
end;
END;

Vérifier qu'il y a une disquette dans le lecteur
function Diskpret: Boolean;
var
mode : Word;
begin
result := false;
mode := SetErrorMode(SEM_FAILCRITICALERRORS);
if DiskSize(1)<>-1 then result := true;
SetErrorMode(mode);
end;

Autoriser ou interdire le alt+tab et ctrl+alt+suppr
// interdire
procedure TForm1.Button1Click(Sender: TObject);
var
oldVal : LongInt;
begin
SystemParametersInfo (97, Word (True), @OldVal, 0);
end;

// autoriser
procedure TForm1.Button2Click(Sender: TObject);
var
OldVal : LongInt;
begin
SystemParametersInfo (97, Word (False), @OldVal, 0);
end;

supprimer la barre de tache pendant le déroulement d'un programme
definir barretache : HWND; dans les declarations de variable de la forme et rajouter les deux evenements suivant dans la forme :
procedure TForm1.FormCreate(Sender: TObject);
begin
barretache := FindWindow('Shell_TrayWnd', nil);
ShowWindow(barretache, SW_HIDE);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowWindow(barretache, SW_SHOW);
end;

optimisation du code
on peut ecrire plus simplement le code suivant :
Label1.Caption := Chaine[1];
Label2.Caption := Chaine[2];
Label3.Caption := Chaine[3];
Label4.Caption := Chaine[4];
Label5.Caption := Chaine[5];

il suffit d'écrire :
for i:=1 to 5 do (FindComponent('Label'+IntToStr(i)) as TLabel).Caption:=Chaine[i];

Récuperer le numero de série d'une disquette
function litnumser:string;
var
NumSerie : DWORD;
MaxComp, SySflags : integer;
begin
GetVolumeInformation('A:', nil, 0,@NumSerie,MaxComp, SysFlags,nil, 0);
result:=NumSerie;
end;

Supprimer le beep dans un Tedit quand on appuie sur enter
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = Chr(VK_RETURN) then key:= #0;
end;

Récupérer les coordonnées du curseur dans un mémo
procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word;Shift: TShiftState);
var
line,col :integer;
begin
line:=sendMessage(memo1.Handle,EM_LineFromChar,memo1.SelStart,0);
col:=memo1.Selstart-sendMessage(memo1.Handle,EM_LineIndex,line,0)+1;
edit1.text:='Ligne n#176;: '+inttostr(line+1)+' Colonne n#176;: '+inttostr(col);
end;
note : cela fonctionne aussi avec un richedit

Lancer un fichier avec son programme par défaut
uses WinTypes, ShellAPI;
begin
ShellExecute( 0, Nil, PChar('c:\my_docs\report.txt'),Nil, Nil, SW_NORMAL );
end.

on peut aussi executer un programme avec un fichier en paramêtre :
uses WinTypes, ShellAPI;
begin
ShellExecute( 0,'open',pchar('d:\utils\I_VIEW32.EXE'),pchar('d:\img.jpg'), Nil, SW_NORMAL );
end;

Lancer une URL
( toujours avec la commande ShellExecute ! )
uses WinTypes, ShellAPI;
begin
ShellExecute( 0, Nil, PChar('http://multimania.com/offset'),Nil, Nil, SW_NORMAL );
end;

envoyer un e-mail
( et encore la commande ShellExecute ! )
uses WinTypes, ShellAPI;
begin
ShellExecute( 0, Nil, PChar('mailto:offset@multimania.com'),Nil, Nil, SW_NORMAL );
end;

Connaitre la version de windows
Var
versions: TOSVERSIONINFO;
ver:integer;
begin
versions.dwOSVersionInfoSize:=sizeof(versions);
GetVersionEx(versions);
ver:=versions.dwPlatformId;
if ver=VER_PLATFORM_WIN32s then label1.caption:='Windows 3.1 avec Win32s';
if ver=VER_PLATFORM_WIN32_WINDOWS then label1.caption:='Windows 95';
if ver=VER_PLATFORM_WIN32_NT then label1.caption:='Windows NT';
label1.caption:=label1.caption+' ('+inttostr(versions.dwMajorVersion)+
'.'+inttostr(versions.dwMinorVersion)+' )';
end;

Envoyer des données sur le port série
procedure sendtoserial(data:string);
var
serial:textfile;
begin
assignefile(serial,'com1');
rewrite(serial);
write(serial,data);
// ou read pour lire
closefile(serial);
end;

Connaitre la mémoire libre disponible
procedure TForm1.Button1Click(Sender: TObject);
var
Memory : tMemoryStatus;
begin
memory.dwLength := sizeof(memory);
GlobalMemoryStatus(memory);
label1.caption:='memoire totale : '+inttostr(memory.dwTotalPhys)+' octets';
label2.caption:='memoire libre : '+inttostr(memory.dwAvailPhys)+' octets';
end;

Connaitre le répertoire temporaire par défaut de windows
procedure TForm1.Button1Click(Sender: TObject);
var
b: array[0..512] of Char;
begin
GetTempPath(511,b);
label1.caption:=b;
end;


Voir le texte qui est dans le clipboard
function litclipboard:string;
begin
if (Clipboard.HasFormat(CF_TEXT)) then result:=Clipboard.astext;
end;

Mettre le focus sur le composant suivant
SendMessage(Form1.Handle, WM_NEXTDLGCTL, 0, 0);
pour mettre le focus sur un composant précis , utiliser la méthode SetFocus du composant :
Button1.SetFocus;

Changer la vitesse d'affichage du curseur texte
Appeler la procédure windows suivante ( temps en milliseconde ) :
SetCaretBlinkTime(250);

Positionner le pointeur sourie
Appeler la procédure windows suivante :
SetCursorPos(100,100);

Faire scroller un richedit
Appeler la procédure windows suivante :
sendmessage(richedit1.handle,WM_VScroll,SB_LINEDOWN,0);
Pour faire scroller vers le haut , utiliser SB_LINEUP

Lancer l'économiseur d'écran
Appeler la procédure windows suivante :
PostMessage(GetDesktopWindow, WM_SYSCOMMAND, SC_SCREENSAVE, 0);

Cacher un programme de la barre de tache
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowWindow (Form1.Handle, SW_Hide);
showwindow(Application.handle,Sw_hide);
end;

rajouter la ligne suivante pour cacher la Form
Application.ShowMainForm:=False;

Teste si le Caps Lock est actif
function IsCapsLockOn : boolean;
begin
Result := 0 <> (GetKeyState(VK_CAPITAL) and $01);
end;

Faire une pause
2 solution : la fonction sleep ( qui bloque le programme pendant x millisecondes )
Sleep( 1000 );
ou la procédure suivante qui traite les messages de la fenetre :
procedure delay(t:integer); // t en secondes
var NowTime : TDateTime;
begin
NowTime:=Now;
repeat
Application.ProcessMessages;
until NowTime + t / (24 * 3600) < Now;
end;

Lancement de la fenetre de config de l'heure
rajouter Shellapi dans la clause USES
WinExec('rundll32.exe shell32.dll,Control_RunDLL timedate.cpl',SW_SHOWNORMAL);

Lancement de la fenetre proprietes systeme
rajouter Shellapi dans la clause USES
WinExec('rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl',SW_SHOWNORMAL);

Lancement de la fenetre proprietes de mots de passe
rajouter Shellapi dans la clause USES
WinExec('rundll32.exe shell32.dll,Control_RunDLL password.cpl',SW_SHOWNORMAL);

Changer la résolution de l'écran sans rebooter
// change la resolution en 640*480
procedure changeres;
var
mode:TDeviceMode;
i:integer;
begin
mode.dmSize := sizeof (MODE);
mode.dmPelsWidth := 640;
mode.dmPelsHeight := 480;
mode.dmBitsPerPel := 16;
mode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL;
i := ChangeDisplaySettings(mode, CDS_TEST);
if i=DISP_CHANGE_SUCCESSFUL then ChangeDisplaySettings(mode, 0)
end;

Controler l'alimentation du moniteur
Cette commande permet de mettre le moniteur en veille
SendMessage(Application.Handle, WM_SYSCOMMAND,SC_MONITORPOWER,0)
ou de le remettre en fonctionnement
SendMessage(Application.Handle, WM_SYSCOMMAND,SC_MONITORPOWER,-1);

Controler le tiroir du lecteur de CDROM
rajouter mmsystem dans la clause USES
Cette commande permet d'ouvrir le tiroir
mciSendString('Set cdaudio door open wait', nil, 0, 0);
ou de le fermer
mciSendString('Set cdaudio door closed wait', nil, 0, 0);

Connaitre la résolution de l'écran
procedure TForm1.Button1Click(Sender: TObject);
var
hh:hdc;
larg,haut:integer;
begin
hh:=getdc(GetDesktopWindow);
larg:=getdevicecaps(hh,HORZRES);
haut:=getdevicecaps(hh,VERTRES);
end;

faire un copier/coller vertical dans l'éditeur de Delphi
Au clavier , faire ALT+SHIFT+les touches de directions
A la sourie , faire ALT+bouton gauche
Pour revenir au copier coller standard , refaire un selection normale à la sourie

Changer le papier peint de windows
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,PChar('C:\Div33.bmp'),SPIF_SENDWININICHANGE);

Ecrire en diagonale sur le canvas de la form
procedure TForm1.Button1Click(Sender: TObject);
var
LgFnt : TLogFont;
Fnt : TFont;
begin
Form1.Canvas.Font.Name := 'Arial';
Form1.Canvas.Font.Size := 18;
Fnt := TFont.Create;
Fnt.Assign(Form1.Canvas.Font);
GetObject(Fnt.Handle, sizeof(LgFnt), @LgFnt);
LgFnt.lfEscapement := 180;
LgFnt.lfOrientation := 180;
Fnt.Handle := CreateFontIndirect(LgFnt);
Form1.Canvas.Font.Assign(Fnt);
Form1.Canvas.Font.color:=clNavy;
Fnt.Free;
Form1.Canvas.TextOut(30,60,'Super!');
end;

Effacer de façon simple un bitmap
with bitmap.canvas do FillRect(ClipRect);

Faire que son programme soit compatible avec le menu Pop-up 'Envoyer vers'
La partie programmation : récupérer le nom du fichier
var
fichier:string
begin
if paramcount>0 then fichier:=ParamStr(1);
end;
La partie windows : mettre un raccourci pointant vers l'éxécutable dans le répèrtoire "C:\WINDOWS\SendTo"

>Algeria Underground<