Utilisation de FindComponent dans une unité [Résolu]

Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
- - Dernière réponse : dubois77
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
- 6 févr. 2018 à 12:41
Bonjour,
J'essaie de faire une unité avec des fonctions et procédures qui fonctionnent parfaitement lorsqu'elles sont intégrées à une application, mais produisent une erreur si je les passe en unités.
Voici le code :
unit uCreaPanel;

//############################//
         INTERFACE
//############################//   

uses SysUtils,
     StrUtils,
     Classes,
     controls,
     graphics,
     extctrls
     ;

    /// ========================= BMulti Panels  ===============================
    procedure CreaPAN(NL,NC:integer; L,H:integer; X,Y:integer; c:Tcolor;
                      KNOM:string; papa:TWincontrol; PROC:TNotifyEvent);
    procedure FreePAN(NL,NC:integer; KNOM:string);
    procedure TextePAN(n:integer; T:string; KNOM:string);
    procedure ColorPAN(n:integer; C:Tcolor; KNOM:string);
    //procedure ClicBP(Sender: TObject);


//############################//
         IMPLEMENTATION
//############################//



//##############################################################################
///*****************************************************************************
///*************************** MULTIPANEL **************************************
///*****************************************************************************
//##############################################################################

//--------------------------------------------------
procedure CreaPAN(NL,NC:integer; L,H:integer; X,Y:integer; c:Tcolor;
                 KNOM:string; papa:TWincontrol; PROC:TNotifyEvent);
var i,j,xx:Integer; z:string; bb:TPanel;
// panels créés : PAN1 à PANx  avec x = NC*NL      
begin
for j:=0 to NL-1 do
    for i:=0 to NC-1 do
        begin
        xx := j*nC+i+1;
        z := KNOM + IntToStr(xx);
        bb := TPanel.Create(papa);
        bb.Name    := z;
        bb.Left    := i*L+X;
        bb.top     := j*H+Y;
        bb.width   := L;
        bb.height  := H;
        bb.Color   := c;
        bb.BevelWidth := 1;
        bb.caption := '';
        bb.Parent  := papa;
        bb.visible := true;
        bb.Tag     := xx;
        bb.Caption := inttostr(xx);
        bb.BringToFront;
        bb.OnClick := PROC;
        end
end;

//----------------------------------------------------
procedure FreePAN(NL,NC:integer; KNOM:string);
var i:integer;
begin
for i:=0 to NL*NC-1 do Tpanel(findComponent(KNOM + inttostr(i))).Free
end;
//----------------------------------------------------
procedure TextePAN(n:integer; T:string; KNOM:string);
begin
Tpanel(tpanel.findComponent(KNOM + inttostr(n))).Caption := T
end;

//----------------------------------------------------
procedure ColorPAN(n:integer; C:Tcolor; KNOM:string);
begin
Tpanel(findComponent(KNOM + inttostr(n))).Color := C
end;


END;


Erreur à la compilation : "identificateur non déclaré : findComponent"
FindComponent appartient à priori à Tcomponent contenu lui même dans "Classes"
Bref je sêche !
merci
Afficher la suite 

2 réponses

Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15
0
Merci
Salut,

sans trop rentrer dans le détail, pour la procedure FreePan, par exemple, je ferais :

procedure FreePAN(NL, NC: integer; KNOM: string; papa: TWincontrol);
var
  i: integer;
begin
  for i := 0 to NL * NC - 1 do
    with papa do
      Tpanel(FindComponent(KNOM + IntToStr(i))).Free;
end;


Faut pas oublier le "papa"...
dubois77
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10 -
Salut Korgis
J'étais sur que tu interviendrais, tu m'avait déjà aidé pour une histoire de mouse bouton il n'y a pas si longtemps
Je vais essayer cela et je te tiens aucourant
dubois77
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10 -
ça marche impec, mais cela me crée une erreur justement dans le fameux module panel cité précédemment
Peut être soumettrai-je ce pb plus tard !!
Merci, l'unité fonctionne
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15 -
Hello,

En y réfléchissant, la manière dont tu nommes le paramète "papa" (TWincontrol) au moment de la création des panels me semble pouvoir être trompeur.
Car attention de ne pas confondre "Owner" et "Parent".
Le Owner possède tous les composants qui lui appartiennent (et les détruit au moment de sa destruction).
Le parent, lui, affiche ses contrôles enfants.
Le Owner n'est pas forcément parent, et vice-versa.
Pour approfondir le sujet, voir "TWinControl.Controls", "TComponent.Components", "TWinControl.FindChildControl", "TComponent.FindComponent" etc... dans l'aide en ligne de Delphi.

