Delphi-PRAXiS
Seite 1 von 2  1 2   

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 Eigene Komponente TCustomControl den Focus erhalten (https://www.delphipraxis.net/198286-eigene-komponente-tcustomcontrol-den-focus-erhalten.html)

Hobbycoder 20. Okt 2018 18:06


Eigene Komponente TCustomControl den Focus erhalten
 
Hi,

ich habe mir eine Komponente erstellt, die auf TCustomPanel basiert. Wie kann ich es anstellen, dass die Komponente per MouseDown auch den Focus erhält. Mit Tab komme ich hin und kann KeyPress auswerten. Aber wenn ein anderes Control aktiv ist und ich meines anklicke, erhält es nicht automaisch den Focus.

CCRDude 20. Okt 2018 18:13

AW: Eigene Komponente TCustomControl den Focus erhalten
 
Vielleicht klingt das naiv (kenne mich mit Komponentenentwicklung kaum aus), aber: was spricht dagegen, im MouseDown einfach SetFocus() aufzurufen?

Hobbycoder 20. Okt 2018 18:14

AW: Eigene Komponente TCustomControl den Focus erhalten
 
Zitat:

Zitat von CCRDude (Beitrag 1416200)
Vielleicht klingt das naiv (kenne mich mit Komponentenentwicklung kaum aus), aber: was spricht dagegen, im MouseDown einfach SetFocus() aufzurufen?

Hatte ich eigentlich auch gedacht. Funktioniert nur leider nicht.

dummzeuch 20. Okt 2018 19:20

AW: Eigene Komponente TCustomControl den Focus erhalten
 
Zitat:

Zitat von Hobbycoder (Beitrag 1416202)
Zitat:

Zitat von CCRDude (Beitrag 1416200)
Vielleicht klingt das naiv (kenne mich mit Komponentenentwicklung kaum aus), aber: was spricht dagegen, im MouseDown einfach SetFocus() aufzurufen?

Hatte ich eigentlich auch gedacht. Funktioniert nur leider nicht.

Bedeutet "funktioniert nicht", dass ein Fehler auftritt, oder dass nur der Fokus nicht gesetzt wird?

HolgerX 20. Okt 2018 21:18

AW: Eigene Komponente TCustomControl den Focus erhalten
 
Hmm..

Könnte es sein, das es deshalb nicht geht, da ein Panel (CustomPanel) ein Container ist und selber eigentlich keinen (sichtbaren) Focus erhält, sondern diesen immer an ein darauf platziertes Control weiter reicht?

(Nur so eine Vermutung.. ;) )

Hobbycoder 20. Okt 2018 21:39

AW: Eigene Komponente TCustomControl den Focus erhalten
 
Zitat:

Zitat von dummzeuch (Beitrag 1416205)
Zitat:

Zitat von Hobbycoder (Beitrag 1416202)
Zitat:

Zitat von CCRDude (Beitrag 1416200)
Vielleicht klingt das naiv (kenne mich mit Komponentenentwicklung kaum aus), aber: was spricht dagegen, im MouseDown einfach SetFocus() aufzurufen?

Hatte ich eigentlich auch gedacht. Funktioniert nur leider nicht.

Bedeutet "funktioniert nicht", dass ein Fehler auftritt, oder dass nur der Fokus nicht gesetzt wird?

Nein, keine Fehlermeldung. Einfach nur keinen Focus. D.h. Der Fokus bleibt auf eine andere Control.

Zitat:

Zitat von HolgerX (Beitrag 1416209)
Hmm..

Könnte es sein, das es deshalb nicht geht, da ein Panel (CustomPanel) ein Container ist und selber eigentlich keinen (sichtbaren) Focus erhält, sondern diesen immer an ein darauf platziertes Control weiter reicht?

(Nur so eine Vermutung.. ;) )

Das könnte natürlich sein. Wobei es ja von TWinControl abstammt. Und das sollte über diese Funktionalität verfügen.
Außerdem: Mit der Tab-Taste kann ich den Focus ja auf mein Control bringen. Ich möchte aber auch, dass es den Focus erhält, wenn ich es mit der Maus anklicke.

HolgerX 21. Okt 2018 07:43

AW: Eigene Komponente TCustomControl den Focus erhalten
 
Hmm..

Zitat:

Zitat von Hobbycoder (Beitrag 1416211)
Zitat:

Zitat von HolgerX (Beitrag 1416209)
Hmm..

Könnte es sein, das es deshalb nicht geht, da ein Panel (CustomPanel) ein Container ist und selber eigentlich keinen (sichtbaren) Focus erhält, sondern diesen immer an ein darauf platziertes Control weiter reicht?

(Nur so eine Vermutung.. ;) )

Das könnte natürlich sein. Wobei es ja von TWinControl abstammt. Und das sollte über diese Funktionalität verfügen.
Außerdem: Mit der Tab-Taste kann ich den Focus ja auf mein Control bringen. Ich möchte aber auch, dass es den Focus erhält, wenn ich es mit der Maus anklicke.

Unter D6 kann ein Panel und dies ist ja einfach nur von CustomPanel abgeleitet keinen Focus bekommen, weder mit TAB noch mit Maus.
Es erhält immer nur ein darauf platziertes Control (Edit/Button..) den Focus, aber nie das Panel selber.

Wahrscheinlich wird im CustomPanel ein Flag gesetzt, welches ihm selber kein Focus gibt, sondern an ClientControls weiter reicht..

Schokohase 21. Okt 2018 09:23

AW: Eigene Komponente TCustomControl den Focus erhalten
 
Man könnte ja nachschauen wie das bei anderen Controls funktioniert ... z.B. bei
Delphi-Quellcode:
TButton
Delphi-Quellcode:
procedure TButtonControl.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
      if not (csDesigning in ComponentState) and not Focused then
      begin
        FClicksDisabled := True;
        Winapi.Windows.SetFocus(Handle); // das setzt den Focus
        FClicksDisabled := False;
        if not Focused then Exit;
      end;
    CN_COMMAND:
      if FClicksDisabled then Exit;
  end;
  inherited WndProc(Message);
end;

Hobbycoder 21. Okt 2018 10:05

AW: Eigene Komponente TCustomControl den Focus erhalten
 
Zitat:

Zitat von Schokohase (Beitrag 1416222)
Man könnte ja nachschauen wie das bei anderen Controls funktioniert ... z.B. bei
Delphi-Quellcode:
TButton
Delphi-Quellcode:
procedure TButtonControl.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
      if not (csDesigning in ComponentState) and not Focused then
      begin
        FClicksDisabled := True;
        Winapi.Windows.SetFocus(Handle); // das setzt den Focus
        FClicksDisabled := False;
        if not Focused then Exit;
      end;
    CN_COMMAND:
      if FClicksDisabled then Exit;
  end;
  inherited WndProc(Message);
end;

Danke, das scheint schon mal zu funktionieren. Beim Klick auf meine Komponente wird o.g. procedure ausgeführt. Beim erneuten KLick ebenfalls, doch nun ist Focused True.
Jetzt sollten alle KeyPress-Ereignisse auch an meine Komponente gehen (Form keyPreview = False).
Tun sie auch ;-) bis auf Pfeiltasten VK_Left, VK_Right, VK_Top und VK_Down. Diese aktivieren sofort das nächste bzw. vohergehende Control. Aber genau diese Tasten benötige.
Wie gesagt, wenn ich mit dem Tabulator zu meinem Control navigiere, kommen diese Tasten jedoch an.

Schokohase 21. Okt 2018 10:10

AW: Eigene Komponente TCustomControl den Focus erhalten
 
Zitat:

Zitat von Hobbycoder (Beitrag 1416226)
Tun sie auch ;-) bis auf Pfeiltasten VK_Left, VK_Right, VK_Top und VK_Down. Diese aktivieren sofort das nächste bzw. vohergehende Control. Aber genau diese Tasten benötige.
Wie gesagt, wenn ich mit dem Tabulator zu meinem Control navigiere, kommen diese Tasten jedoch an.

Man könnte ja nachschauen wie das bei anderen Controls funktioniert ... (halt bei denen, wo es so funktioniert)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:45 Uhr.
Seite 1 von 2  1 2   

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