Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Delphi - Errore nell'assegnazione evento OnClick ad array di TPanel
Forum - Delphi - Errore nell'assegnazione evento OnClick ad array di TPanel

Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 21:57
Lunedì, 12/07/2010
Ciao a tutti.
Sto cercando di creare nove pannelli. Ho utilizzato un array di TPanel e fin qui va tutto bene.
Quando assegno loro l'evento OnClick,non me lo accetta in fase di compilazione con il seguente errore:

[DCC Error] MainUnit.pas(82): E2010 Incompatible types: 'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter'

il codice è il seguente:

Codice sorgente - presumibilmente Delphi

  1. type
  2.   TMainForm = class(TForm)
  3.     [..]
  4.     procedure PanelsClick(Sender: TObject; X,Y:Byte);
  5.     [..]
  6.   private
  7.     { Private declarations }
  8.   public
  9.     { Public declarations }
  10.   protected
  11.   end;
  12.  
  13. procedure TMainForm.FormCreate(Sender: TObject);
  14. var k,i:byte;
  15. begin
  16.   for k := 1 to 3 do
  17.     for i := 1 to 3 do
  18.       begin
  19.         Panels[i,k]:= TPanel.Create(Self);
  20.         Panels[i,k].OnClick:= PanelsClick(Sender,1,1);
  21.         With Panels[i,k] do
  22.           begin
  23.             Width:= 70;
  24.             Height:= 70;
  25.             Left:= (8*k) + (70 * (k-1));
  26.             Top:= (8*i) + (70 * (i-1));
  27.             Parent:= MainForm;
  28.             Caption:= IntToStr(i) + ';' + IntToStr(k);
  29.           end;
  30.  
  31.  
  32.       end;
  33. end;


PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 17:36
Martedì, 13/07/2010
Testo quotato

Postato originariamente da a_butta:

Ciao a tutti.
Sto cercando di creare nove pannelli. Ho utilizzato un array di TPanel e fin qui va tutto bene.
Quando assegno loro l'evento OnClick,non me lo accetta in fase di compilazione con il seguente errore:

[DCC Error] MainUnit.pas(82): E2010 Incompatible types: 'TNotifyEvent' and 'procedure, untyped pointer or untyped parameter'

il codice è il seguente:

Codice sorgente - presumibilmente Delphi

  1. type
  2.   TMainForm = class(TForm)
  3.     [..]
  4.     procedure PanelsClick(Sender: TObject; X,Y:Byte);
  5.     [..]
  6.   private
  7.     { Private declarations }
  8.   public
  9.     { Public declarations }
  10.   protected
  11.   end;
  12.  
  13. procedure TMainForm.FormCreate(Sender: TObject);
  14. var k,i:byte;
  15. begin
  16.   for k := 1 to 3 do
  17.     for i := 1 to 3 do
  18.       begin
  19.         Panels[i,k]:= TPanel.Create(Self);
  20.         Panels[i,k].OnClick:= PanelsClick(Sender,1,1);
  21.         With Panels[i,k] do
  22.           begin
  23.             Width:= 70;
  24.             Height:= 70;
  25.             Left:= (8*k) + (70 * (k-1));
  26.             Top:= (8*i) + (70 * (i-1));
  27.             Parent:= MainForm;
  28.             Caption:= IntToStr(i) + ';' + IntToStr(k);
  29.           end;
  30.  
  31.  
  32.       end;
  33. end;




Cosi' a occhio vedo almeno due errori che riguardano il "Click" del Pannello

1)
La "OnClick" del pannello ( come di ogni componente ) e' di tipo TNotifyEvent ( lo trovi tranquillamente sull Help di Delphi ), che prevede un unicoparametro ( il Sender, di tipo TObject ), se vuoi ricavare anche il punto in cui e' avvenuto il "Click" devi gestire l'evento OnMouseUp

2)
Quando assegni una procedura a un evento, devi assegnargli il riferimento ad essa, senza invocarla. In pratica ti basta scrivere:

Codice sorgente - presumibilmente Plain Text

  1. [...]
  2.         Panels[i,k].OnClick:= PanelsClick;
  3. [...]



Ciao. :k:

Luigi

