Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TButton ohne Fokus (https://www.delphipraxis.net/134341-tbutton-ohne-fokus.html)

uligerhardt 20. Mai 2009 09:21


TButton ohne Fokus
 
Hallo zusammen!

Kennt ihr eine Möglichkeit, einem TButton beizubringen, dass er keinen Tastaturfokus annehmen soll (ähnlich wie bei einem TSpeedButton)? Damit meine ich nicht nur TabStop = False - der Button soll z.B. auch bei einem Mausklick darauf nicht den Fokus kriegen. Es wäre günstig, wenn ich beide Verhaltensmuster (kann Fokus annehmen oder eben nicht) in einer Klasse haben könnte, sodass ich nicht einmal TButton und ein anderes Mal TSpeedButton erzeugen muss.

Danke schon mal fürs Lesen,
Uli.

uwewo 20. Mai 2009 10:04

Re: TButton ohne Fokus
 
Hallo Uli,

warum nicht TabStop = False im OI und

Delphi-Quellcode:
if button1.Focused then button2.SetFocus;
Ausführen soll er den Button1 ja schon, denke ich.

Uwe

uligerhardt 20. Mai 2009 10:43

Re: TButton ohne Fokus
 
Zitat:

Zitat von uwewo
Ausführen soll er den Button1 ja schon, denke ich.

Ja, soll er. 8)

Zitat:

Zitat von uwewo
warum nicht TabStop = False im OI und

Delphi-Quellcode:
if button1.Focused then button2.SetFocus;

Das würde dann kompliziert werden, weil es nicht nur um ein Control (Button2) geht.

Stell dir als Beispiel eine Form mit vielen Edits vor, und ein Klick auf den Button soll den Inhalt des fokussierten Edits ins Clipboard kopieren. Etwa so:
Delphi-Quellcode:
procedure TForm1.MyClick(Sender: TObject);
begin
  if ActiveControl is TEdit then
  begin
    TEdit(ActiveControl).CopyToClipboard;
    Label1.Caption := Clipboard.AsText;
  end
  else
    Label1.Caption := '<nix>';
end;
Dann verweist ActiveControl bei einem TButton in MyClick schon auf den Button und nicht mehr auf das interessierende Edit. Exakt der gleiche OnClick-Handler funktioniert bei einem TSpeedButton.

Das Problem ist jetzt, dass der betroffene Button nicht allein steht, sondern in einer Maschinerie erzeugt wird, die auch fokussierbare Buttons ausspucken muss. Ich würde gern vermeiden, diese Maschinerie so umzubauen, dass sie mal TButtons und mal TSpeedButtons erzeugt. Drum hätte ich gern einen Schalter an der Button-Instanz.

uwewo 20. Mai 2009 12:17

Re: TButton ohne Fokus
 
Eigentlich brauchst Du dann nur einen Button, man muss nur wissen welches Edit zuletzt den Focus hatte.

Hab da mal was ausprobiert

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    Active, Previous : TWinControl;
  public
    { Public-Deklarationen }
     procedure ControlChanged(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ControlChanged(Sender: TObject);
begin
   Previous := Active;
   Active := Form1.ActiveControl;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Screen.OnActiveControlChange := ControlChanged;
end;

procedure TForm1.Button1Click(Sender: TObject) ;
begin
   if TEdit(Previous) = Edit1 then ShowMessage('Edit1 hatte den Focus');
   if TEdit(Previous) = Edit2 then ShowMessage('Edit2 hatte den Focus');
   if TEdit(Previous) = Edit3 then ShowMessage('Edit3 hatte den Focus');
end;

end.
Vergiss nicht ControlChanged freizugeben.

Uwe

alzaimar 20. Mai 2009 14:37

Re: TButton ohne Fokus
 
Eine kleine Änderung der Demo, damit der Fokus auch wieder zurück springt:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject) ;
var
  ctrl: TWinControl;

begin
  if Previous is TWinControl then begin
//  Control merken, da die eigentliche Routine den Focus wieder verändern könnte
    ctrl := Previous;

//  Hier die 'Button-Click' Routine ausführen (Könnte den Fokus nochmals ändern)
    ShowMessage(Format('%s hatte den Focus', [ctrl.Name]));

//  Und zum Schluss den Fokus zurücksetzen
    PostMessage(Handle, WM_NEXTDLGCTL, ctrl.Handle, -1);
  end;
end;

uligerhardt 20. Mai 2009 16:06

Re: TButton ohne Fokus
 
Danke euch beiden. Ich habe es jetzt so ähnlich wie in Uwes letztem Posting gemacht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz