Delphi, niveau 2, page 4
Note : Cette page a été conçue comme
un aide mémoire. Certaines solutions pointent sur des pages d'ouvrages
Delphi classiques : "Delphi 3" par Dick Lantim, chez Eyrolles ;
Delphi
4, formation en 21 jours, par Kent Reisdorph, chez Simon et Schuster,
Macmillan ; Guide du langage Pascal objet, Borland, 1995- 1997,
livré avec Delphi 3, version professionnelle, commandée par
la revue Presqu'Offert (existe maintenant en version Delphi 4).
1 Contrôle de flux, structure de boucle, procédures
1.1. Contrôle de flux
-
If... Then... Else...
-
If ((x = 3) Or (x > 5)) Then y := 2 * x Else Begin x := 9 ; y := 1 End
;
-
Case Of
-
Case entree Of
-
'a' : Action 1 ;
-
'b', 'B' : Action 2
-
'd'..'g' : Action 3
-
Else Action 4
-
End
-
Action peut être un appel de fonction, de procédure, ou un
bloc de programme entre Begin et End.
1.2. Structure de boucle
-
Repeat Until : Répéter l'action jusqu'à ce que le
test donne vrai. // Attention aux bugs.
-
While Do : Tant que le test donne vrai, faire; // Attention aux bugs.
-
For Do :
-
Var i : Integer ;
-
For i := 1 To 100 Do Begin... End ;
-
Sorties de boucle :
-
Break : Sort de la boucle,
-
Continue : Passe à l'itération suivante,
-
Exit : Sort de la procédure ou du bloc de code courant,
-
Halt : Sortie en catastrophe.
1.3. Branchements
-
Goto, Label
-
Var x : Real
-
Label ici ;
-
If x > 0 Then Goto ici
-
...
-
ici :
1.4. Procédures, fonctions
-
Procedure Changer(x Real ; Var y : Real) ;
-
Begin
-
y := 2 * x
-
End ;
-
y est un paramètre adresse ; sa valeur est réellement changée.
-
Function Tangente(x : Real) : Real ;
-
Begin
-
Try Result := Sin(x) / Cos(x) ;
-
Except Result := 9999.999 End ;
-
End ;
-
Procedure ChangerYmaisPasZ(x Real ; Var y : Real ; Const z : Real) ;
-
z ne peut être changé, ce qui peut éviter des erreurs.
Procédure, fonction, Forward
-
Permet la récursivité croisée
Procédure, fonction, passage de paramètres par adresse
Permet de modifier les paramètres, par la procédure ou la
fonction
-
Procedure Modifier(a : Integer ; Var n : Integer) ;
-
Begin
-
n := 5 ; a := 5 ;
-
End ;
-
Le passage des paramètres à une procédure ou à
une fonction se fait soit en faisant une copie des valeurs (passage par
valeur), soit en fournissant l'adresse des valeurs (passage par adresse).
Dans le premier cas, les valeurs initiales ne sont pas modifiées
; elles le sont dans le deuxième.
-
Ici n est modifié, mais pas a. Cette procédure n'a aucun
sens.
Passer une fonction en paramètre d'une autre fonction
-
Type fctCalc = Function(x, y : Real) : Real ;
-
Function add(a, b : Real) : Real ;
-
Begin Result := a + b End ;
-
Function mult(a, b : Real) : Real ;
-
Begin Result := a * b End ;
-
// Notez que ces 2 fonctions sont bien du type fctCalc
-
Function Evaluer(x, z : Real ; Operation : fctCalc)
-
Begin Result := Operation(x, z) End ;
-
Evaluer(2, 5, add) // Donne 7
Affectation d'une valeur de type sous-programme
-
Voir le guide Pascal objet 4-20, 5-12, 6-13, 6-14, 4-21
Haut
de cette page
2 Types Pascal
String, chaîne de caractères
-
String, limitée à 255 caractères en Delphi 1.
-
String[n], avec n < 255, n'affiche que n caractères de la chaîne?
-
Chaîne longue en Delphi 3, 4... n'a pas d'élément 0.
La longueur est gérée dynamiquement.
-
Length(chaine), lire la longueur
-
SetLength(chaine), modifier la longueur
ShortString
-
255 caractères, le premier donne la longueur.
-
Correspond à String du Delphi 1.
-
longueur := Ord(chaine[0])
-
lettre3 := Ord(chaine[3]) donne la lettre 3 en code ASCII
-
chaine[3] donne la lettre 3.
PChar
-
Chaîne à zéro terminal, se présentant comme
un tableau de caractères.
-
Pour compatibilité avec C, C++, Windows (appel des API Windows).
-
StrPas convertit une chaine à 0 terminal, ou un tableau de caractères,
en chaîne Pascal.
-
StrPCopy, fait l'inverse.
Extraire des lettres d'une chaîne
-
Copy(chaineDeTexte, 3, 7) extrait 7 lettres de la chaîne, à
partir de la 3° lettre,
Tableau de chaînes, Resource String
-
Exemple : Resource String
-
msgChargement = 'Chargement en cours' ;
-
msgFin = 'Chargement terminé' ;
-
ShowMessage(msgFin) ;
-
Intéressant pour un projet multilingue,
Char
-
Caractère Ansi dans Delphi 1, Unicode dans Delphi 3 et suivants.
-
Voir l'information sur les caractères Unicode,
dans les pages traitant de la création d'un site Internet scientifique.
Boolean, booléen
-
2 valeurs, True ou False, vrai ou faux.
-
Fonctions agissant sur les booléens :
-
And, Or, Not.
-
Possibilité de placer des parenthèses de priorité.
Real, réels
-
Real, 6 octets
-
Single, 4 octets
-
Double, 8 octets
-
Extended, 10 octets.
-
Windows admet une variable globale DecimalSeparator, pour le séparateur
décimal ;
-
dans un programme Delphi, la sauvegarder, puis la rétablir, si on
désire la modifier.
-
Windows stocke la valeur de ce séparateur décimal dans sa
base de registres, mais aussi dans le fichier Win.ini. Ce dernier est prioritaire
sur la base de registre. A consulter si vous avez un problème dans
ce domaine sur une machine.
-
Il se trouve dans C : \ Windows ; cherchez le mot decimal. Vous trouverez
sdecimal = , (ou point).
Integer, entiers
-
Byte, 0 à 255, 1 octet
-
Word, 0 à 65535, 2 octets
-
Integer
-
LongInt
Var, variables
-
Var x : Real ;
-
Begin
-
x := 7 ;
-
Une variable locale à une procédure est créée
lors de chaque appel de la procédure.
-
Elle vaut donc à chaque fois 0, au début de la procédure.
-
Si vous ne voulez pas qu'elle soit remise à zéro, employez
une (fausse) constante typée, Const
Const, constantes
-
Il existe des constantes typées (fausses constantes) et des constantes
non typées (vraies constantes). Exemple de constante non typée
:
-
Const Pi = 3.14 ; // Note, ce n'est peut-être pas une bonne idée,
car Delphi connaît déjà Pi, avec une meilleure précision.
-
Il n' y a pas de vérification de type sur la constante, par le compilateur
; sa valeur ne peut plus être changée par le programme.
-
Exemple de constantes typées :
-
Const monMax : Integer = 100 ;
-
Nom : String = 'Dupont' ;
-
mesChiffres : Set Of '0'..'9' ;
-
Le fait de typer force le compilateur à faire une vérification
de type, donc réduit le risque d'erreurs.
-
Une constante typée n'est initialisée qu'une fois, lors du
premier appel du module contenant sa déclaration.
-
Sa valeur peut ensuite être changée par le programme.
-
Il ne s'agit donc pas ici d'une véritable constante.
-
Déclarée dans une procédure, une constante permet
de créer un compteur qui n'est pas remis à 0 à chaque
appel de la procédure, contrairement à ce qui se passe avec
une variable.
-
Si vous créez une procédure employant du langage Assembleur,
déclarez vos variables en tant que constantes typées,
-
sinon, l'Assembleur qui recherche leur adresse lors de la compilation,
trouve une valeur fausse, puisque la variable n'est pas encore créée.
Elle le sera lors de chaque appel de la procédure. Dans le code
Assembleur, apparaît une adresse négative, avec 'plantage'
assuré.
Array, tableau
-
Type mesTableaux = Array[1..5] Of Real ;
-
Var unDeMesTableaux : mesTableaux ;
-
unDeMesTableaux[2] := 27,3
-
Tableau à plusieurs dimensions :
-
Type mesTableaux2D = Array[1..3, 2..5] Of Char
Record, enregistrement
-
Type monEnregistrement = Record
-
Nom : string[30] ;
-
Age : Integer ;
-
Sexe : Char
-
End ;
-
Var personne : monEnregistrement
-
Begin personne.nom := 'Martin' ;
Tableau d'enregistrements
-
mte = Array[1..10] of monEnregistrement ;
Enregistrement d'enregistrements
-
Type typeAdresse = Record
-
Rue : String[50] ;
-
Ville : String[50] ;
-
End ;
-
typePersonne = Record
-
Nom : String[50] ;
-
adresseDomicile : typeAdresse ;
-
adresseTravail : typeAdresse ;
-
End ;
-
Var salarie : typePersonne ;
-
With salarie.adresseDomicile Do
-
Rue := 'Lenoir' ;
-
Ville := 'Paris' ;
-
End ;
-
With permet d'éviter des répétitions et allège
le code.
Intervalle
-
Type minuscule = 'a'..'z' ;
-
Var lettreAcceptee : minuscule ;
-
lettreAcceptee := 'b' ;
-
lettreAcceptee := 'B' ;
-
En cas d'erreur -> Range Error
Ensemble
Permet de former une liste non ordonnée de variables de même
nature, et de vérifier si une grandeur appartient à cette
liste. Ne peut contenir plus de 256 valeurs.
-
Type TVoyelles = Set Of Char ;
-
Var voyelle : Tvoyelles ;
-
ensemble vide : voyelles := [] ;
-
voyelle := ['a', 'A', 'e'...] ;
-
If caractereLu In voyelle Then... // Répond True si caractereLu
appartient à l'ensemble.
-
TypeClavierTelephone = Set Of Char ;
-
Var clavierTelephone : TypeClavierTelephone ;
-
ClavierTelephone := ['0'..'9', '*', '#'] ;
-
Des ensembles peuvent être concaténés (+), soustraits
(-). L'opération * donne l'intersection.
-
Ceci peut être appliqué aux propriétés de type
ensemble, Style de l'objet Font, BorderIcons de TForm, Anchors de nombreux
composants.
Type énuméré
-
Type TJours = (Lundi, Mardi... ).
-
Var jour : TJours ;
-
jour := TJours(1) ; // jour vaudra ici mardi ; l'énumération
commence à 0.
-
Ce type intervalle peut ensuite être utilisé pour définir
un tableau :
-
JourString : Array[TJours] Of String = ('Lundi', 'Mardi',... ).
-
Ceci car il n'existe pas ici, à priori, de fonction de transtypage
; la variable Mardi, de type jour ne peut pas s'afficher dans un Edit,
comme une variable de type String.
Type Variant, fonction de Variant, type Function
-
Une variable de type Variant consomme plus de ressources qu'une variable
de type standard. Elle introduit, selon l'auteur de ce site, plus de risques
d'erreurs de programmation. Elle est beaucoup plus souple qu'une autre.
-
Page 328 de "Delphi 3" par Dick Lantim.
-
Page 336 de "Delphi 3" par Dick Lantim, utilisation du type Variant pour
des fonctions applicables à différents paramètres,
avec tests de validité, exemple, ne pas ajouter une date et un nombre.
-
Page 647 de "Delphi 3" par Dick Lantim, surcharge d'une classe, test du
type Variant,
-
value : Variant ;
-
Case varType(value) Of
-
Var Currency :
Var Boolean...
Tester si un objet appartient à une classe, IS, AS
-
If Edit5 Is TEdit Then...
-
Renvoie vrai si Edit5 est bien de type TEDit.
Pointer, type pointeur
-
Type monPointeurSurReel = ^ Real ;
-
Var P : monPointeurSurReel ;
-
Begin
-
New(P) ;
-
P^ := 21.6 ;
-
x := P^ ;
-
dispose(P) ;
-
^ est appelé carret,
-
New alloue de la mémoire, Dispose libère la mémoire,
-
P^ pour déreférencer le pointeur.
Pointeur de méthode
Permet de déclarer un type de calcul, en tant que méthode
d'une classe.
Valeurs de type sous-programme
-
Voir le guide du Pascal objet 4-20 et 5-12,
-
pour exprimer Form1, Canvas, Printer... comme une "variable".
Haut
de cette page
3 Transtypage
-
IntToStr, FloatToStr, FloatToStrF, StrToInt, StrToFloat,
-
TimeToStr,
-
Trunc, Int, Frac, Ord, Chr, Integer
-
IntToStr(3) -> '3' convertit un nombre entier en type String,
-
FloatToStrF(5.564, ffGeneral, 1,1) formate le nombre de type Real et le
transforme en String.
-
Trunc(5.6) -> 5
-
Ord('A') -> code ASCII sous forme d'un Byte, soit 65 ; 'a' -> 97, '0' ->
48.
-
Integer('A') -> code ASCII, sous forme de nombre entier, Integer.
-
Chr(nombre) donne la lettre à partir du code ASCII.
-
Au clavier, Alt 0169 donne le symbole du Copyright.
-
#9, tabulation ; #32, espace ; #45, tiret ; #10, saut de ligne ; #13, retour
chariot.
-
#13, valeurs de la ligne suivante pour tableur.
-
#10, valeurs de la ligne suivante pour Maple.
-
#19, EOF, fin de fichier.
-
StrPas convertit une chaine à 0 terminal, ou un tableau de caractères,
en chaîne Pascal.
-
StrPCopy, fait l'inverse.
Haut
de cette page
4 Opérateurs
4.1. Opérateurs arithmétiques
-
+ - * /
-
Attention, / entre 2 entiers produit un réel.
-
Div, division entière,
-
Mod, reste de la division entière
4.2 Opérateurs logiques
-
Fonctions agissant sur les booléens :
-
And, Or, Not, XOr donnent True ou False.
-
Fonctions agissant bit à bit sur des entiers, Integer :
-
And, Or, Not, XOr, Shl, Shr (rotation de bits)
-
Possibilité de placer des parenthèses de priorité.
4.3. Opérateurs relationnels
-
= égal, différent <>, inférieur ou égal
<= (ou sous-ensemble) etc.
-
In (membre de, ou appartient).
4.4. Fonctions mathématiques
-
Pi, Abs(), Sqr(), Sqrt(), Exp(), Ln(), Int(), Frac(), Sin(), Cos(), ArcTan(),
Inc(), Dec(), Power, Intpower
-
D'autres fonctions sont disponibles en ajoutant dans les clauses Uses,
Math :
-
Tan(), log10(), log2(), logN(), Max, MaxIntValue, MaxValue, Mean (moyenne)
et autres fonctions statistiques.
Haut
de cette page
5 Exceptions
Utilisation des exceptions
-
Il s'agit du traitement des erreurs, le but étant de s'approcher
du programme sans bug.
-
Il est conseillé d'y recourir systématiquement.
-
Ennui : Lorsqu'une exception est soulevée, alors que le programme
est en mode exécution, sous le contrôle de Delphi, celui-ci
se bloque. Pas de problème, Delphi peut être paramétré
pour ne plus se bloquer. Cela permet de voir comment va réellement
se comporter l'exécutable lorsqu'il sera sur une autre machine.
Pour cela, faites : Outils | Options du débogueur | Exceptions du
langage | et décochez Arrêter sur exceptions Delphi.
-
Causes courantes d'erreurs :
-
Division par zéro (grand classique),
-
lecture d'un nombre incorrect dans un Edit, lettre, séparateur décimal
(moins classique),
-
accès à un composant qui n'existe pas, ou pas encore, ou
qui vient d'être détruit (erreur fatale conduisant au plantage
de Windows, car celui-ci ne vérifie pas l'existence du composant).
-
Conseil : Ne pas systématiquement faire afficher un message d'erreur
par l'exception, à l'aide de ShowMessage ;
-
car cela peut aussi bloquer le programme, si l'exception se produit dans
une boucle, car chaque boîte de message doit être fermée
manuellement.
-
Traiter l'exception pour protéger un bloc et, si besoin, afficher
un message dans la barre de statut, StatusBar. Exemple :
-
Var x, y : Real ;
-
Try
-
y := 1 / x ;
-
Except
-
y := 1 ; StatusBar1.SimpleText := 'Erreur de division.' ;
-
End ;
-
On peut aussi employer :
-
Try
-
liste d'instructions n° 1 ;
-
Finally
-
liste d'instructions n° 2 ;
-
End ; // En ce cas, liste d'instructions n° 2 est toujours exécutée.
A tester soigneusement.
-
Si on laisse faire Delphi, sans Try Except, il affichera une boîte
de dialogue 'division par zéro'. Ce n'est pas très 'professionnel'
et dans une boucle cela peut tout bloquer. Ici l'erreur est traitée,
puis
-
l'erreur est ensuite étouffée ; c'est à dire qu'elle
n'est pas transmise à la suite : Elle est traitée par le
bloc de code et le bloc supérieur de code n'est pas alerté.
-
Or en programmation objet, il est nécessaire qu'une instance de
classe dérivée soit informée d'une erreur qui se produit
dans la classe de base.
Propager une exception
-
Voici un exemple d'une procédure en appelant une deuxième.
Celle-ci commet une erreur (division par 0). Elle la traite (le but n'est
pas de planter l'ordinateur ! ) et la transmet à la procédure
appelante :
-
Function Diviser(x, y : Real) : Real ; // 2° procédure
-
Begin
-
Try
-
Result := x / y ;
-
Except
-
Result := 1 ; StatusBar1.SimpleText := 'Erreur de division.' ;
-
Raise ; // Raise interrompt (supprime) l'exécution du code éventuel
après le bloc Try Except Raise End;
-
End ;
-
suite du code... // attention, s'il y a du code ici, il semble que l'exception
ne soit pas toujours propagée, contrairement à ce que dit
l'ouvrage "Delphi 3" par Dick Lantim, page 315. A tester soigneusement.
En tout cas, plus de plantage.
-
End ;
-
Procedure Employer ;
-
Var obtenu : Real ;
-
Begin
-
Try
-
obtenu := Diviser(5, 0) ;
-
Except
-
MessageBeep(1) ;
-
End ;
-
... End ;
-
L'exception est transmise à la procédure appelante, Employer,
un bip est émis.
Soulever une exception
Attention, une exception provoque l'affichage d'une boîte
de dialogue, ce qui peut s'avérer désastreux si elle est
déclenchée dans une boucle. On peut créer des exceptions
silencieuses
par Abort (voir quelques lignes plus loin), ou intercepter les exceptions.
-
If... Then Raise Exception.Create('Message d''erreur') ou encore
-
MonException = Class(Exception) ;
-
If... Then raise MonException.Create('Message d''erreur')
-
RunError(n) ; avec n : Integer.
-
Page 316 de "Delphi 3" par Dick Lantim.
Récupérer un type d'exception
-
Try... Except On EDivByZero Do... Else... ou encore
-
Try... Except On EDivByZero ShowMessage(E.Message)... Else...
-
Page 316 de "Delphi 3" par Dick Lantim.
Faut-il déclarer E de la classe Exception ? très certainement,
donc E est en fait MonException de la page 315, ou E du paragraphe suivant
(page 322).
Liste des exceptions
-
Page 322 de "Delphi 3" par Dick Lantim.
Gestionnaire d'exceptions pour une Application
-
Form1.Create
-
Application.OnException := GererExceptPerso
-
Procedure GererExceptPerso(Sender : TObject ; E : Exception) ;
-
Panel1.Caption := E.Message ;
Exception silencieuse
-
Première méthode : remplacer Raise par Abort.
-
Deuxième méthode : soulever une exception de la classe EAbort,
-
If... Raise EAbort.Create('Message d''erreur') ;
-
Page 323 de "Delphi 3" par Dick Lantim.
Assertion
Ressemble aux exceptions. Mot clé : Assert dans l'unité System.
Fournit en plus le numéro de la ligne où s'est produite l'erreur.
De plus, peut être réactivée dans l'exécutable
final, par Options de projet | Compilateur | Assertion
-
Page 325 de "Delphi 3" par Dick Lantim.
Recopie d'un tableau dans un autre, par pointeur et Move, tableaux de Variant
-
Page 336 de "Delphi 3" par Dick Lantim.
Haut
de cette page
6 Thread
Thread
Traitement associé à un programme et exécuté
de manière indépendante. Voir la classe Delphi TThread.
-
Pages 488-543 de "Delphi 3" par Dick Lantim.
-
Procedure FaireIndependament ; stdCall ;
-
et pour évènement associé à un Button...
-
Procedure TForm1.Button1Click(Sender : TObject) ;
-
Var ThreadID, hThread : THandle ;
-
Begin
-
hThread := CreateThread(Nil, 0, @FaireIndependament, 0, 0, TreadID)
Arrêt d'un Thread (même s'il est planté dans une boucle
sans fin)
-
Button2Click...
-
TerminateThread(hThread) ;
-
hThread doit être une variable globale.
Classe Delphi, TThread
-
Page 543 de "Delphi 3" par Dick Lantim.
Thread et Canvas
-
Page 551 de "Delphi 3" par Dick Lantim.
-
2 Threads ne doivent pas effectuer simultanément des tracés
sur le même Canvas.
-
Exemple de remplissage fluide d'un Bitmap.
TLS, variable pour Thread -> ThreadVar
-
Déclarée une fois, mais propre à chaque instance du
même Thread,
-
Page 555 de "Delphi 3" par Dick Lantim.
Haut
de cette page
7 Composants
7.1. Quelques composants
Composant TChart
-
Voir usage dans les travaux pratiques de ce site.
Composant Timer
-
La variable Interval est exprimée en millisecondes ;
-
la précision est d'environ 5 %, mais cela peut être pire si
Windows décide de relancer le disque dur, en plein milieu d'une
série de mesures.
-
Il dépasse péniblement 25 Hz, même sur un Pentium à
700 MHz !!!
-
Il ne peut donc pas être utilisé pour de l'acquisition de
données.
Composant Shape
-
permet de placer des objets de forme simple, cercle, disque, rectangle,
triangel, colorés ou non, sur l'écran.
Composant TImage
-
Peut afficher des
-
bitmaps, icônes, métafichiers wmf, métafichiers avancés
emf, des jpeg (il faut ajouter jpeg dans les clauses Uses)
Composant ImageList
-
Pour stocker un grand nombre d'images de même taille.
-
Propriétés intéressantes : Masked (transparence),
itMask (pour masquer d'autres images), DrawingStyle qui met plus ou moins
en surbrillance.
Page 610 de "Delphi 3" par Dick Lantim.
Composant UpDown
-
Flêches montante et descendante ; associable à n'importe quel
autre composant.
-
Cette association se fait en attribuant le nom du composant associé
à la propriété Associate de UpDown.
-
Les propriétés AlignButton et Orientation permettent la personalisation.
Composant HotKey
-
Permet d'associer un raccourci clavier, à une option de menu, en
mode exécution.
-
Page 620 de "Delphi 3" par Dick Lantim.
Composant ToolBar
-
Voir la propriété Flat qui donne l'aspect Internet Explorer.
-
Plus généralement, construction d'une barre d'outils.
Page 633 de "Delphi 3" par Dick Lantim.
Navigateur Web
-
Page 734 de "Delphi 3" par Dick Lantim.
-
Voir sauvegarde de texte html, avec traitement des fins de ligne.
Voir aussi dans Delphi 4, les exemples dans Borland \ Delphi4 \ Demos
\ Internet.
JPEG
-
Propriétés pour concevoir un visualiseur d'images.
-
Page 934 de "Delphi 3" par Dick Lantim.
-
Voir aussi 20-9 et 21-6 du guide des développeurs.
-
Propriétés tableaux et propriétés utilisant
un spécificateur d'index, page 10-25 du guide Pascal.
7.2. Quelques propriétés
Lier un Label à un Edit
-
Permet d'accéder à l'Edit par un raccourci clavier, Alt +...
-
Dans le Label, choisir la propriété FocusControl.
-
Lui attribuer l'Edit concerné.
Montrer une fenêtre, en cacher une autre
-
Form1.Show, ou Form1.ShowModal
-
Form2.Hide
Propriété HotTrack
-
Met en surbrillance une indication, lors du passage de la souris,
-
exemple pour TabControl, ou mieux PageControl
Redimensionner un StringGrid
-
Pour diminuer la taille : Clear
-
StringGrid1.Rows[1].Clear
-
page 932 de "Delphi 3" par Dick Lantim.
Donner le Focus à un composant :
-
Form1.ActiveControl := Edit4 ; ou encore
-
Edit4.SetFocus ;
Connaître l'objet qui a le focus :
-
Label1.Caption := Form1.ActiveControl.ClassName ;
Dérouter le gestionnaire d'aide OnHint
-
Activez le mode Hint en choisissant la propriété ShowHint
égale à True,
-
Procedure TForm1.AffAide(Sender : TObject) ;
-
Begin StatusBar1.SimpleText := Application.Hint End ;
-
Procedure TForm1.FormCreate(Sender : TObject) ;
-
Begin Application.OnHint := AffAide End ;
-
Autre possibilité : Ecrire le texte Hint en 2 parties séparées
par | :
-
ce qui s'affiche dans la bulle | ce qui s'affiche dans la barre de statut.
Empêcher la modification de la taille d'une fenêtre
-
Surcharger la méthode OnSize,
-
page 910 de "Delphi 3" par Dick Lantim.
-
Voir aussi la propriété BordersIcon de la Form.
Créer un bouton rond, ou un autre contrôle
-
page 916 de "Delphi 3" par Dick Lantim.
7.3. Autres informations sur les composants
Perform
-
Permet d'envoyer un message Windows à un composant de l'application
en cours, sans utiliser l'API Windows SendMessage.
-
Page 616 de "Delphi 3" par Dick Lantim.
Paquets, ou paquetages de conception et de déploiement
-
Voir s'il est possible d'inclure un composant dans un paquet créé
à sa convenance, et pas seulement dans le paquet utilisateur imposé
par Delphi.
-
Page 754 de "Delphi 3" par Dick Lantim.
-
Page 755 de "Delphi 3" par Dick Lantim, création d'un paquet.
-
Page 763 de "Delphi 3" par Dick Lantim, paquets à fournir au développeur,
avec ou sans les sources.
-
Voir aussi Install Shield, qui détecte et installe automatiquement
les paquets manquants.
Création de composants
-
Voir différents types de propriétés et la façon
de les éditer dans l'inspecteur d'objets.
-
Voir type énuméré et
-
type ensemble.
-
Page 775 de "Delphi 3" par Dick Lantim.
-
Comment placer un type objet ou un type composant, dans un composant en
cours de création :
-
page 778 de "Delphi 3" par Dick Lantim.
-
Modification d'un composant, création d'évènements,
-
page 786 de "Delphi 3" par Dick Lantim.
-
Différentes étapes de la vie d'un composant, personalisation
d'une propriété au chargement,
-
page 793 de "Delphi 3" par Dick Lantim.
-
Créer un composant pointant sur un autre composant, test de l'existence
de ce dernier,
-
page 795 de "Delphi 3" par Dick Lantim.
-
Création d'un composant se dessinant lui-même,
-
page 797 de "Delphi 3" par Dick Lantim.
-
Editeur de propriétés,
-
page 809 de "Delphi 3" par Dick Lantim.
-
Editeur de propriétés, pour un type d'objet, propriété
disposant de sous propriétés,
-
page 812 de "Delphi 3" par Dick Lantim.
-
Editeur de composant, pour associer le menu Pop Up associé au composant,
pour associer une action au double clic sur le composant,
-
page 822 de "Delphi 3" par Dick Lantim.
-
Génération d'experts,
-
page 832 de "Delphi 3" par Dick Lantim.
-
Génération de fiche,
-
page 855 de "Delphi 3" par Dick Lantim.
Code associé à un composant
-
Copier un Button dans Form1, le coller dans Unit1,
-
donne le code du Button ;
-
modifier le code, le copier et le coller dans Form1,
-
dessine le nouveau Button.
Audit de code
-
Entrez le début du mot clé, par exemple Proc ou If, faites
-
Control J,
-
Delphi crée la structure du code.
Indentation d'un bloc sélectionné, Control Maj I, éditeur
de code
-
Désindentation, Control Maj U ;
-
ceci permet de présenter le code de manière plus lisible,
ce qui contribue à réduire les risques d'erreurs.
Construire un composant, à partir de son nom sous forme de String
-
Intérêt : Il n'est pas nécessaire de placer un composant
sur la Form, pour qu'il puisse servir de modèle à la création.
-
RegisterClasses(TEdit, TButton... )
-
Reference := TControlClass(GetClass('TEdit'))
-
If Reference <> Nil Then Begin
-
Instance := Reference.Create(Self) ;
-
Instance.Parent := Self
-
End ;
-
Reference : TControlClass
-
Instance : TControl,
-
page 930 de "Delphi 3" par Dick Lantim.
Création dynamique d'objets avec affectation du pointeur
-
page 931 de "Delphi 3" par Dick Lantim.
Différents menus agissant (de manière légèrement
différente) par la même procédure
-
A chaque menu, associer une propriété Tag.
-
Procedure ActionCommune(Sender : TObject) ;
-
Begin
-
Faire((Sender As TmenuItem).Tag) ;
-
End ;
-
Page 115 de "Delphi 3" par Dick Lantim.
Différents menus ou Buttons agissant par la même procédure
-
Sélectionnez le Button ou l'élément de menu,
-
dans l'inspecteur d'objets, ouvrez l'onglet évènements
-
dans l'évènement intéressant, ouvrez la liste déroulante
des évènements compatibles déjà disponibles.
-
Cela évite de dupliquer du code.
Fusion de menus
-
Page 111de "Delphi 3" par Dick Lantim.
Objet Delphi dans une Dll
-
Page 164 de "Delphi 3" par Dick Lantim.
Créer une classe et l'exporter dans (grâce à) une Dll
8 Informations diverses
Raccourci clavier
-
Exemple : Control + F4
-
Correspond à l'attribut ShortCut.
Touche de raccourci
-
Exemple : Alt + F, créée par le texte '&F'.
-
La touche alt ne doit être enfoncée que pour accéder
au menu principal ;
-
les lettres suffisent pour les sous-menus.
Conventions Windows
-
Si un élément de menu donne accès à un sous-menu,
il doit s'écrire suivi d'une flêche triangulaire.
-
Un bouton demandant des informations supplémentaires doit porter
un texte terminé par des points de suspension...
-
Un composant non disponible doit figurer en grisé (propriété
Enabled := False).
-
Les RadioButtons, boutons radio, doivent être en mode exclusif, sinon
mieux vaut employer
-
des CheckBox, cases à cocher.
-
Les RadioButtons doivent être placés dans un conteneur, RadioGroup,
Panel (volet) ou Bevel (biseau).
-
Le groupe contenant RadioButtons et CheckBox doit être accessible
par une touche de raccourci ;
-
ainsi, un nouvel appui sur la même lettre fait passer le Focus à
l'intérieur du groupe ;
-
le déplacement à l'aide des touches fléchées
devient possible.
-
Ou accessible par appuis successifs sur la touche de tabulation ;
-
lorsque le contrôle a le Focus, il est mis en surbrillance. La barre
d'espace permet de le sélectionner.
-
Un Label ne doit pas recevoir le Focus.
Base de registre
-
Page 640 de "Delphi 3" par Dick Lantim.
-
Ajouter aux clauses Uses : Registry.
-
Comment associer une extension de fichier à un programme exécutable
Barre des tâches
-
C : \ Windows \ Menu Demarrer \ Sous Dossier
-
Tout sous-dossier créé apparaît dans le menu Démarrer
(ici, au-dessus de Démarrer).
-
Si on fait : C : \ Windows \ Menu Demarrer \ Programmes \ PhyJi,
-
PhyJi apparaît dans Démarrer | Programmes
-
Voir aussi le paramétrage de Install Shield, qui fait cela tout
seul, s'il est bien paramétré.
-
Page 650 de "Delphi 3" par Dick Lantim.
-
Le chemin C : \ Windows \ Menu Demarrer \... dépend des machines.
On peut le retrouver dans tous les cas dans
-
HKEY_CURRENT_USER \ SOFTWARE \ MICROSOFT \ WINDOWS \ CURRENTVERSION \ EXPLORER
\ SHELL FOLDERS \ PROGRAMS
-
Cette adresse, sans PROGRAMS, mais avec DESKTOP pointe sur le dossier où
se trouvent les raccourcis sur le bureau.
-
Page 651, le code permettant de le retrouver, dans tous les cas.
-
Page 652, le code permettant la création ou la destruction du sous-dossier.
Tray Icon
-
Pour les programmes résidents.
-
Page 658 de "Delphi 3" par Dick Lantim.
Invisibilité d'une application résidente
-
La fenêtre secrète de Delphi,
-
la fenêtre de taille 0 x 0 correspondant à l'objet Application
Page 663 de "Delphi 3" par Dick Lantim.
Récupérer l'extension d'un fichier
-
Page 98 de "Delphi 3" par Dick Lantim.
Fermer une application
Fichier inclus
-
Fichier | Nouveau | Texte
-
Sauvegarder sous list.INC (et non pas .TXT)
-
Pour utiliser ce fichier dans Unit1, ajouter la directive de compilation
:
-
{$I list.inc}
-
Page 68 de Delphi 4 en 21 jours.
Turbo débogage
-
Options de projet | Lieur | Informations de débogage TD32
-
crée les informations pour le débogueur TD32 livré
avec C++ et certaines versions de Delphi.
-
Voir aussi memory Sleuth.
-
Lors de votre dernière compilation, avant mise sur le marché
de votre logiciel, n'oubliez-pas de supprimer toutes les informations de
débogage, sinon les petits malins qui vivent et s'enrichissent avec
le travail des autres vous remercieront (intérieurement).
Aide sur les API Windows
-
Dans BorlandShared \ MSHelp \ Win32.hlp
Placer des marques
-
Placer : Control Maj numéro de 0 à 9
-
Numéro avec rangée supérieure du pavé principal
et pas pavé numérique.
-
Retrouver : Control + numéro.
Scruter le code
-
Avec Delphi 3 Professionnal :
-
Fichier | Ouvrir | C : \ Program Files \ Borland \ Delphi3 \ Source \ VCL
-
Avec Delphi 4 Professionnal :
-
Edit1.Show
-
Cliquer droit sur Edit ou sur Show,
-
dans le menu contextuel qui s'ouvre, faire Chercher la déclaration.
Programmes complémentaires livrés avec Delphi
-
Install Shield : Son usage est détaillé sur ce site.
-
WinSight : espionne Windows. Dans ... Delphi \ Bin \ WinSight.exe.
-
Tdump.exe, dans le même dossier, ligne de commande DOS :
-
Tdump nomapplication.exe > info.txt
-
permet de retrouver les DLL employées par nomapplication.exe
-
info.txt sauvegarde le résultat dans un fichier texte.
-
Compilateur de resources, BRCC32
-
Ligne de commande : BRCC32 maressource.rc
-
Compile le fichier ressource maressource.rc en .res.
-
ResourceWorkshop
Haut
de cette page
9 Dessin sur le Canvas d'une Form
-
Récupération des dimensions :
-
hauteur := Form1.Height ;
-
longueur := Form1.Width ;
-
Changement de la couleur d'un point :
-
Canvas.Pixels[x, y] := 0 ;
-
Les couleurs sont codées de 0 à 255 ou sur 3 octets, ou par
nom de couleur, ex clWindows, clRed.
-
Traçage d'un segment de droite :
-
Form1.Canvas.MoveTo(x, y) ; //plume levée
-
Form1.Canvas.LineTo(x2, y2) ; //on trace
Haut
de cette page
10 Imprimer un graphique
-
Printer.BeginDoc ;
-
a := Printer.PageHeight ;
-
b := Printer.PageWidth ;
-
Printer.Canvas.TextHeight('texte quelconque') ;
-
Printer.Canvas.MoveTo(x, y) ;
-
Printer.Canvas.LineTo(x2, y2) ;
-
Printer.EndDoc ; //C'est ici que l'impression démarre
-
//ATTENTION : Si un bug bloque le programme entre Printer.BeginDoc et Printer.EndDoc,
l'imprimante plante ;
-
Voir le paragraphe Exceptions, pour traiter proprement cela.
Haut
de cette page
11 Traitement des fichiers
11.1. Composants OpenDialog et SaveDialog
-
Voir dans l'aide en ligne l'emploi de ces 2 composants, qui comportent
des fonctions proches de celles de l'explorateur de Windows.
-
If OpenDialog1.Execute Then...
-
If SaveDialog1.Execute Then...
11.2. Fonctions de traitement des fichiers
-
FileExists, teste l'existence d'un fichier.
-
Rewrite, crée et ouvre, écrase un fichier de même nom.
-
WriteLn, écrit une ligne de texte et passe à la ligne.
-
Write
-
CloseFile, ferme.
-
Reset, ouvre.
-
ReadLn, lit une ligne.
-
Read
-
Eof, fin de fichier. #19.
-
AssignFile
-
Seek, place le pointeur dans un fichier.
-
BlockRead
-
BlockWrite
-
FilePos, position courante du pointeur dans le fichier.
-
Handle := FileCreate
-
Erase, supprime.
-
FileSize, taille.
-
GetDir, répertoire courant.
-
MkDir, crée un sous-répertoire.
-
Rename, renomme.
-
RmDir, supprime un répertoire.
-
FileOpen
Haut
de cette page