AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TButton ohne Fokus

Ein Thema von uligerhardt · begonnen am 20. Mai 2009 · letzter Beitrag vom 20. Mai 2009
Antwort Antwort
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.706 Beiträge
 
Delphi 2007 Professional
 
#1

TButton ohne Fokus

  Alt 20. Mai 2009, 09:21
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.
Uli Gerhardt
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#2

Re: TButton ohne Fokus

  Alt 20. Mai 2009, 10:04
Hallo Uli,

warum nicht TabStop = False im OI und

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

Uwe
Uwe
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.706 Beiträge
 
Delphi 2007 Professional
 
#3

Re: TButton ohne Fokus

  Alt 20. Mai 2009, 10:43
Zitat von uwewo:
Ausführen soll er den Button1 ja schon, denke ich.
Ja, soll er. 8)

Zitat von uwewo:
warum nicht TabStop = False im OI und

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.
Uli Gerhardt
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#4

Re: TButton ohne Fokus

  Alt 20. Mai 2009, 12:17
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
Uwe
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: TButton ohne Fokus

  Alt 20. Mai 2009, 14:37
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;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.706 Beiträge
 
Delphi 2007 Professional
 
#6

Re: TButton ohne Fokus

  Alt 20. Mai 2009, 16:06
Danke euch beiden. Ich habe es jetzt so ähnlich wie in Uwes letztem Posting gemacht.
Uli Gerhardt
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf