évènement affecter dynamiquement à la création du composant [Résolu]

Signaler
Messages postés
63
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
15 décembre 2009
-
Messages postés
63
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
15 décembre 2009
-
Voilà, j'ai besoin d'aide.... j'en perds mon latin


Je créer une List box dynamiquement :


        // création la boite

        LB := TListBox.Create(CB);

        LB.Parent := CB;

        LB.Color := CB.Color;

        LB.Width := (CB.Parent As TPanel).Width - 6;

        LB.Style := lbOwnerDrawVariable;

        LB.ItemHeight := 26;

        LB.OnDrawItem := OnDrawItem;


à la compilation il me donne un message d'erreur :

Incompatible Types : 'method pointer and regular procedure'


Hors, la précédure est déclarée précédement (avant la création dynamique) comme suit :


procedure OnDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);


Je pense que cela vient du fait que la déclaration n'est pas de type :

procedure Main.OnDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);


Mais je ne peux pas faire cela, puisque mon unité sert dans plusieurs
programmes différents... et comporte une multitude de fonctions...


COMMENT PUIS-JE FAIRE ? pour résoudre mon problème, car là je bloque....


Merci d'avance.

Fabien FERT [:)]
www.sigmadia.fr.fm

3 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
pour assigner un evenement, ta procedure doit etre declaré dans un objet ou sous cette forme :

type

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
  public
    Procedure DoChange(Sender : TObject); 
  end;

var
  Form1       : TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var TSL : TStringList;
begin
  TSL := nil;
  try
    TSL          := TStringList.Create;
    TSL.OnChange := DoChange;
  finally
    TSL.Free;
  end;
end;

et tu peu toujours créer une unité qui contiendrais :

interface
  
type
  TProcLayout = class(TObject)
  public
    procedure DoChange(Sender : TObject);
  end;

var
  ProcLayout : TProcLayout = nil;

implementation

procedure TProcLayout.DoChange(Sender : TObject);
begin
  // code //
end;

initialization
  if not assigned(ProcLayout) then
     ProcLayout := TProcLayout.Create;

finalization
  if assigned(ProcLayout) then
     FreeAndNil(ProcLayout);
end,
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Salut ffert,

Ajoute cet événement manuellement (n' oublie pas de la déclarer plus haut comme les autres événements de ta form) :
procedure TForm.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
//  mets le code que tu veux ...
end;

Ensuite tu fais:
LB := TListBox.Create(CB);
        LB.Parent := CB;
        LB.Color := CB.Color;
        LB.Width := (CB.Parent As TPanel).Width - 6;
        LB.Style := lbOwnerDrawVariable;
        LB.ItemHeight := 26;
        LB.OnDrawItem := ListBox1DrawItem; 

Voilà, change le nom de l' événament biensûr !!!!
A+
Messages postés
63
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
15 décembre 2009

Désolé Mauricio, mais je ne peux pas faire cela, car je ne suis pas
dans un Form, je suis dans une unité simple unité, comportant ses
propres classes, ses propres procédures, ses propres variable, mais lié
à aucune form (puisqu'elle gère les données et non l'affichage)

J'ai testé le code de F0xi (le deuxième) qui marche super bien : celui là :

interface
  
type
  TProcLayout = class(TObject)
  public
    procedure DoChange(Sender : TObject);

  end;
var
  ProcLayout : TProcLayout = nil;

implementation

procedure TProcLayout.DoChange(Sender : TObject);
begin
  // code //
end;

initialization
  if not assigned(ProcLayout) then
     ProcLayout := TProcLayout.Create;
finalization
  if assigned(ProcLayout) then
     FreeAndNil(ProcLayout);
end.


MERCI beaucoup !!! à tous les deux.


Fabien FERT [:)]
www.sigmadia.fr.fm