Utilisation de FindComponent dans une unité

Résolu
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 - 30 janv. 2018 à 18:22
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
A voir également:

2 réponses

korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
30 janv. 2018 à 19:28
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"...
0
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
31 janv. 2018 à 07:54
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
0
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
31 janv. 2018 à 08:28
ç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
0
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
1 févr. 2018 à 15:40
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 ^^)
0
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
2 févr. 2018 à 08:17
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; {#}
{#} {#}
{##############################################################################}
0
papyvore Messages postés 223 Date d'inscription samedi 15 novembre 2003 Statut Membre Dernière intervention 16 décembre 2021 15
4 févr. 2018 à 13:33
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
0