Delphi-PRAXiS

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)

Pseudemys Nelsoni 2. Apr 2003 15:11


Focus löschen?
 
hi,

wie lösche ich bei einer listbox den focus? also nicht das selektierte selbst, sondern der rahmen drumherum?

gruss silent

lodda 2. Apr 2003 15:14

Du kannst einer anderen Komponete den Fokus zuweisen

Pseudemys Nelsoni 2. Apr 2003 15:20

wäre das dann so:

Edit1.Focused;

??

lodda 2. Apr 2003 15:26

Hab grad kein Delphi zur Verfügung aber ich glaube das es sich bei Focused um eine eigenschaft handlet, die du setzten musst
-> Edit1.Focused := true;

Pseudemys Nelsoni 2. Apr 2003 15:29

dann kommt die fehlermeldung das ich der linken seite keinen wert zuweisen kann, hab das mit Edit1.SetFocus versucht, aber sobald ich die listbox ein 2tes mal anklicke ist die umrandung wieder da :(

btw: thx 4 help :)


gruss silent

lodda 2. Apr 2003 15:40

Ok, dann handelt es sich bei Focused um eine readonly Eigenschaft (wie gesagt, ich hab Delphi gerade nicht zur Verfügung).

Die Komponente bekommt immer dann den Focus wenn du sie anklickst.

Pseudemys Nelsoni 2. Apr 2003 16:28

kann ich das verhindern? es soll nur die markiereung d sein, der fokus nicht

lodda 2. Apr 2003 16:36

Such mal nach einer Eigenschaft mit dem Namen CanFocus. Wenn sie vorhanden ist, dann setz sie auf false. Wenn nicht dann such mal nach dem Ereigniss OnFocused. Dort schreibst du dann rein: Edit1.SetFocus. Wenn dieses Ergeigniss nicht vorhanden ist, dann probiers mal mit dem OnMaouseUp oder OnClickereigniss. Und wenn vorhanden, dann TabSop auf false.
Mehr fällt mir im Moment nicht ein.

mfg lodda

Daniel B 2. Apr 2003 16:45

Hallo silent,

setzt doch einem Button den Fokus, dann passiert nämlich genau dass, das der Eintrag zwar noch Blau ist, aber der Rahmen weg ist.

Grüsse, Daniel :hi:

Pseudemys Nelsoni 2. Apr 2003 17:20

hab ich versucht in der OnClick und/oder der ondrawitem, hat aber nach 2 clicks wieder da, hab versucht mit Edit1.SetFocus. Bei dem speedbutton funzt das mit setfocus nicht. die eigenschaft gibts da nicht :(

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 21:41 Uhr.

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