Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Focus löschen? (https://www.delphipraxis.net/3852-focus-loeschen.html)

lodda 2. Apr 2003 17:27

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

Pseudemys Nelsoni 2. Apr 2003 17:41

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

MathiasSimmack 2. Apr 2003 17:52

Du könntest eine eigene Komponente auf der Basis der TListBox schreiben und die private Methode "CNDrawItem" entsprechend gestalten:
Delphi-Quellcode:
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;
Das Beispiel stammt aus einer älteren Komponente, die ich genau zu dem Zweck geschrieben habe. Im Objektinspektor gibt es eine neue Eigenschaft
Delphi-Quellcode:
type
  TNoFocusLB = class(TListBox)
  private
    FFocusRect : boolean;
    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
  { ... }
  published
    property FocusRect : boolean read FFocusRect write FFocusRect;
  end;
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.

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ß.

Pseudemys Nelsoni 2. Apr 2003 17:57

moin mathias danke, ich probier das mal :)

Daniel 9. Apr 2003 18:06

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.
Seite 2 von 2     12   

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