POINTERMATH (Delphi)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Liste des directives de compilation Delphi - Index


Type

Commutateur

Syntaxe

{$POINTERMATH ON} ou {$POINTERMATH OFF}

Par défaut

{$POINTERMATH OFF}

Portée

Locale

Remarques

La directive Pointermath traite simplement tout pointeur typé donné dans certaines instances réduites où vous pouvez effectuer de simples opérations arithmétiques directement sur la variable pointeur. Elle vous permet aussi de traiter une telle variable pointeur comme un tableau non borné en utilisant l'opérateur tableau []. Notez que dans l'exemple ci-dessus, l'incrémentation de l'indice d'un tableau d'un type est équivalent à l'incrémentation d'un pointeur sur ce type. Un incrément de un augmente le pointeur de la taille d'un élément de tableau en octets, et non d'un octet.

La directive POINTERMATH a une portée locale. Ainsi, si vous définissez cette directive sur ON et ne la définissez pas sur OFF dans le module, elle ne restera ON que jusqu'à la fin du module. En outre, si vous déclarez un pointeur typé avec cette directive définie sur ON, toute variable de ce type autorise l'indexation de tableau et l'arithmétique de pointeur, même après que cette directive ait été définie sur OFF. De même, tout bloc de code encadré par cette directive autorise les opérations arithmétiques pour les pointeurs typés ANY dans le bloc, indifféremment de la déclaration initiale du pointeur typé avec POINTERMATH ON.

Cette directive affecte seulement les pointeurs typés. Les variables de type Pointeur ne permettent pas les fonctionnalités mathématiques de pointeur, puisque le type Pointeur pointe en réalité sur un élément void, dont la taille est égale à 0 octet. Les paramètres const ou var non typés ne sont pas affectés car ils ne sont pas réellement des pointeurs.

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    CheckBox1: TCheckBox;
    ListBox1: TListBox;
    ComboBox1: TComboBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

type
  Rects = ^TRect;
  RectList = array[0..10] of TRect;
var
  Form1: TForm1;
  myRects: Rects;
  myRectList : RectList;
  procedure ListRect(Rect: TRect);
  procedure ListRects(PRects: Rects; Count: Integer);
  procedure ReadRects;
  procedure WriteRects;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListRects(myRects, Form1.ComponentCount);
end;

procedure ListRect(Rect: TRect);
begin
  Form1.ListBox1.Items.Add(
    'BoundsRect: Left: ' + IntToStr(Rect.Left) +
    ' Right: ' + IntToStr(Rect.Right) +
    ' Top: ' + IntToStr(Rect.Top) +
    ' Bottom: ' + IntToStr(Rect.Bottom));
end;

{$POINTERMATH ON}
procedure ListRects(PRects: Rects; Count: Integer);
begin
  while Count > 0 do
  begin
    ListRect(PRects[Count - 1]); // Cette ligne ne compilera pas sans Tiburon.
//    ListRect((PRects + Count - 1)^); // Ni cette ligne.
    Dec(Count);
  end;
end;

procedure ReadRects;
var
  I, index : Integer;
  Temp: TWinControl;
begin
{$T-}
  index := 0;
  for I := Form1.ComponentCount - 1 downto 0 do
  begin
    if (Form1.Components[I] is TWinControl) then
    begin
      Temp := TWinControl(Form1.Components[I]);
      myRectList[index] := Temp.BoundsRect;
      index := index + 1;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  myRects := Addr(myRectList);
  ReadRects;
end;