Wiederholungs-Button?

Rund um die LCL und andere Komponenten
Antworten
lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Wiederholungs-Button?

Beitrag von lzuser »

Win10 - Laz 1.6
Ich habe unter Delphi gern den RxSpeedButton benutzt: AllowTimer:=true bewirkt, dass das Ereignis nach einer einstellbaren Zeit automatisch wiederholt wird, wenn der Button z.B. durch die Maus gedrückt bleibt.
Gibt es solch einen Button auch für Laz?
oder
Wie kann man das anders erreichen?
Danke für Hinweise.

Benutzeravatar
theo
Beiträge: 10498
Registriert: Mo 11. Sep 2006, 19:01

Re: Wiederholungs-Button?

Beitrag von theo »

Die Komponente kenne ich nicht, aber mit einem normalen TButton und einem TTimer sollte das kein Problem sein.

Code: Alles auswählen

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Timer1.Enabled:=true;
end;
 
procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Timer1.Enabled:=false;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Caption:=TimeToStr(Now);
end;   

Devstructor
Beiträge: 32
Registriert: Mi 7. Sep 2016, 18:27
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Wiederholungs-Button?

Beitrag von Devstructor »

Ich persönlich kenne so ein Verhalten nicht, aber wenn du das häufiger brauchst, kannst du dir mit ganz paar Zeilen eine Komponente bauen. In OnTimer würde ich den Code nicht reinpacken, denn dann kann man deinen Button nicht mehr via Tastatur bedienen. Eher sowas:

Code: Alles auswählen

 
  { TRepeatButton }
 
  TRepeatButton = class(TButton)
  private
    FRepeatTime: Integer;
    FTimer: TTimer;
    procedure SetRepeatTime(AValue: Integer);
  protected
    procedure MouseDown(Button: TMouseButton; Shift:TShiftState; X,Y:Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift:TShiftState; X,Y:Integer); override;
  public
    constructor Create(TheOwner: TComponent); override;
  published
    property RepeatTime: Integer read FRepeatTime write SetRepeatTime default 1000;
  end;
 
[...]
 
{ TRepeatButton }
 
procedure TRepeatButton.SetRepeatTime(AValue: Integer);
begin
  if (FRepeatTime = AValue) and (FRepeatTime < 50) then exit;
  FRepeatTime:=AValue;
end;
 
procedure TRepeatButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
  Y: Integer);
begin
  inherited MouseDown(Button, Shift, X, Y);
 
  if not Assigned(FTimer) then
  begin
    FTimer:=TTimer.Create(Self);
    FTimer.Interval:=FRepeatTime;
    FTimer.OnTimer:=OnClick;
  end;
end;
 
procedure TRepeatButton.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
  Y: Integer);
begin
  inherited MouseUp(Button, Shift, X, Y);
 
  if Assigned(FTimer) then FreeAndNil(FTimer);
end;
 
constructor TRepeatButton.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
 
  FRepeatTime:=1000;
end;
 
www.devstructor.com Devstructor.com - Lazarus Tutorials and more

siro
Beiträge: 732
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: Wiederholungs-Button?

Beitrag von siro »

.
Zum Code von Devstructor: Muss das nicht ein OR sein ?

Code: Alles auswählen

 
procedure TRepeatButton.SetRepeatTime(AValue: Integer);
begin
  if (FRepeatTime = AValue) OR (FRepeatTime < 50) then exit;
  FRepeatTime:=AValue;
end;
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Devstructor
Beiträge: 32
Registriert: Mi 7. Sep 2016, 18:27
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: Wiederholungs-Button?

Beitrag von Devstructor »

Jup :)
www.devstructor.com Devstructor.com - Lazarus Tutorials and more

Antworten