Difference between revisions of "Object Oriented Programming with Free Pascal and Lazarus/fr"

From Lazarus wiki
Jump to navigationJump to search
m
Line 1: Line 1:
 
{{Object_Oriented_Programming_with_FreePascal_and_Lazarus}}
 
{{Object_Oriented_Programming_with_FreePascal_and_Lazarus}}
  
Il y a beaucoup d'excellents tutoriels sur Pascal, mais ce tutoriel tente d'amener le débutant plus loin, dans (la programmation orienté objet) [[Glossary#OO | Object-Oriented Programming]], qui est une extension de la norme Pascal standard, offert par Turbo-pascal, Delphi et FreePascal/Lazarus.
+
Il y a beaucoup d'excellents tutoriels sur Pascal, mais ce tutoriel-ci tente d'amener le débutant plus loin, dans (la programmation orienté objet) [[Glossary#OO | Object-Oriented Programming]], qui est une extension de la norme Pascal standard, offert par Turbo-pascal, Delphi et FreePascal/Lazarus.
  
 
Un objet [[Glossary#Object | Object]] est une extension de la structure record du Pascal [http://wiki.lazarus.freepascal.org/Record record]
 
Un objet [[Glossary#Object | Object]] est une extension de la structure record du Pascal [http://wiki.lazarus.freepascal.org/Record record]

Revision as of 00:32, 20 February 2010

Template:Object Oriented Programming with FreePascal and Lazarus

Il y a beaucoup d'excellents tutoriels sur Pascal, mais ce tutoriel-ci tente d'amener le débutant plus loin, dans (la programmation orienté objet) Object-Oriented Programming, qui est une extension de la norme Pascal standard, offert par Turbo-pascal, Delphi et FreePascal/Lazarus.

Un objet Object est une extension de la structure record du Pascal record

La programmation Pascal standard en mode texte est bien adaptée à la création d'applications qui, comme les applications Unix, font une chose, et la font très bien. Un programme peut réaliser une tâche très compliquée, et offrir à l'utilisateur plusieurs options accessibles par menus ; mais, essentiellement, cela se résume à obéir à des commandes tapées au clavier par l'utilisateur et à afficher les réponses sur le terminal ou l'imprimante.

Pour pouvoir founir une Interface Utilisateur Graphique ( Graphical User Interface (GUI)), il est habituel d'invoquer une méthode de Programmation Orientée Objet ou une autre (en utilisant souvent C, ou l'une de ses variantes, ou Visual Basic, ou l'une des variantes OO de Pascal telle que FreePascal avec ou sans Lazarus).

Dans un(e) GUI, l'utilisateur est confronté à un écran présentant une grande quantité d'images, disposées de façon structurée, et consistant en un ensemble d'outils ou de Widgets qui sont associés à diverses actions telles que :

  • sélection depuis un menu ;
  • ouverture ou sauvegarde d'un fichier ;
  • connection à Internet ;
  • réalisation de calculs numériques ;
  • etc.

L'utilisateur doit alors déplacer une souris ou un autre périphérique de pointage et de sélection, pour sélectionner à l'écran les actions à réaliser en réponse à un clic de souris ou à une pression de touche sur le clavier.

Alors que les systèmes prenant en charge une interface utilisateur graphique complexe peuvent être écrits en Pascal, ou quasiment n'importe quel autre langage de programmation, il est bien plus aisé d'utiliser un système orienté objet, dans lequel les propriétés, les procédures et les fonctions relatives à l'utilisation de chaque objet graphique présent à l'écran peuvent être rassemblées dans une structure commune.


Objets - une analogie dans le monde réel

Considérons l'analogie avec un prélèvement sanguin dans un hôpital ou le cabinet d'un médecin.

Prélèvement sanguin

Le résultat physique du prélèvement est certainement un objet ; des informations lui sont associées, ainsi que des documents et plusieurs autres objets physiques.

  • Tube à essai, d'un type déterminé par le test que le médecin souhaite faire ;
  • Règle locale (ou méthode, procédure opérationnelle standard) pour guider l'infirmière ou le technicien chargé du prélèvement :
    • quel type de tube utiliser ;
    • comment traiter le prélèvement ;
    • comment le conserver avant son transfert au laboratoire ;
  • Etiquette sur le tube avec :
    • l'identifiant du prélèvement ;
    • le nom et la date de naissance du patient ;
    • la date et l'heure de la prise de sang ;
    • les tests demandés ;
  • Formulaire de demande qui accompagne le prélèvement jusqu'au laboratoire, indiquant :
    • l'ID du prélèvement ;
    • L'ID de médecin requérant ;
    • quels tests le médecin demande et
    • donnant de plus d'information sur le patient ;
    • le diagnostic que l'on souhaite confirmer.

Une copie du formulaire de demande est placé dans le dossier du patient, pour rappeler au médecin de vérifier la réception des résultats en temps voulu.

  • In the lab - local methods to determine
    • how the sample is to be analysed,
    • what machines to use,
    • how the machines are to be calibrated and operated,
    • how the results are to be stored, formatted and
    • reported back to the physician.

The actual results are a record that the physician uses to assist the diagnosis, and a copy of the results is filed in the patient notes.

The physical sample might be retained for reference, confirmation or further tests, or might be disposed of by pouring down the sink or by incineration; there will be a method to describe this.

There is no need for a physician to spell out all the details and instructions every time a sample is collected; indeed, he may have very little knowledge of how the sample is processed in the lab. The details of the various processes are inherited from previous sample collections and analyses - there will be a generic plan for the whole sequence, and together we could think of the blood sample, all its documents and data, and the underlying methods, as a complex object.

In the physician's mind, the blood sample is seen as almost the same entity as its results, and to the nurses and technicians the sample, the tube, the label and the storage conditions again form a single entity.

Another Example - Automobile

If you don't like blood, the same sort of reasoning could be applied to a car taken to a garage for repair. It might consist of:

  • the physical vehicle
  • documents held by the owner: registration or license (including license plates), insurance, receipts for purchase, parts, repairs etc
  • the fuel consumption history
  • the drivers allowed to use the vehicle, with their license particulars
  • service records held by the garage
  • methods or procedures to be followed for routine checking and maintenance
  • methods to be followed for non-routine repairs etc
  • billing information for the customer

Programming Example

Enough of this pre-occupation with Real-World examples! Let us proceed to the main purpose: programming in FreePascal.

Let us consider the creation of a simple Form with a few controls for an application in FreePascal/Lazarus.

ObjectInspector-TForm.png
BlankForm.png

On invoking the Lazarus IDE, the programmer is presented with a blank template Form design, on which he is encouraged to place various controls or objects.

Note that the pre-made blank Form is already an Object, with its own properties such as position (Top and Left), size (Height and Width), colour, default font for adding text etc.



If a Button control is placed on the Form (type TButton), it will have its own series of properties, which can be examined in the Object Inspector window.

Several of the properties have names similar to those for the Form; this is because many properties are Inherited from some common Ancestor class, which lays out how properties are to be defined and handled by the descendant classes.

As well as properties, the Object Inspector offers a tab called Events, which gives access to Event Handlers which are methods instructing the application how to deal with things such as a mouse click on a button (OnClick) or some change in the position, size or other properties (OnChange).

The physical image of the Button on the Form, together with all its properties and Event Handler methods, should be regarded as a single entity or Object in Pascal.

ObjectInspector-TButton.png
FormWithButton.png
Source FormWithButton1.png

Object-Oriented Extensions to standard Pascal

The Pascal record structure is extended by defining an

Object

An Object is a special kind of record. The record contains all the fields that are declared in the object's definition (just like a conventional record), but now procedures and functions can be declared as if they were part of the record and are held as pointers to the methods associated with the object's type.

For example, an object could contain an array of real values, together with a Method for calculating the average.

Type
  Average = Object
    NumVal: Integer;
    Values: Array [1..200] of Real;
    Function Mean: Real; { calculates the average value of the array }
  End;

Objects can ”inherit” fields and methods from ”parent” objects. This means that these fields and methods can be used as if they were included in the objects declared as a ”child” object.

Furthermore, a concept of visibility is introduced: fields, procedures and functions can be declared as public, protected or private. By default, fields and methods are public, and can be exported outside the current unit. Protected fields or methods are available only to objects descended from the current ancestor object. Fields or methods that are declared private are only accessible in the current unit: their scope is limited to the implementation of the current unit.

Class

Objects are not used very often by themselves in FreePascal and Lazarus; instead, Classes are used very widely. A Class is defined in almost the same way as an Object, but is a pointer to an Object rather than the Object itself. Technically, this means that the Class is allocated on the Heap of a program, whereas the Object is allocated on the Stack.

Here is a simple example of a typical Class declaration:

{-----------------------------------------}
{example of Class declaration from the LCL}
{-----------------------------------------}
 TPen = class(TFPCustomPen)
 private
   FColor: TColor;
   FPenHandleCached: boolean;
   FReference: TWSPenReference;
   procedure FreeReference;
   function GetHandle: HPEN;
   function GetReference: TWSPenReference;
   procedure ReferenceNeeded;
   procedure SetHandle(const Value: HPEN);
 protected
   procedure DoAllocateResources; override;
   procedure DoDeAllocateResources; override;
   procedure DoCopyProps(From: TFPCanvasHelper); override;
   procedure SetColor
        (const NewColor: TColor; const NewFPColor: TFPColor); virtual;
   procedure SetFPColor(const AValue: TFPColor); override;
   procedure SetColor(Value: TColor);
   procedure SetMode(Value: TPenMode); override;
   procedure SetStyle(Value: TPenStyle); override;
   procedure SetWidth(value: Integer); override;
 public
   constructor Create; override;
   destructor Destroy; override;
   procedure Assign(Source: TPersistent); override;
   property Handle: HPEN read GetHandle write SetHandle; deprecated;
   property Reference: TWSPenReference read GetReference;
 published
   property Color: TColor read FColor write SetColor default clBlack;
   property Mode default pmCopy;
   property Style default psSolid;
   property Width default 1;
 end;


Note that this class is defined as an instance of another parent or ancestor class (TFPCustomPen) from which it inherits all its properties and methods. It has some fields of its own, grouped under

  • private - this means that items defined here are only available or visible to other classes or procedures/function defined within the same program unit (this example is from Graphics, so any of the other classes such as TBitMap, TPicture etc in the same unit can use them). They are essentially local variables (eg FColor, FPenHandleCached) or locally used methods (GetHandle, SetHandle) but can be used or referred to in items declared in the protected or public sections.
  • protected - this means that items defined here are only available or visible to classes that are descended from this ancestor class, and inherit its properties or methods
  • public - this means that items defined here are available to any programming unit that includes the current unit in its Uses clause
  • published - is the same as a public section, but the compiler also generates type information that is needed for automatic streaming of these classes. Often the list of published items appear in the Object Inspector of Lazarus; if there is no published list, all the public fields usually appear in the Object Inspector.

Methods

A method is just like a standard procedure or function, but can have some additional directives.

Some of the methods defined above are labelled with the directive virtual; others are labelled with the override directive.

  • virtual means that the type or actual instance of a method is not known at compile-time, but is selected at run-time depending on what sub-program actually calls the method. It could be considered a place-holder in the definition of the class.
  • override means that at run-time the locally given definition can take the place of a definition inherited from an ancestor class, particularly if it was virtual. If you particularly want to use the method defined in the ancestor class, it is sometimes necessary to call it specifically with the inherited clause.

Methods with no virtual or override directive are static methods (the usual kind in Pascal). Those with a virtual or override directive are dynamic.

Special instances of methods are:

  • create - a constructor for a class, which takes care of allocating memory, collecting together all the information needed and configuring/initializing the various properties.
  • destroy - a destructor for a class, which removes all the parts of the class from the system in an orderly and logical way, and returns all its resources for the system to re-use.

Properties

Properties are just like ordinary fields in a conventional Pascal record, but they can have read and/or write specifiers.

  • read specifier is a field, or a function that returns a result of the correct type for the property. In the example above, the property Color has a read specifier FColor, which is a local variable containing the value to be used. If a property has a read but no write specifier, it is read-only.
  • write specifier is a field, or a procedure that will store the value of the property in a specific location. In the example above, Color has a write specifier SetColor that is a procedure (defined in the protected section) for writing the color value to some specified location. If a property has a write but no read specifier, it is write-only.
  • default - note that it is possible to set a default value for a property. For example, Color here is given the default value clBlack, or black, at the time of creation. It could subsequently be given a different value, by a programming assignment statement, or in the Object Inspector.


Information complémentaire

Ceci n'a fait qu'effleurer le sujet. Pour de plus amples détails, il est fortement conseillé au lecteur de se reporter aux manuels FreePascal, et en particulier aux chapitres 5 (Objets) et 6 (Classes)

--Kirkpatc 11:04, 20 July 2008 (CEST)


Console Mode Pascal