Software">
Annex 1
Annex 1
Annex 1
Un ListBox est aussi appelé, en français "Zone de liste". Il s'agit d'une liste
d'éléments que l'on peut faire défiler. L'utilisateur peut ajouter, supprimer ou
sélectionner un ou plusieurs éléments de la liste. Une zone de liste dispose de
plusieurs propriétés et méthodes dont nous allons décrire ci-dessous les plus
importantes:
ListBox: propriétés et méthodes
Items
Items, contient l'ensemble des chaînes de caractères de la liste.
Liste1.Items.Add (Edit1.Text);
Items possède lui-même des propriétés et des méthodes (voir plus loin). Dans
l'exemple ci-dessus, Add est une méthode de Items permettant d'ajouter une
chaîne de caractères dans la liste existante Items. Dans la liste suivante, 'Vache',
'Cheval', … sont les chaînes de caractères contenues dans Items:
Annexe 1 : Compléments sur Delphi 361
ItemIndex
La propriété ItemIndex indique le numéro d'ordre de l'élément sélectionné dans
la liste.
Définition: property ItemIndex: Integer;
Liste2.Items.Add(liste1.Items[Liste1.ItemIndex]);
MultiSelect
Lorsque cette propriété est vraie, il est possible de sélectionner plusieurs
élément de la liste en même temps.
Petit rappel: pour sélectionner plusieurs éléments d'une liste, il faut
cliquer avec la souris sur l'élément ou les éléments choisis et appuyer en
même temps les touches shift ou contrôle du clavier.
Exemple:
Liste1.MultiSelect := true;
SelCount
La propriété SelCount permet de connaître le nombre d'éléments sélectionnés
dans la liste, si la propriété MultiSelect est vraie.
Exemple:
Selected
La propriété Selected permet de déterminer ou de connaître quels éléments de
la liste sont sélectionnés. Il s'agit en fait d'un tableau de valeurs booléennes.
Définition: property Selected[Index: Integer]: Boolean;
Cette propriété est très utile lorsque, par exemple, un traitement doit être
appliqué uniquement aux éléments sélectionnés d'une liste.
Exemple:
if Liste1.Selected[4] then…
Sorted
La propriété Sorted indique si la liste doit être automatiquement triée
alphabétiquement.
Définition: property Sorted: Boolean;
Exemple:
Liste1.Sorted := true;
Clear
Cette méthode permet de vider toute la liste en une seule fois.
Count
La propriété Count indique le nombre d'éléments actuellement contenus dans
une liste
Définition: property Count: Integer;
Exemple:
Strings
Cette propriété permet de spécifier une chaîne de caractères d'une liste
grâce à son indice.
Définition: property Strings[Index: Integer]: string;
Exemple:
AddStrings
Cette méthode permet d'ajouter une liste de chaîne de caractères dans la
liste courante.
Définition:
procedure AddStrings(Strings: TStrings); virtual;
Dans l'exemple suivant, tous les éléments de la liste Liste2 sont ajoutés en
une seule fois dans la liste Liste1:
Exemple:
Liste1.Items.AddStrings (Liste2.Items)
Append
Cette méthode est équivalente à la méthode Add, sauf qu'elle ne retourne
pas l'indice du nouvel élément ajouté.
Définition: procedure Append(const S: string);
Exemple:
Liste1.Items.Delete (2)
366 Annexe 1 :Compléments sur Delphi
Voici le résultat:
devient
Exchange
Cette méthode permet de permuter deux éléments d'une liste en indiquant
leurs indices respectifs.
Définition:
procedure Exchange(Index1, Index2: Integer); virtual;
Exemple:
Voici le résultat:
devient
Insert
Cette méthode permet d'insérer un élément à une position donnée dans la
liste courante.
Définition:
procedure Insert(Index: Integer; const S: string);
virtual; abstract;
Exemple:
devient
LoadFromFile
Cette méthode permet de placer dans la liste courante les lignes du fichier
texte passé comme paramètre.
Définition:
procedure LoadFromFile(const FileName: string);
virtual;
L'exemple suivant permet d'afficher dans la liste Liste1 le contenu du
fichier c:\config.sys.
Exemple:
Liste1.Items.LoadFromFile ('c:\config.sys');
Move
Cette méthode permet de déplacer un élément dans la liste courante.
Définition:
procedure Move(CurIndex, NewIndex: Integer); virtual;
Exemple:
Liste1.Items.Move (0,3);
Voici le résultat:
devient
SaveToFile
368 Annexe 1 :Compléments sur Delphi
Liste1.Items.SaveToFile ('c:\config.sys'):
Scroll1.Kind := sbVertical;
Min
Cette propriété permet de définir la valeur entière correspondant à la
position minimale du ScrollBar.
Définition: property Min: Integer;
Max
Cette propriété permet de définir la valeur entière correspondant à la
position maximale du ScrollBar.
Définition : property Max: Integer;
Annexe 1 : Compléments sur Delphi 369
Position
Cette propriété permet de fixer ou de connaître la position actuelle du
ScrollBar
Définition : property Position: Integer;
Exemple :
if then
begin
end
Annexe 1 : Compléments sur Delphi 371
else
begin
end;
Autre astuce : chaque modèle de code possède une abréviation. Tapez cette
abréviation puis Crtl+j. Tapez par exemple ifeb puis Crtl+j. Les lignes
correspondant à if then else s'écrivent à votre place. Les abréviations
disponibles sont visibles en faisant Crtl+j.
begin
A:=truc+machintruc;
end;
begin
if X>0 then x=0;
if X<0 then x=-1;
A:=truc+machintruc;
end;
Astuce : Sélectionnez les lignes puis faire Ctrl+Maj+i pour déplacer les lignes
vers la droite ou Ctrl+Maj+u pour les déplacer vers la gauche.
Remarque
S'il existe des composants fenêtrés sur la fiche (boutons par exemple), les
touches fléchées ne peuvent pas être interceptées en positionnant simplement
KeyPreview à true. Si par exemple je veux dessiner sur une paintbox à l'aide
des touches fléchées, ce sont les boutons qui reçoivent systématiquement les
messages des touches de direction, ainsi que ceux produits par <Tab>. Voici
une solution :
Ajoutez :
Comment voir les fonctions qui sont dans une DLL (et un tas d'autres
renseignements)
Tout simplement à l'aide de l’apperçu rapide de windows 95 ou 98 : Dans
l'explorateur de windows, cliquez sur votre fichier DLL avec le bouton droit de la
souris et choisissez apperçu rapide. Vous pouvez faire la même manip sur les
fichiers .exe.
376 Annexe 1 :Compléments sur Delphi
for I := 1 to ParamCount do
ShowMessage(ParamStr(I));
Annexe 1 : Compléments sur Delphi 377
type
TPersonne = record
Nom: string;
Prenom: string;
Age: integer;
end;
Explication:
Les String de Delphi 32 sont de 2 types: les chaînes longues et les
chaînes... courtes. La taille des chaînes courtes est définie par l'utilisateur dans le
source, le programme, mais si cette taille est indéfinie, le string devient une
chaîne longue. Le fait de ne pas définir la taille de ce string provoque une erreur
lors de sa sauvegarde dans un fichier de type "file of string" (ou, comme
dans notre exemple, "file of record" si le record en question contient une
chaîne longue), car le programme ne sait pas où se termine la chaîne (et peut
déborder sur la mémoire). Pour l'ouverture d'un fichier, c'est encore pire: on
déborde du fichier (théoriquement; mais Delphi empêche ce débordement). Delphi
génère un message d'erreur à la compilation pour empêcher ce genre de problème.
378 Annexe 1 :Compléments sur Delphi
type
TPersonne = record
Nom: string[20];
Prenom: string[20];
Age: integer;
end;
Et voilà, ça marche!
interface
procedure Enregistrer(fic: textfile);
implementation
procedure Enregistrer(fic: textfile);
begin
end;
Annexe 1 : Compléments sur Delphi 379
Explication:
Vous avez oublié de mettre var devant la déclaration de variable. En
effet, de toute façon vous ne pouvez pas utiliser une variable de type fichier dans
une procedure sans le var. Voici la correction:
interface
procedure Enregistrer(var fic: textfile);
implementation
procedure Enregistrer(var fic: textfile);
begin
end;
Le propriétaire:
- Est chargé de gérer l'allocation mémoire d'un composant
- Doit, lorsqu'il est supprimé, libérer la place mémoire occupée par les
composants qu'il possède
- Possède une propriété Components, tableau dynamique des composants
qu'il contient. ComponentCount indique le nombre de composants et
chaque composant a un numéro d'ordre donné par ComponentIndex.
380 Annexe 1 :Compléments sur Delphi
Le parent
- Est un attribut inhérent à Windows
- Détermine comment est affiché un composant fils.
- Est automatiquement attribué lors de la conception d'une application. Il doit
être spécifié lors de la création dynamique de composants.
Nous pouvons, par exemple, créer une fiche possédant un bouton (appelé
Go). Lorsque l'utilisateur clique sur le bouton, l'application doit créer une boîte de
texte (appelée dyna) contenant le mot 'OK'. De plus quand l'utilisateur tape le
mot 'Fin' dans la boîte de texte, l'application doit se terminer.
dyna.left := 100;
dyna.top := 50;
dyna.text := 'OK';
dyna.OnChange := clique;
end;
end;
type
Tdynamique = class(TForm)
Go: TButton;
procedure GoClick(Sender: TObject);
private
{ Déclarations privées }
dyna : TEdit;
procedure clique (Sender: TObject);
public
{ Déclarations publiques }
end;
ou encore
canvas.textout(20,50,'4*3.5='+floattostr(4*3.5));
Annexe 1 : Compléments sur Delphi 383
Valeur Signification
Une boîte de message contenant un signe point d’exclamation
mtWarning
jaune.
mtError Une boîte de massage contenant un signe de stop rouge
mtlnformation Une boîte de message contenant un « l » bleu
mtConfimation Une boîte de message contenant un point d’interrogation vert
Une boîte de message ne contenant pas d’image. Le titre de la
mtCustom boîte de dialogue est le nom du fichier exécutable de
l’application.
Valeur Signification
mbyes Un bouton avec une marque verte et le texte ‘oui’
mbNo Un bouton avec un cercle rouge barré et le texte ‘non’
mbOk Un bouton avec une marque verte et le texte ‘ok’
mbCancel Un bouton avec un X rouge et le texte ‘annuler’.
mbHelp Un bouton avec un point d’interrogation cyan et le texte ‘ aide ’
mbAbort Un bouton avec une marque rouge et le texte ‘abandonner’
384 Annexe 1 :Compléments sur Delphi
Valeur Signification
Un bouton avec deux flèches circulaires vertes et le texte
mbRetry
‘réessayer’.
mbIgnore Un bouton avec un bonhomme vert marchant et le texte ‘lgnore’
mbAll Un bouton avec une double marque verte et le texte ‘tous’
Valeur Signification
Un ensemble plaçant les boutons oui, non et annuler dans la
mbYesNoCancel
boîte de message
Un ensemble plaçant les boutons Abandonner Réessayer et
mbOkCancel
Ignorer dans la boîte de message
MbAbortRetryIgn Un ensemble plaçant les Abandons, Réessayer et lgnorer dans la
ore boîte de message.
if MessageDlg('Voulez-vous quitter?',
mtInformation, [mbYes, mbNo], 0) = mrYes then
Application.terminate;
Annexe 1 : Compléments sur Delphi 385
Utilisation de MessageBox
La fonction MessageBox est une méthode de Tapplication qui
encapsule la fonction MessageBox de l'API de Windows. Elle est plus souple
que MessageDlg. Sa syntaxe est la suivante:
La méthode MessageBox renvoie 0 s'il n'y a pas assez de mémoire pour créer
la boîte de message ou les valeurs suivantes sinon:
MB_ABORTRETRYIGNORE
MB_APPLMODAL
MB_DEFAULT_DESKTOP_ONLY
MB_DEFBUTTON1
MB_DEFBUTTON2
MB_DEFBUTTON3
MB_DEFBUTTON4
MB_HELP
MB_ICONASTERISK
MB_ICONERROR
MB_ICONEXCLAMATION
MB_ICONHAND
MB_ICONINFORMATION
MB_ICONQUESTION
MB_ICONSTOP
MB_ICONWARNING
MB_OK
MB_OKCANCEL
MB_RETRYCANCEL
MB_RIGHT
MB_RTLREADING
MB_SERVICE_NOTIFICATION
MB_SETFOREGROUND
MB_SYSTEMMODAL
Annexe 1 : Compléments sur Delphi 387
MB_TASKMODAL
MB_YESNO
MB_YESNOCANCEL
Spécificateur. Signification
Indique l’emplacement d’un chiffre. Un zéro apparaît si la
o
valeur n’a pas de chiffre à cet emplacement.
Indique l’emplacement d’un chiffre. Rien n’apparaît si la valeur
#
formatée n’a pas de chiffre à cet emplacement.
Indique le séparateur décimal. Le premier caractère. Dans la
. chaîne de format détermine l’emplacement du séparateur
décimal dans la valeur formatée.
Indique le séparateur des milliers, si le spécificateur contient un
’ ou plusieurs’' un séparateur des milliers sera inséré entre chaque
groupe de trois chiffres situés à gauche de la virgule.
E+ Indique la notation scientifique. Si l’une des quatre chaînes de
caractères E+, E-, e+, ou e-, est contenue dans la chaîne de
format, le nombre est formaté en utilisant la notation
scientifique. Un groupe de quatre caractères ‘0’ au plus peut
immédiatement suivre la chaîne ‘E+’, E-, e+, ou e-, afin de
Annexe 1 : Compléments sur Delphi 389
Spécificateur. Signification
déterminer le nombre de chiffres de l’exposant..
Les caractères compris entre des guillemets ou apostrophes sont
XX / XX
affichés tels quel.
Remarques:
- Les nombres formatés sont arrondis en fonction du nombre de décimales
du spécificateur de format.
- Si on ne spécifie pas assez de chiffres à gauche de la virgule, les chiffres
en trop sont tout de même affichés.
- La chaîne de format peut contenir une, deux ou trois sections séparées par
des points-virgule pour différencier le format des valeurs positives,
négatives et nulles. S'il y a une seule section, celle-ci s'applique à toutes les
valeurs. S'il y a deux sections, la première s'applique aux valeurs positives
et nulles et la deuxième aux valeurs négatives. S'il y a trois sections, la
première s'applique aux valeurs positives, la deuxième aux valeurs
négatives, et la troisième aux valeurs nulles.
Valeur Signification
Décimal : L’argument doit être une valeur entière. La valeur est
D
convertie en une chaîne de chiffres décimaux.
Scientifique : L’argument doit être une valeur réelle qui est convertie en
E
une chaîne de caractères de la forme ‘’-d.ddd… E+ddd.
Fixe : l’argument doit être une valeur réelle. La valeur est convertie en
une chaîne de caractères de la forme ‘’-ddd.ddd…’ la chaîne résultante
débute par un signe moins si le nombre est négatif. Le nombre de
F
chiffres après la virgule est indiqué par le spécificateur de précision de la
de la chaîne de format ; 2 décimales sont prises en compte par défaut si
aucun spécificateur de précision n’est spécifié
G Général : L’argument doit être une valeur réelle qui est convertie en une
chaîne de caractères la plus courte possible en utilisant le format fixe ou
Annexe 1 : Compléments sur Delphi 391
Valeur Signification
scientifique.
Numérique : La valeur est convertie en une chaîne de caractères de la
N forme ‘-d ddd ddd,ddd…’. Ce format est analogue au format ‘f’ sauf que
des séparateurs des milliers sont utilisés.
Monétaire : l’argument doit être une valeur réelle. La valeur est
convertie en une chaîne de caractères représentant un montant monétaire.
M
La conversion est paramétrée par les choix de la section international du
panneau de configuration windows.
Pointeur : l’argument doit être une valeur de type pointeur. Celle-ci
convertie en une chaîne de caractères de la forme ‘XXXX:YYYY’ où
P
XXXX et YYYY sont les parties segment et offset du pointeur ; sous
forme de quatre chiffres hexadécimaux
Chaîne de caractères : L’argument doit être un caractère, une chaîne de
S caractères ou une valeur de type PChar. La chaîne de caractère ou le
caractère est inséré à la place du spécificateur de format.
Hexadécimal : L’argument doit être une valeur entière qui est convertie
X
en une chaîne de chiffres hexadécimaux.
Remarques:
- les caractères de formatage peuvent être en majuscules ou en minuscules
- Les spécificateurs d'indice, de taille et de précision peuvent être spécifiés
directement comme dans
Format('%8.2f', [123.456]).
ou indirectement comme dans:
Format('%*.*f', [8, 2, 123.456])
392 Annexe 1 :Compléments sur Delphi
Exemple :
Placez sur une fiche un button, deux TEdit et un panel puis placez ce code
dans l'événement OnClick du bouton:
const
WM_MESSAGEPERSO = WM_USER + 1; { le 1 peut être
remplacé par le chiffre de votre choix ne pas
utiliser le même chiffre pour un autre message}
private
procedure WMMessagePerso(var Msg : TMessage);
message WM_MESSAGEPERSO; { procédure destinée à
recevoir le message WM_MESSAGEPERSO
394 Annexe 1 :Compléments sur Delphi
Introduction
Cet exemple a été fait d'après un exemple que m'avait fourni Daniel
Drouin. Merci à lui. Sans lui, je n'aurai pas réussi à comprendre cette technique
très peu documentée.
Principe général
Au départ, on crée un Hook en indiquant à Windows la fonction qui doit
être déclenchée à chaque fois que transite un message d'un certain type.
HookHandle:=SetWindowsHookEx(WH_MOUSE,HookActionC
allBack,HInstance,0);
- WH_MOUSE indique que l'on souhaite intercepter tous les messages de type
"souris".
- HookActionCallBack est le nom de notre procédure qui devra être
appelée lorsque circulera un message de type "souris"
- HookHandle récupère la valeur retournée par SetWindowsHookEx,
c'est à dire le Handle de notre Hook. Ce Handle nous servira par la
suite pour libérer le Hook à l'aide de la fonction
UnHookWindowsHookEx.
Exemple de code (attention, ce code ne peut fonctionner tel quel, voir plus bas, il
n'est là que pour la compréhension) :
Dans ce morceau de code exemple :
function InitializeHook(AWndCallBack:HWnd):HWnd;
stdcall; export; {SetWindowsHookEx permet de
donner à Windows le nom de la fonction qui sera
exécutée à chaque fois qu'il reçoit un message
de type WH_MOUSE }
begin
HookHandle:=SetWindowsHookEx(WH_MOUSE,HookActionC
allBack,HInstance,0);
end;
UnMapViewOfFile(DonneesHook);
CloseHandle(HookMap);
Exemple de déclaration :
TDonneesHook=class
HookHandle:HHook; {Handle retourné par
SetWindowsHookEx}
//autres variables à partager
end;
.......
Var DonneesHook : TDonneesHook;
......
Annexe 1 : Compléments sur Delphi 397
HookHandle:=SetWindowsHookEx(WH_MOUSE,
HookActionCallBack,HInstance,0);
Par
DonneesHook.HookHandle:=SetWindowsHookEx
(WH_MOUSE,HookActionCallBack,HInstance,0);
Et
Result:=CallNextHookEx(HookHandle,Code,Msg,
MouseHook);
par
Result:=CallNextHookEx(DonneesHook.HookHandle,
Code, Msg,MouseHook);
procedure LibraryProc(AReason:Integer);
begin
case AReason of
DLL_PROCESS_ATTACH:begin
{Il faut d'abord créer le FileMapping}
{le $FFFFFFFF indique seulement que ce n'est pas
un fichier qui sera mappé, mais des données }
{TDonneesHook.InstanceSize permet de donner à
Windows la bonne taille de mémoire à réserver}
HookMap:=CreateFileMapping($FFFFFFFF,nil,
PAGE_READWRITE,0,TDonneesHook.InstanceSize,
'Michel');
{Ensuite faire un View sur tout le fichier}
DonneesHook:=MapViewOfFile(HookMap,
FILE_MAP_WRITE,0,0,0);
end;
DLL_PROCESS_DETACH:begin {libérer les ressources
prisent par notre FileMapping}
UnMapViewOfFile(DonneesHook);
CloseHandle(HookMap);
end;
DLL_THREAD_ATTACH:;
DLL_THREAD_DETACH:;
end;
end;
exports
InitializeHook,
FinalizeHook;
begin
DllProc:=@LibraryProc;
LibraryProc(DLL_PROCESS_ATTACH);
end.