(Un papa. Une maman. On ne ment pas aux enfants ^^)
dubois77
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10 -
Oui Korgis tu as diablement raison !
J'ai un autre module qui transforme les panels en Button et dans le cas des panels déposés sur la fiche il m'a fallu enlever le papa et le mettre par contre dans le cas d'un panel créé dynamiquement.
Pour info voici le module en question :
{##############################################################################}
{#============================================================================#}
{#============================= Module MouseBP ===============================#}
{#============================================================================#}
{#} {#}
{#============================================================================#}
{#} {#}
{#} //---------------------------------------------------------- MouseBP {#}
{#} procedure TForm1.MouseBP(Sender: TObject; Button: TMouseButton; {#}
{#} Shift: TShiftState; X, Y: Integer); {#}
{#} var {#}
{#} C1, C2: TColor; {#}
{#} begin {#}
{#} with Sender as TPanel do {#}
{#} begin {#}
{#} // Echange de couleur Fond/Texte pendant le clic // Merci Korgis {#}
{#} C1 := Color; {#}
{#} C2 := Font.color; {#}
{#} Color := C2; {#}
{#} Font.Color := C1; {#}
{#} if BevelOuter = bvRaised {#}
{#} then BevelOuter := bvLowered {#}
{#} else BevelOuter := bvRaised; {#}
{#} end; {#}
{#} end; {#}
{#} {#}
{#} // à utiliser pour les panels déposés sur la forme {#}
{#} //------------------------------------------------------ InitPanelBP {#}
{#} procedure TForm1.InitPanelBP(n: integer; z: string; mode: boolean); {#}
{#} var i:integer; // W:string; {#}
{#} begin {#}
{#} for i:= 1 to n do setPanelBP(z,i,mode); {#}
{#} end; {#}
{#} //------------------------------------------------------ SetPanelBP {#}
{#} procedure TForm1.SetPanelBP(z: string; n: integer; mode: boolean); {#}
{#} var W:string; {#}
{#} begin {#}
{#} W := z + inttostr(n); // name du panel concerné {#}
{#} if mode then Tpanel(findComponent(W)).BevelInner := BvSpace; {#}
{#} if mode then Tpanel(findComponent(W)).BevelOuter := bvRaised; {#}
{#} if mode then Tpanel(findComponent(W)).BevelWidth := 2; {#}
{#} if mode then Tpanel(findComponent(W)).BorderWidth := 0; {#}
{#} Tpanel(findComponent(W)).OnMouseUp := MouseBP; {#}
{#} Tpanel(findComponent(W)).OnMouseDown := MouseBP; {#}
{#} end; {#}
{#} {#}
{#} // à utiliser pour les panels créés dynamiquement avec CreaPAN {#}
{#} //------------------------------------------------------ InitMouseBP {#}
{#} procedure TForm1.InitMouseBP(n:integer; {#}
{#} z:string; {#}
{#} papa:TWincontrol; {#}
{#} mode:boolean=false); {#}
{#} var i:integer; {#}
{#} begin {#}
{#} for i:= 1 to n do setMouseBP(z,i,papa,mode); {#}
{#} end; {#}
{#} //------------------------------------------------------ SetMouseBP {#}
{#} procedure TForm1.SetMouseBP(z:string; {#}
{#} n:integer; {#}
{#} papa:TWincontrol; {#}
{#} mode:boolean=false); {#}
{#} var W:string; {#}
{#} begin {#}
{#} W := z + inttostr(n); // name du panel concerné {#}
{#} if mode then Tpanel(papa.findComponent(W)).BevelInner := BvSpace; {#}
{#} if mode then Tpanel(papa.findComponent(W)).BevelOuter := bvRaised; {#}
{#} if mode then Tpanel(papa.findComponent(W)).BevelWidth := 2; {#}
{#} if mode then Tpanel(papa.findComponent(W)).BorderWidth := 0; {#}
{#} Tpanel(papa.findComponent(W)).OnMouseUp := MouseBP; {#}
{#} Tpanel(papa.findComponent(W)).OnMouseDown := MouseBP; {#}
{#} end; {#}
{#} {#}
{##############################################################################}
papyvore
Messages postés
178
Date d'inscription
samedi 15 novembre 2003
Statut
Membre
Dernière intervention
21 décembre 2019
4 -
bonjour
as tu essayé avec 1 tframe

unit uFrame;

interface

uses
System.SysUtils, System.Classes, Vcl.ExtCtrls, Vcl.Controls, Vcl.Forms,
Vcl.Graphics;

type
TFrame1 = class(TFrame)
private

{ Déclarations privées }
public
{ Déclarations publiques }
procedure CreaPAN(NL, NC: integer; L, H: integer; X, Y: integer; c: Tcolor;
KNOM: string; papa: TWincontrol; PROC: TNotifyEvent);
procedure FreePAN(NL, NC: integer; papa: TWincontrol);
procedure TextePAN(n: integer; T: string; KNOM: string; papa: TWincontrol);
procedure ColorPAN(n: integer; c: Tcolor; KNOM: string; papa: TWincontrol);

constructor Create(AOwner: TComponent); override;
end;

implementation

{$R *.dfm}

Constructor TFrame1.Create(AOwner: TComponent);
begin
inherited;
end;

procedure TFrame1.CreaPAN(NL, NC: integer; L, H: integer; X, Y: integer;
c: Tcolor; KNOM: string; papa: TWincontrol; PROC: TNotifyEvent);
var
i, j, xx: integer;
z: string;
bb: TPanel;
// panels créés : PAN1 à PANx avec x = NC*NL
begin
for j := 0 to NL - 1 do
for i := 0 to NC - 1 do
begin
xx := j * NC + i + 1;
z := KNOM + IntToStr(xx);
bb := TPanel.Create(papa);
bb.Name := z;
bb.Left := i * L + X;
bb.top := j * H + Y;
bb.width := L;
bb.height := H;
bb.Color := c;
bb.BevelWidth := 1;
bb.caption := '';
bb.Parent := papa;
bb.visible := true;
bb.Tag := xx;
bb.caption := IntToStr(xx);
bb.BringToFront;
bb.OnClick := PROC;
end
end;

// ----------------------------------------------------
procedure TFrame1.FreePAN(NL, NC: integer; papa: TWincontrol);
var
i : integer;
begin { ne marche pas ???
for i := 0 to (NL * NC) - 1 do
begin
If papa.Components[i] Is TPanel Then
TPanel(papa.Components[i]).Destroy; // Free;
end;
}
end;

// ----------------------------------------------------
procedure TFrame1.TextePAN(n: integer; T: string; KNOM: string;
papa: TWincontrol);
var
i: integer;
begin
For i := 0 To papa.ComponentCount - 1 Do
If papa.Components[i] Is TPanel Then
if TPanel(papa.Components[i]).Name = KNOM + IntToStr(n) then
begin
TPanel(papa.Components[i]).caption := T;
end;
end;

// ----------------------------------------------------
procedure TFrame1.ColorPAN(n: integer; c: Tcolor; KNOM: string;
papa: TWincontrol);
var
i: integer;
begin
For i := 0 To papa.ComponentCount - 1 Do
If papa.Components[i] Is TPanel Then
if TPanel(papa.Components[i]).Name = KNOM + IntToStr(n) then
begin
TPanel(papa.Components[i]).ParentColor := false;
TPanel(papa.Components[i]).ParentBackground := false;
TPanel(papa.Components[i]).Color := c;
end;

end;

end.

et un appel

FActiveFrame := TFrame1.Create(Self);
FActiveFrame.Name := '';
FActiveFrame.Parent := Self;

NL := 2;
NC := 4;
L := 120;
H := 200;
X := 40;
Y := 10;
KNOM := 'KNOM';
c := clRed;

FActiveFrame.CreaPAN(NL, NC, L, H, X, Y, c, KNOM, Form7, PROC);

FActiveFrame.TextePAN(3, 'azerty', KNOM, Form7 );
FActiveFrame.TextePAN(1, 'TOTO', KNOM, Form7 );

FActiveFrame.ColorPAN(3, clBlue, KNOM, Form7 );
FActiveFrame.ColorPAN(4, clRed, KNOM, Form7 );

j'ai testé ça marche mais c'est peut être pas exactement ce que tu cherche
Commenter la réponse de korgis
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10
0
Merci
Salut Yanb, Salut Papyvore
Je n'ai encore testé que la version de Yannb : ça marche bien : tous les panels déposés sur la fiche deviennent des boutons ; par contre cela ne touche pas les panel créés dynamiquement par mon creaPanel.
Pour l'instant avec mon système je peux transformer une série de panels bien définis (ex: panels XXX1 à nXXX17) les autres panels restant de vrai panels.

Pour le frame, la mise en place semble être plus complexe à mettre en oeuvre rapidement sur une appli standard

Merci à tous les deux, j'ai de quoi passer les longues journées d'hiver qui restent !
dubois77
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10 -
Rectification : c'est la version de YanB : UnitPanel que j'ai testée et non celle de papyvore (inversion des noms dans le commentaire précédent)
(désolé, c'est surement l'age !!!)
Salut,
Oui normal que ça ne fonctionne pas avec tes panel créaient dynamiquement, car je l'ai mis pour l'exemple dans l'unité principal mais si tu met UnitPanel dans les uses de ton uCreaPanel ceci devrait se passer autrement ;)
@+
dubois77
Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
10 -
Je viens d'essayer, avec le UnitPanel seulement dans l'unit Creapanel, seuls les dynamiques fonctionnent,
Mais le unitPanel dans l'unit ET dans l'appli : çà marche nickel
Merci YanB
Commenter la réponse de dubois77