Jak rozpoznać w komponencie SpinBox czy naciśnięto przycisk w lewo czy w prawo?
Znam jedynie SpinButton i SpinEdit. Co to jest SpinBox?
SpinBox to komponent pochodny po SpinEdit.
A więc moje pytanie może też dotyczyć SpinEdit.
Zdarzenie OnKeyDown masz na liście zdarzeń? Jeśli tak, to tam sprawdzaj wartość Key.
TSpinEdit
ma właściwość button jest to TSpinButton
który ma min. zdarzenia OnDownClick
i OnUpClick
.
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ół)
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;
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;