Jak rozpoznać w komponencie SpinBox czy naciśnięto przycisk?

0

Jak rozpoznać w komponencie SpinBox czy naciśnięto przycisk w lewo czy w prawo?

0

Znam jedynie SpinButton i SpinEdit. Co to jest SpinBox?

0

SpinBox to komponent pochodny po SpinEdit.
A więc moje pytanie może też dotyczyć SpinEdit.

0

Zdarzenie OnKeyDown masz na liście zdarzeń? Jeśli tak, to tam sprawdzaj wartość Key.

0

TSpinEdit ma właściwość button jest to TSpinButton który ma min. zdarzenia OnDownClick i OnUpClick.

0
marogo napisał(a):

Zdarzenie OnKeyDown masz na liście zdarzeń? Jeśli tak, to tam sprawdzaj wartość Key.

W onKeyDown mogę sprawdzić jaki klawisz wcisnąłem z klawiatury, a nie który naciśnięto myszą przycisk (w górę czy w dół)

0

Przeczytaj http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/FMXTCustomButtonRepeatClick_(Delphi)
nie mam teraz czasu sprawdzać ale prawdopodobnie w ten sam sposób możesz dostać się do obsługi zdarzeń buttonów i normalnie obsłużyć OnClick.

EDIT: Sprawdziłem działa taki kod:

procedure TForm3.OnMinusClick(Sender: TObject);
begin
  ShowMessage('<'); //obsluga klikania <
  SpinBox1.ValueDec; //domyslna akcja
end;

procedure TForm3.OnPlusClick(Sender: TObject);
begin
  ShowMessage('>'); //obsluga klikania >
  SpinBox1.ValueInc; //domyslna akcja
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  fIsSetSpinBoxBtnEvents:= False;
end;

procedure TForm3.FormShow(Sender: TObject);

   procedure SetButtonClickEvent(AButtonName: string; AEvent: TNotifyEvent);
     var
       Thread: TThread;
   begin
     //zdarzenia OnClick nie można ustawić zanim  SbinBox nie będzie widoczny
     //bo wtedy dopiero ma styl inaczej FindStyleResource zwraca nil dlatego wątek;
     Thread:= TThread.CreateAnonymousThread(procedure
        var btn: TFmxObject;
     begin
       repeat
         btn:= SpinBox1.FindStyleResource(AButtonName);
         if (Assigned(btn)) and (btn is TCustomButton) then
           TCustomButton(btn).OnClick:= AEvent;
         Sleep(100);
       until Assigned(btn);
     end);
     Thread.Start;
   end;

begin
  if not fIsSetSpinBoxBtnEvents then
  begin
    SetButtonClickEvent('minusbutton', OnMinusClick);
    SetButtonClickEvent('plusbutton', OnPlusClick);
    fIsSetSpinBoxBtnEvents:= True;
  end;
end;
0
kAzek napisał(a):
//zdarzenia OnClick nie można ustawić zanim  SbinBox nie będzie widoczny
//bo wtedy dopiero ma styl inaczej FindStyleResource zwraca nil dlatego wątek;

Wątek nie jest potrzebny – po co w pętli sprawdzać czy już jest widoczny czy nie, skoro można zareagować wtedy, gdy faktycznie się ono pojawi na ekranie. Całkiem niedawno był wątek poświęcony temu tematowi – w Lazarusie wystarczy jedna linijka w FormShow:

Windows.ShowWindow(Self.Handle, SW_SHOW);

W Delphi to nie zadziała – okno wcale nie pokaże się na ekranie. Dlatego też trzeba jakiś swój komunikat dorzucić do kolejki i obsłużyć go dopiero wtedy, gdy VCL przetrawi wszystkie w niej zalegające. Przykład:

const
  WM_AFTERWNDSHOW = WM_USER + 1;

type
  TMyForm = class(TForm)
    procedure FormShow(ASender: TObject);
  protected
    procedure WMAfterWndShow(var AMessage: TMessage); message WM_AFTERWNDSHOW;
  end;
  
{..}
  
procedure TMyForm.FormShow(ASender: TObject);
begin
  PostMessage(Handle, WM_AFTERWNDSHOW, 0, 0);
end;

procedure TMyForm.WMAfterWndShow(var AMessage: TMessage);
begin
  // tu można rejestrować zdarzenia – okno jest już widoczne na ekranie
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1