évènement affecter dynamiquement à la création du composant

Résolu
ffert Messages postés 63 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 15 décembre 2009 - 14 juin 2006 à 14:04
ffert Messages postés 63 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 15 décembre 2009 - 15 juin 2006 à 09:45
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

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
14 juin 2006 à 15:26
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,
3
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
14 juin 2006 à 18:12
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+
0
ffert Messages postés 63 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 15 décembre 2009
15 juin 2006 à 09:45
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
0
Rejoignez-nous