![]() |
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. |
Re: TButton ohne Fokus
Hallo Uli,
warum nicht TabStop = False im OI und
Delphi-Quellcode:
Ausführen soll er den Button1 ja schon, denke ich.
if button1.Focused then button2.SetFocus;
Uwe |
Re: TButton ohne Fokus
Zitat:
Zitat:
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:
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.
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; 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. |
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:
Vergiss nicht ControlChanged freizugeben.
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. Uwe |
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; |
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 14:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz