![]() |
SpeedButton kann den Focus nicht erhalten, weil es nicht von TWinControl abgeleitet ist und ihm somit kein Windowsfenster zugrunde liegt. Aber mit einem normalen Button müsste es funktionieren
|
ok :)... muss denn irgend eine komponente den focus haben?, ich hab nämlich sonst keine buttons auf dem form, nur panels memos, edits und listboxen
|
Du könntest eine eigene Komponente auf der Basis der TListBox schreiben und die private Methode "CNDrawItem" entsprechend gestalten:
Delphi-Quellcode:
Das Beispiel stammt aus einer älteren Komponente, die ich genau zu dem Zweck geschrieben habe. Im Objektinspektor gibt es eine neue Eigenschaft
procedure TNoFocusLB.CNDrawItem(var Message: TWMDrawItem);
var State: TOwnerDrawState; begin with Message.DrawItemStruct^ do begin State := TOwnerDrawState(LongRec(itemState).Lo); Canvas.Handle := hDC; Canvas.Font := Font; Canvas.Brush := Brush; if(Integer(itemID) >= 0) and (odSelected in State) then begin Canvas.Brush.Color := clHighlight; Canvas.Font.Color := clHighlightText end; if Integer(itemID) >= 0 then DrawItem(itemID, rcItem, State) else Canvas.FillRect(rcItem); // Secret --> if(FFocusRect) and (odFocused in State) then DrawFocusRect(hDC, rcItem); // <-- Canvas.Handle := 0; end; end;
Delphi-Quellcode:
mit der du einstellen kannst, ob du den Rahmen (du meinst doch das Gepunkte?) sehen willst oder nicht. - Abgesehen davon verhält sich die Komponente wie eine gewöhnliche Listbox.
type
TNoFocusLB = class(TListBox) private FFocusRect : boolean; procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM; { ... } published property FocusRect : boolean read FFocusRect write FFocusRect; end; Ohne Komponente geht es auch. Aber da müsste ich noch mal nachschauen. Es ging auch durch das erneute Aufrufen von "DrawFocusRect" (glaube ich), weil dadurch der bestehende Rahmen ge-XOR-t wurde und optisch verschwand. Aber, wie gesagt!, Angabe ohne Gewähr. Ich hab´s über obige Komponente gemacht, weil´s einfacher ist, diese auf´s Formular zu pappen als ständig in die Zeichenroutine eingreifen zu müssen. Gruß. |
moin mathias danke, ich probier das mal :)
|
Hallo,
ich habe es gerade selber für ein Projekt benötigt und kann die Aussage von Mathias bestätigen: Den 'gepunkteten' Fokus-Rahmen um einen selektierten Eintrag kann man im ownerdraw-Ereignis tatsächlich leicht eliminieren, indem man nach dem Zeichnen die Funktion 'DrawFocusRect' aufruft:
Delphi-Quellcode:
...
If (odFocused in State) Then DrawFocusRect( Rect ); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:16 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-2025 by Thomas Breitkreuz