Pointeur sur fonction ou procédure d'un objet

lgperrin
Messages postés
2
Date d'inscription
vendredi 6 juin 2014
Statut
Membre
Dernière intervention
7 juin 2014
- Modifié par jordane45 le 7/06/2014 à 02:17
lgperrin
Messages postés
2
Date d'inscription
vendredi 6 juin 2014
Statut
Membre
Dernière intervention
7 juin 2014
- 7 juin 2014 à 08:10
Bonjour,

Je programme sous Delphi5 et j'ai réalisé un programme qui comporte des objets qui sont créés dynamiquement, du type :

TBox = class(TComponent)
private
protected
published
  Var1 : boolean
  Var2 : Byte
 
  function Calcul; Virtual
  procedure Dessine; Virtual
end;


Lors de la création de chaque objet, j'initialise un tableau qui contient tout les noms des TBox créés.

A intervalle régulier je viens scruter le tableau et j'appelle la procédure ou la fonction de la manière suivant :

For I:=0 to High(ReferenceModule) do
begin
  If TBox((findComponent(ReferenceModule[I].NomModule)).Calcul then
     TBox((findComponent(ReferenceModule[I].NomModule)).Dessine;
end;


Je voudrais utiliser les pointeurs pour appeler la procédure Dessine ou la fonction Calcul. L'idée est de créer un tableau qui contient les pointeurs vers chaque procédure et fonction:

For I:=0 to High(ReferenceModule) do
begin
  If ReferenceModule[I].pCalcul then ReferenceModule[I].pDessine;
end;


Avec pCalcul : pointeur vers la fonction calcul et pDessine sur la procédure Dessine.

J'ai cherché sur le web mais rien de ce que j'ai trouvé ne fonctionne.

Est-ce que l'un d'entre vous pourrait me donner la solution.

PS : j'utilise les pointeurs pour accéder directement aux variables (VAr1,2, ... dans l'exemple ci dessus avec un tableau de pointeur) ; dans ce cas tout fonctionne parfaitement.

En vous remerciant pour votre aide.

EDIT : Ajout des balises de code.
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

1 réponse

Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
7 juin 2014 à 02:33
Salut,

tu te compliques la vie à mon avis

un simple tableau de TBox suffit à tout faire

sur une fiche 1 TMemo 1 TButton et tu complètes comme suit:
  ...
  TBox = class(TComponent)
  private
    FCaption: string;
  published
  public
    function Calcul: boolean;
    procedure Dessine;
    property caption: string read FCaption;
  end;


var
  Form1: TForm1;
  ReferenceModule: array of TBox;

implementation

{$R *.dfm}


{ TBox }
// fonction et procedure bidon juste pour tester
function TBox.Calcul: boolean;
begin
  Result := True;
  FCaption := Name + ' retour de Calcul';
end;

procedure TBox.Dessine;
begin
  FCaption := Name + ' retour de Dessine';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  // pour chaque TBox
  for I := 0 to High(ReferenceModule) do
    // la fonction Calcul est lancée et si elle retourne True
    if ReferenceModule[I].Calcul then
    begin
      // on affiche le résultat
      Memo1.Lines.Add(ReferenceModule[I].caption);
      // et on lance la procédure
      ReferenceModule[I].Dessine;
      // et on affiche à nouveau le résultat
      Memo1.Lines.Add(ReferenceModule[I].caption);
    end;

end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  // ici on crée un tableau de 8 TBox
  SetLength(ReferenceModule, 8);
  for I := 0 to High(ReferenceModule) do
  begin
    // on les crées
    ReferenceModule[I] := TBox.Create(nil);
    // on leurs donnent un nom
    ReferenceModule[I].Name := 'Box'+ IntToStr(I);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  I: Integer;
begin
  // ici on les libèrent 
  for I := 0 to High(ReferenceModule) do
    ReferenceModule[I].Free;
end;


voilà c'est aussi simple que ça
0
lgperrin
Messages postés
2
Date d'inscription
vendredi 6 juin 2014
Statut
Membre
Dernière intervention
7 juin 2014

7 juin 2014 à 08:10
Bonjour

Merci beaucoup pour cette réponse.
Effectivement, un tableau de TBox est astucicieux.

Ce que je n'ai pas dis dans mon post c'est que je n'ai pas que TBox ; j'ai une vingtaine d'objets différents, ce qui veux dire qu'il me faut 20 tableaux
0