Bonjour,

Je m'essaye à Lazarus ( 0.9.30 ; W7 64 bits) depuis quelques heures seulement.

Souhaitant adapter des codes Delphi pour m'entraîner et évaluer la facilité de portabilité, je cherche à le faire sur un descendant très simple de TLabel qui surcharge la fonction GetText.

le constructeur permet de "remplacer" le Label initial, passé en var

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
constructor TDepasseLabel.Create(var aLabel: TLabel; // ...
begin
  //...
  aLabel:=self; 
end;
A l'exécution, j'obtiens une violation d'accès, dès la création, apparemment sur l'appel suivant (je suppose engendrée par ma surcharge de la méthode GetText) à la fonction TControl.GetText de l'unité Control.inc de Lazarus :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{------------------------------------------------------------------------------
  TControl GetText
------------------------------------------------------------------------------}
function TControl.GetText: TCaption;
var
  len: Integer;
begin
  // Check if GetTextBuf is overridden, otherwise
  // we can call RealGetText directly
  if TMethod(@Self.GetTextBuf).Code = Pointer(@TControl.GetTextBuf) //ici !
  then begin
    Result := RealGetText;
  end
  else begin
    // Bummer, we have to do it the compatible way.
La syntaxe avec "@" ne m'est pas courante en Delphi, aurais-je dû utiliser aLabel:=@self, ou @aLabel:=@self, ou ?
Ou bien une autre piste ?

Au passage, je récolte une erreur "Error: Project raised exception class 'External:SIGSEGV'" à l'ecécution à partir de l'EDI, ce qui ne facilite pas la trace. Sur le net, il semble que ce puisse être un bug du debugger ?

Merci pour vos idées et conseils.