PM Quote
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 18:05
Martedì, 13/07/2010
Testo quotato

Postato originariamente da gigisoft:
Cosi' a occhio vedo almeno due errori che riguardano il "Click" del Pannello

1)
La "OnClick" del pannello ( come di ogni componente ) e' di tipo TNotifyEvent ( lo trovi tranquillamente sull Help di Delphi ), che prevede un unicoparametro ( il Sender, di tipo TObject ), se vuoi ricavare anche il punto in cui e' avvenuto il "Click" devi gestire l'evento OnMouseUp

2)
Quando assegni una procedura a un evento, devi assegnargli il riferimento ad essa, senza invocarla. In pratica ti basta scrivere:

Codice sorgente - presumibilmente Plain Text

  1. [...]
  2.         Panels[i,k].OnClick:= PanelsClick;
  3. [...]



Ciao. :k:

Luigi



Grazie mille della risposta.
Tuttavia a me servirebbe passare anche i due valori X e Y, che non sono le coordinate di click, ma semplicemente delle coordinate che servono a me per ricavare il pannello che in quel momento viene cliccato. Ti spiego meglio : io ho i pannelli messi così:

(P11)      (P12)      (P13)

(P21)      (P22)      (P23)

(P31)      (P32)      (P33)


quindi io passando via evento OnClick i parametri k e i (i numeri che ci sono nel codice 1,1 sono sbagliati: avevo solo fatto una prova e mi sono dimenticato di cambiare) mi ricavo con il
Codice sorgente - presumibilmente Plain Text

  1. TPanel(FindComponent(P+IntToStr(i)+IntToStr(k)))//TUTTO IL CODICE



Si può fare?

Ultima modifica effettuata da a_butta il 13/07/2010 alle 18:06
PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 18:14
Martedì, 13/07/2010
Testo quotato

Postato originariamente da a_butta:

Testo quotato

Postato originariamente da gigisoft:
Cosi' a occhio vedo almeno due errori che riguardano il "Click" del Pannello

1)
La "OnClick" del pannello ( come di ogni componente ) e' di tipo TNotifyEvent ( lo trovi tranquillamente sull Help di Delphi ), che prevede un unicoparametro ( il Sender, di tipo TObject ), se vuoi ricavare anche il punto in cui e' avvenuto il "Click" devi gestire l'evento OnMouseUp

2)
Quando assegni una procedura a un evento, devi assegnargli il riferimento ad essa, senza invocarla. In pratica ti basta scrivere:

Codice sorgente - presumibilmente Plain Text

  1. [...]
  2.         Panels[i,k].OnClick:= PanelsClick;
  3. [...]



Ciao. :k:

Luigi



Grazie mille della risposta.
Tuttavia a me servirebbe passare anche i due valori X e Y, che non sono le coordinate di click, ma semplicemente delle coordinate che servono a me per ricavare il pannello che in quel momento viene cliccato. Ti spiego meglio : io ho i pannelli messi così:

(P11)      (P12)      (P13)

(P21)      (P22)      (P23)

(P31)      (P32)      (P33)


quindi io passando via evento OnClick i parametri k e i (i numeri che ci sono nel codice 1,1 sono sbagliati: avevo solo fatto una prova e mi sono dimenticato di cambiare) mi ricavo con il
Codice sorgente - presumibilmente Plain Text

  1. TPanel(FindComponent(P+IntToStr(i)+IntToStr(k)))//TUTTO IL CODICE



Si può fare?



Non con l'evento OnClick,
come ti ho gia' spiegato nell'altro post per gestire anche le coordinate del mouse devi usare l'evento OnMouseUp, che scatta quando un tasto del mouse viene rilasciato ( e eventualmente OnMouseDown che scatta quando un tasto del mouse viene premuto ).
Ciao. :k:

Luigi

P.S.
Una piccola finezza, quando dai la posizione ai pannelli scrivi:
Codice sorgente - presumibilmente Plain Text

  1. Left:= (78 * (k-1)) + 8;
  2. Top:= (78 * (i-1)) + 8;



farai fare al processore qualche operazione in meno.

Ultima modifica effettuata da gigisoft il 13/07/2010 alle 18:19
PM Quote