Newsgroup: it.comp.lang.delphi
Titolo: Gestione Click su TActionClients

Salve a tutti,
cerco di spiegare meglio la problematica in oggetto....
In una applicazione con una MDIForm (Main) ho creato una sorta di
DbNavigator con la quale desidero lavorare sui DataSet delle varie
Form figlie.
A questo scopo ho utilizzato una TControlBar, sulla quale ho
posizionato una TActionMainMenuBar con i relativi bottoni aggiunti
tramite il componente TActionManager.
All'evento on Execute dei bottoni ho legato il relativo metodo (First,
Prior, Next, Last, ecc....).
Ho notato, però, che questo evento si scatena quando clicco sul
bottone e quando lo rilascio. Per cui il metodo viene chiamato due
volte, ad es. il next scatena un doppio spostamento in avanti del
cursore sul DataSet.
Come faccio ad evitare questo comportamento?
Grazie in anticipo.
Buona giornata a tutti!
Stefano

 Come faccio ad evitare questo comportamento?
Non e' un comportamento normale. L'execute dovrebbe scattare solo al
MouseDown
e non al MouseUp.
Potrebbe trattarsi di qualche evento che si scatena a seguito del
primo Next,
che indirettamente finisce per generarne un secondo. O altri eventi
che non
hai preso in considerazione.
Fai una prova sostituendo il Next con una cosa diversa e vedrai che
viene
eseguito una volta sola.
Inoltre puoi mettere un breakpoint nell'evento di scroll del dataset e
quando
si ferma guardi lo stack delle chiamate per capire da dove arriva il
secondo Next.
ciao
Giacomo

On 14 Lug, 11:13, Giacomo Degli Esposti

