Newsgroup: it.comp.lang.delphi
Titolo: Componenti in FireMonkey

Ciao,
ho la necessità di creare un componente (anzi, un array di componenti!) 
a run-time ma questo componente dovrebbe anche rispondere ad un "click".
 
La mia classe è una cosa abbastanza banale del tipo:
 
   TMyPan = class(TPanel)
     FPan     : TPanel;
     FCapt    : TLabel;
     FRefDB   : TLabel;
     FNotes   : TMemo;
   private
     procedure SetVisible    (flag : Boolean);
     procedure SetPosition   (value : TPosition);
     procedure SetWidth      (value : Extended);
     procedure SetHeight     (value : Extended);
     procedure SetNotes      (value : TStrings);
     procedure SetCaption    (value : string);
     procedure SetRefDB      (value : string);
     procedure SetStyleName  (value : string);
 
     function  GetVisible    : Boolean;
     function  GetPosition   : TPosition;
     function  GetWidth      : Extended;
     function  GetHeight     : Extended;
     function  GetNotes      : TStrings;
     function  GetCaption    : string;
     function  GetRefDB      : string;
     function  GetStyleName  : string;
   public
     { Public declarations }
     constructor Create     (AOwner : TFmxObject; StyleName : string);
     destructor  Destroy;   override;
     procedure   Empty;
     property    Visible    : Boolean read GetVisible write SetVisible;
     property    Position   : TPosition read GetPosition write SetPosition;
     property    Width      : Extended read GetWidth  write SetWidth;
     property    Height     : Extended read GetHeight write SetHeight;
     property    Notes      : TStrings read GetNotes write SetNotes;
     property    Caption    : string read GetCaption write SetCaption;
     property    RefDB      : string read GetRefDB write SetRefDB;
     property    StyleName  : string read GetStyleName write SetStyleName;
   end;
 
 
Come faccio ad associare all'oggetto TMyPan una cosa del tipo "On CLick"?
 
L'idea sarebbe poter fare una cosa del tipo:
 
Var
   MyPan[] : array [0..20] of TMyPan;
 
disegnare i MyPan sul form ed avere un evento in corrispondenza del 
click del mouse sull' i-esimo MyPan.
 
 
... spero di essermi spiegato bene ...  8-)
 
Ciao e grazie
MF

    MyPan[] : array [0..20] of TMyPan;
 
 
xche un array  e non una lista?
E poi, sti pannelli dovranno avere un parent,giusto?
A quel punto xche non dargli anche un owner e usarne le property controls o componenents evitando liste o array?
Sintetizzando: xche inventare la ruota? :-D
 
 
A

 Sintetizzando: xche inventare la ruota? :-D
 
Io già gli passo un owner e non uso "le property controls o 
componenents" perchè non so nemmeno cosa siano! 8-(
 
Vado a cercare su google e poi ti dico pewrchè non le ho usate!  ;)
 
Grazie mille
Ciao
MF

 Vado a cercare su google e poi ti dico pewrchï¿½ non le ho usate!  ;)
 
xche google e non l'help in linea?  
 
 
A.

Il 02/07/2013 08:44, Alberto Salvati ha scritto:
 
Aggiornamento:
La tua domanda: "Se TMyPan eredita da TPanel a cosa ti serve un 
ulteriore pannello (FPan)?"
ho destato un eco nella mie mente ormai andata e mi sono risposto: già, 
perchè?
Quindi ho modificato la classe togliendo il pannello aggiuntivo e 
funziona tutto ugualmente con una piccola differenza: se ora clicco 
sulla label mi risponde al click.
Però continua a non rispondere al click il memo... Boh!
 
 >> E' quello che pensavo anch'io ma come faccio ad usarlo?
 >
 >
 >> MyPan[1]:= TMyPan.Create(Owner);
 >> MyPan[1].OnClick := PippoClick;
 >>
 >>
 >>
 >> e quello che vorrei ï¿½ che se clicco su MyPan[1] si eseguisse la
 >> procedure PippoClick (Sender )..... dove sbaglio?
 >
 > Sarà che sono prp alla frutta ma non ho capito...
 > Che significa "dove sbaglio"?
 > Se fai click su un pannello cosa succede?
 
Sorry, sono stato un po' troppo sintetico.
Considera il componente come una label con sotto un memo:
 
+-------------------+
|  Label            |
+-------------------+
|                   |
|                   |
|  Memo             |
|                   |
|                   |
+-------------------+
 
(in realtà c'è un'altra label fondamentale per la mia applicazione ma 
ininfluente per il ns. discorso!)
 
Se clicco su MyPan[1] nella "zona label" (dopo la modifica di cui sopra) 
mi si attiva la procedura "PippoClick" associata a
 
MyPan[1].OnClick := PippoClick;
 
mentre se clicco nella "zona memo" (regolarmente popolata da n stringhe) 
non succede nulla.
 
Comincio a pensare che sia un problema di "focus" più che di classe ma 
non so comunque come risolverlo! :(
 
 >
 >> Vado a cercare su google e poi ti dico pewrchï¿½ non le ho usate!  ;)
 >
 > xche google e non l'help in linea?
 >
 >
 > A.
 >
 
l'help di XE4 è un po' deficitario... e non sapevo bene cosa cercare! :)
 
Ancora grazie!
 
Ciao
MF
 

 Perï¿½ continua a non rispondere al click il memo... Boh!
 
Se io ho un memo dentro un pannello e gestisco il click sul pannello, se faccio click sul memo deve "passare" al pannello? 
Mi spieghi il xche?
 
A.


Perchè il memo contiene 3/4 righe di informazioni in sola lettura ed è 
fondamentale che venga attivata la funzione associata al pannello che mi 
carica una serie di dati dal db e li mostra da un'altra parte.... un po' 
come se fosse un "bottone" con tutta una serie di informazioni 
diversamente organizzate.
 
Ovviamente se hai suggerimenti o consigli di implementazione diversi 
sono stra-graditi!
 
 
Ciao
MF

Mi sono speigato male. La domanda è:
 
xche ti ASPETTI che un click sul memo invochi quello del pannello?
 
 
 
A.


8-)
Avevo prorpio capito male:
 
nel costruttore dell'oggetto ho messo:
 
   FNotes.OnClick:= self.OnClick;
 
dove FNotes č (fantasia...) il campo memo.
 
Ciao
MF

> nel costruttore dell'oggetto ho messo:
 
xche nel costruttore?
 
 
A.


Mi sembrava una buona idea.... altri suggerimenti?
 
Ciao
MF

> Mi sembrava una buona idea.... 
 
 
Ma tu sai quando viene chiamato un costruttore? Credo prp di no.
 
A.


Non viene chiamato al momento della creazione del componente?
 
... azz! Ho capito: in quel momento non è ancora associato il "onClick" 
quindi come fa a chiamarlo....
 
 
sigh! sono proprio rinco... :(
 
 
Potrei definire una cosa simile a questa:
 
Type
   TOnClickEvent = procedure (Sender: TObject) of object;
 
   TMYPanel = class(TPanel)
     .....
   public
     procedure OnClick : TOnClickEvent
 
 
Che ne pensi?
 
Ciao
MF
 
PS. Grazie mille per la tua pazienza!!!!

 
Rileggi tutto il th e studia.
 
A.


Credo che sia meglio!  8-)
 
Ancora grazie mille.
Ciao
MF