Einzelnen Beitrag anzeigen

ernschd

Registriert seit: 16. Jan 2008
165 Beiträge
 
Delphi XE8 Professional
 
#1

Gelöst: Ablauf beim Erzeugen einer Combobox

  Alt 29. Feb 2016, 16:47
Hallo,

ich arbeite derzeit an eigenen Komponenten, die u.a. eine andere Rahmenfarbe haben, wenn sie fokussiert sind. Meine Edit-Komponente funktioniert ganz nach meinen Vorstellungen, aber die Combobox macht Probleme.
Beispiel: Rahmenfarbe ist blau, fokussiert ist sie rot.
Nach dem Erzeugen ist die Combobox erst mal nur grau, erst ein kurzes Fokussieren und wieder verlassen ändert die Farbe auf blau. Wenn ich mit der Maus über die blaue Combobox gehe, ohne sie zu aktivieren, wechselt sie zu grau - genauer gesagt, beim verlassen. In dem Fall wird aber weder DoExit noch WMKillFocus aufgerufen.

Hat das evtl. was mit der ItemsList in der Combobox zu tun? Wie bekomme ich das gewünschte Verhalten hin?

Edit: Die Methode WMPaint hat gefehlt! Nun funktioniert es.

Hier die "wichtigsten" Auszüge aus dem Code:
Delphi-Quellcode:
constructor TTestComboBox.create(aOwner: TComponent);
begin
  inherited Create(aOwner);
  ColorFocused := clRed;
  ColorNotFocused := clBlue;
  FSelected := False;
end;

procedure TTestComboBox.DoEnter;
begin
  Inherited;
  if FSelected then exit;
  RedrawBorder;
end;

procedure TTestComboBox.DoExit;
begin
  Inherited;
  FSelected := False;
  RedrawBorder;
end;

procedure TTestComboBox.WMSetFocus(var Message: TWMSetFocus);
begin
    Inherited;
    if not (csDesigning in ComponentState) then begin
        FSelected := True;
        RedrawBorder;
    end;
end;

procedure TTestComboBox.WMKillFocus(var Message: TWMKillFocus);
begin
    inherited;
    if not (csDesigning in ComponentState) then begin
        FSelected := False;
        RedrawBorder;
    end;
end;

procedure TTestComboBox.RedrawBorder;
var col: Cardinal;
begin
  inherited;
  if FSelected then
    col := rcolorfocused
  else
    col := rcolornotfocused;
  Fdc := GetWindowDC(Self.Handle);
  try
    if Fdc = 0 then exit;

    FPen := CreatePen(PS_SOLID, 1, col);
    try
        FOldPen := SelectObject(Fdc, FPen);
        FOldBrush := SelectObject(Fdc, GetStockObject(NULL_BRUSH));
        if NOT Rectangle(Fdc, 0, 0, Width, Height) then exit;
        SelectObject(Fdc, FOldBrush);
        SelectObject(Fdc, FOldPen);
    finally
        DeleteObject(FPen);
    end;
  finally
      ReleaseDC(Self.Handle, Fdc);
  end;
end;

Geändert von ernschd ( 1. Mär 2016 um 11:30 Uhr) Grund: Problem gelöst
  Mit Zitat antworten Zitat