Sono sicuro che è il tipo bottone a funzionare così, se eseguo un
click mantenendo premuto il tasto del mouse l'evento si scatena ed il
cursore si sposta.
Una volta terminato l'evento, rilasciando il bottone l'evento si
scatena di nuovo.
Per averne conferma, ho provato ad aggiungere un semplice speed button
sulla barra e ad agganciargli la stessa action, in questo caso
funziona perfettamente.
C'è la possibilità di dire al TActionManager che tipo di bottoni
utilizzare? Altrimenti sono costretto ad aggiungere bottoni
standard...solo che mi piacevano quelli "non in rilievo".... :-(
Grazie comunque!

 scatena di nuovo.
Puo' essere... che tipo di bottone stai usando? Io ho fatto una prova
con il bottone normale creato da delphi trascinando l'azione sulla
toolbar e l'evento scatta una volta sola.
Ti allego la prova che ho fatto in fondo al messaggio cosi' vediamo
cosa c'e' di diverso rispetto alla tua prova che non funziona:
ciao
Giacomo
object Form3: TForm3
  Left = 343
  Top = 206
  Caption = 'Form3'
  ClientHeight = 319
  ClientWidth = 412
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object ControlBar1: TControlBar
    Left = 0
    Top = 0
    Width = 412
    Height = 33
    Align = alTop
    TabOrder = 0
    object ActionMainMenuBar1: TActionMainMenuBar
      Left = 11
      Top = 2
      Width = 150
      Height = 48
      UseSystemFont = False
      ActionManager = ActionManager1
      Caption = 'ActionMainMenuBar1'
      ColorMap.HighlightColor = clWhite
      ColorMap.BtnSelectedColor = clBtnFace
      ColorMap.UnusedColor = clWhite
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -12
      Font.Name = 'Segoe UI'
      Font.Style = []
      Spacing = 0
    end
  end
  object ActionManager1: TActionManager
    ActionBars = <
      item
        Items = <
          item
            Action = Action1
            Caption = '&Action1'
          end>
        ActionBar = ActionMainMenuBar1
      end>
    LinkedActionLists = <
      item
        ActionList = ActionList1
        Caption = 'ActionList1'
      end>
    Left = 40
    Top = 72
    StyleName = 'XP Style'
  end
  object ActionList1: TActionList
    Left = 120
    Top = 72
    object Action1: TAction
      Caption = 'Action1'
      OnExecute = Action1Execute
    end
  end
end
unit Unit3;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
  Dialogs, ActnList, XPStyleActnCtrls, ActnMan, ToolWin, ActnCtrls,
ActnMenus,
  ExtCtrls;
type
  TForm3 = class(TForm)
    ControlBar1: TControlBar;
    ActionMainMenuBar1: TActionMainMenuBar;
    ActionManager1: TActionManager;
    ActionList1: TActionList;
    Action1: TAction;
    procedure Action1Execute(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.Action1Execute(Sender: TObject);
begin
  Self.Caption := Self.Caption + ' CLICK';
end;
end.

On 15 Lug, 09:55, Giacomo Degli Esposti

Ho provato il tuo codice sorgente.
Il problema resta, l'evento che scrive sulla caption della form scatta
due volte. Risultato: Ogni volta che premo il bottone il programma
scrive due volte la parola "CLICK".
A questo punto mi viene da pensare che sia un comportamento legato
alla versione di delphi. Io sto utilizzando delphi 7.

 cursore si sposta.
Di che tipo � l'azione che hai associato al pulsante?
Si tratta di un'azione standard (incorporata, e di tipo specifico) di 
Delphi, oppure � un'azione personalizzata (cio� una semplice TAction)?
Sei sicuro che il pulsante non abbia altri eventi associati che possono 
interferire con questo meccanismo?
Se crei un nuovo pulsante, anche non di tipo TSpeedButton, e associ 
l'azione al pulsante, il problema si ripresenta?
Sei sicuro che il codice dell'azione non sia tale per cui l'azione viene 
eseguita di nuovo?
Hai provato ad eseguire passo passo l'applicazione, in debug, per vedere 
quali sono i percorsi compiuti nel codice che danno luogo al difetto?
E' tutto. :D
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

   (
http://www.marco.breveglieri.name
)
Ho Risolto!!!!
Dunque, a quanto pare il problema stava nel tipo di ToolBars
Utilizzata. Nel TActionManager, alla pagina ToolBars, mi sono accorto
che quelle che utilizzavo io erano delle TActionMainMenuBar...inserite
manualmente mediante il relativo bottone nella pagina Additional dei
componenti.
Creandone una nuova direttamente dal TActionManager (Pagina ToolBars,
Tasto New), il componente inserisce una TActionToolBar. E in questo
casi gli eventi funzionano perfettamente!
Marco e Giacomo, grazie del vostro supporto! ;-) A buon rendere...
Bye

 Utilizzata. [...]
Io non ho mai riscontrato questo problema nell'uso di ActionMainMenuBar.
Secondo me, il problema � dovuto ad altro, e si � risolto perch� nel 
cambio di componente � stata rimossa la causa originale del difetto, a 
meno che tu non abbia usato una particolare "configurazione" di questi 
controlli in modo tale da subentrare nella casistica in cui si verifica 
l'ipotetico bug.
Che versione di Delphi usi?


   (
http://www.marco.breveglieri.name
)
Utilizzo Delphi 7. Comunque per tagliare la "testa al toro" sono
partito da una situazione pulita ed ho fatto quanto segue:
1. Aperto un nuovo progetto.
2. Inserito nella Form un TActionMainMenuBar (Questa operazione mi ha
creato una barra di menù in alto nella Form);
3. Aggiunto un componente ActionManager;
4. Nell'interattivo dell'ActionManager ho creato un nuovo bottone (non
standard) e scritto nell'evento OnExecute la seguente istruzione
  Form1.Caption := Form1.Caption + 'Click'
5. Sempre dall'ActionManager ho trascinato il nuovo bottone sulla
barra presente nella finestra principale.
Risultato:
Sia alla pressione del bottone che al rilascio dello stesso, il
programma scatena l'evento e aggiunge la strina alla Caption della
finestra.
Questo mi fa pensare che la differenza stia nel tipo di bottone
utilizzato dalla Barra.
Di seguito il testo del .PAS
---------------------
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
  Dialogs, ActnList, XPStyleActnCtrls, ActnMan, ToolWin, ActnCtrls,
  ActnMenus;
type
  TForm1 = class(TForm)
    ActionMainMenuBar1: TActionMainMenuBar;
    ActionManager1: TActionManager;
    Action1: TAction;
    procedure Action1Execute(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Action1Execute(Sender: TObject);
begin
  Form1.Caption := Form1.Caption + 'Click'
end;
end.
-------------------------------------------------
Di seguito il testo del .DFM
---------------------
object Form1: TForm1
  Left = 326
  Top = 206
  Width = 979
  Height = 563
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object ActionMainMenuBar1: TActionMainMenuBar
    Left = 0
    Top = 0
    Width = 971
    Height = 29
    ActionManager = ActionManager1
    Caption = 'ActionMainMenuBar1'
    ColorMap.HighlightColor = 15660791
    ColorMap.BtnSelectedColor = clBtnFace
    ColorMap.UnusedColor = 15660791
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clMenuText
    Font.Height = -11
    Font.Name = 'Tahoma'
    Font.Style = []
    Spacing = 0
  end
  object ActionManager1: TActionManager
    ActionBars = <
      item
        Items = <
          item
            Action = Action1
            Caption = '&Action1'
          end>
        ActionBar = ActionMainMenuBar1
      end>
    Left = 432
    Top = 160
    StyleName = 'XP Style'
    object Action1: TAction
      Caption = 'Action1'
      OnExecute = Action1Execute
    end
  end
end
-----------------------
Ciao
Stefano