Delphi-PRAXiS

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 ComboBox wird falsch gezeichnet (https://www.delphipraxis.net/163889-combobox-wird-falsch-gezeichnet.html)

Andreas L. 20. Okt 2011 12:01

ComboBox wird falsch gezeichnet
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe mir eine Komponente von TCustomPanel abgeleitet. Platziere ich darauf eine TComboBox mit Style csDropDownList wird diese falsch gezeichnet. Auf einem normalen TPanel sieht die Box aber richtig aus (siehe Bild). Wie kommt das zu stande? Was mache ich falsch?

Delphi-Quellcode:
procedure TCsCustomPanel.Paint;
begin
  inherited Paint;

  RefreshPadding;

  if FDrawHovered then
  begin
    if FEnableHoverColor then
      inherited Color := FHoverColor;

    inherited Paint;

    if FEnableHoverBorder then
    begin
      DrawBorder(FHoverBorderTop, cbpTop);
      DrawBorder(FHoverBorderBottom, cbpBottom);
      DrawBorder(FHoverBorderRight, cbpRight);
      DrawBorder(FHoverBorderLeft, cbpLeft);
    end;{
    else
    begin
      DrawBorder(FBorderLeft, cbpLeft);
      DrawBorder(FBorderRight, cbpRight);
      DrawBorder(FBorderTop, cbpTop);
      DrawBorder(FBorderBottom, cbpBottom);
    end; }
  end
  else
  begin
    inherited Color := FColor;
    inherited Paint;
    DrawBorder(FBorderLeft, cbpLeft);
    DrawBorder(FBorderRight, cbpRight);
    DrawBorder(FBorderTop, cbpTop);
    DrawBorder(FBorderBottom, cbpBottom);
  end;
end;

procedure TCsCustomPanel.Refresh;
begin
  inherited Refresh;

  Invalidate;

  if Assigned(FOnRefreshed) then
    OnRefreshed(Self);
end;

procedure TCsCustomPanel.DrawBorder(Style: TCsBorderStyle;
  Position: TCsBorderPosition);
var
  Coord: TPoint;
  BorderRect: TRect;
begin
  if Style.Visible and (Style.Width > 0) then
  begin
    // Startposition ermitteln
    Coord := GetBorderStartPosition(Position, Style.Width);
    BorderRect.TopLeft.X := Coord.X;
    BorderRect.TopLeft.Y := Coord.Y;

    // Endposition ermitteln
    Coord := GetBorderEndPosition(Position, Style.Width);
    BorderRect.BottomRight.X := Coord.X;
    BorderRect.BottomRight.Y := Coord.Y;

    Canvas.Brush.Color := Style.Color;

    Canvas.FillRect(BorderRect);

    // ggf. Schatten zeichnen
    if Style.ShadowVisible then
    begin
      Canvas.Pen.Color := Style.ShadowColor;
      Canvas.Pen.Width := 1;

      Canvas.PenPos := GetBorderShadowStartPostition(Position, Style.Width);

      Coord := GetBorderShadowEndPosition(Position, Style.Width);

      Canvas.LineTo(Coord.X, Coord.Y);
    end;

  end;
end;

procedure TCsCustomPanel.RefreshPadding;
var
  PaddLeft, PaddRight, PaddTop, PaddBottom: Integer;
begin

  // Padding links ermitteln
  PaddLeft := FPadding.Left;

  if FDrawHovered and (FHoverBorderLeft.Width > 0) and FHoverBorderLeft.Visible then
    PaddLeft := PaddLeft + FHoverBorderLeft.Width
  else
    PaddLeft := PaddLeft + FBorderLeft.Width;

  // Padding rechts ermitteln
  PaddRight := FPadding.Right;

  if FDrawHovered and (FHoverBorderRight.Width > 0) and FHoverBorderRight.Visible then
    PaddRight := PaddRight + FHoverBorderRight.Width
  else
    PaddRight := PaddRight + FBorderRight.Width;

  // Padding oben ermitteln
  PaddTop := FPadding.Top;

  if FDrawHovered and (FHoverBorderTop.Width > 0) and FHoverBorderTop.Visible then
    PaddTop := PaddTop + FHoverBorderTop.Width
  else
    PaddTop := PaddTop + FHoverBorderTop.Width;

  // Padding unten ermitteln
  PaddBottom := FPadding.Bottom;

  if FDrawHovered and (FHoverBorderBottom.Width > 0) and FHoverBorderBottom.Visible then
    PaddBottom := PaddBottom + FHoverBorderBottom.Width
  else
    PaddBottom := PaddBottom + FBorderBottom.Width;

  inherited Padding.Left := PaddLeft;
  inherited Padding.Right := PaddRight;
  inherited Padding.Top := PaddTop;
  inherited Padding.Bottom := PaddBottom;
end;

Andreas L. 21. Okt 2011 12:07

AW: ComboBox wird falsch gezeichnet
 
Hat denn keiner eine Idee? Braucht ihr irgendwelche Infos die nicht im ersten Post stehen?

Bummi 21. Okt 2011 12:18

AW: ComboBox wird falsch gezeichnet
 
Ich hatte gestern kurz versucht es zu simulieren, konnte aber den beschriebenen Fehler nicht reproduzieren (Delphi XE), Du könntest gegf. den kompletten Komponentensource hochladen ...

stahli 21. Okt 2011 12:22

AW: ComboBox wird falsch gezeichnet
 
Nur mal zur Fehlereingrenzung: Hast Du mal die ComboBox etwas verkleinert, so dass ein Teil des Panels sichtbar bleibt?
Das könnte die Fehlesuche vielleicht in die richtige Richtung leiten.

Wenn Du mal ein kleines Demoprojekt anhängst, könnte ich heute Abend einmal drauf schauen...

Andreas L. 21. Okt 2011 12:39

AW: ComboBox wird falsch gezeichnet
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Bummi (Beitrag 1131716)
...Du könntest gegf. den kompletten Komponentensource hochladen ...

Zitat:

Zitat von stahli (Beitrag 1131719)
Nur mal zur Fehlereingrenzung: Hast Du mal die ComboBox etwas verkleinert, so dass ein Teil des Panels sichtbar bleibt?

Der blaue Bereich auf dem die ComboBox liegt ist das Panel.

Zitat:

Zitat von stahli (Beitrag 1131719)
Wenn Du mal ein kleines Demoprojekt anhängst, könnte ich heute Abend einmal drauf schauen...

siehe Anhang

Bummi 21. Okt 2011 12:52

AW: ComboBox wird falsch gezeichnet
 
lad doch lieber alles für TCsCutomPanel als Datei hoch, da fehlen
TCsBorderStyle,TCsPanelStyle,TCsBorderPosition

etc....

fkerber 21. Okt 2011 12:55

AW: ComboBox wird falsch gezeichnet
 
Hi,

sei bitte so nett und verfrachte den Source in einen Anhang. Das seitenweise Scrollen macht nicht wirklich Spaß ;)


LG, Frederic

stahli 21. Okt 2011 17:58

AW: ComboBox wird falsch gezeichnet
 
Zitat:

Zitat von Bummi (Beitrag 1131727)
lad doch lieber alles für TCsCutomPanel als Datei hoch, da fehlen
TCsBorderStyle,TCsPanelStyle,TCsBorderPosition
etc....

Ja, sonst wird das sicher nix...

Furtbichler 21. Okt 2011 18:20

AW: ComboBox wird falsch gezeichnet
 
K.a. obs daran liegt, aber im Paint setzt Du (bei FEnableHoverColor=True) dein Color auf FHoverOverColor. Was macht denn der Setter von TPanel.Color.... nicht das der Paint aufruft und damit alles durcheinander kommt. Großartig aufregend ist das TPanel.Paint ja nicht (Fill) sodaß Du das vielleicht noch selbst hinkriegen könntest, ohne Color zu setzen...

Andreas L. 27. Okt 2011 10:41

AW: ComboBox wird falsch gezeichnet
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe jetzt TCsCustomPanel von den anderen Komponenten getrennt und in eine eigene Unit verfrachtet (siehe Anhang).

Hat jemand eine Idee wieso der Fehler auftritt?

Zitat:

Zitat von Furtbichler (Beitrag 1131814)
K.a. obs daran liegt, aber im Paint setzt Du (bei FEnableHoverColor=True) dein Color auf FHoverOverColor. Was macht denn der Setter von TPanel.Color.... nicht das der Paint aufruft und damit alles durcheinander kommt. Großartig aufregend ist das TPanel.Paint ja nicht (Fill) sodaß Du das vielleicht noch selbst hinkriegen könntest, ohne Color zu setzen...

Der Setter von Color macht folgendes:
Delphi-Quellcode:
procedure TControl.SetColor(Value: TColor);
begin
  if FColor <> Value then
  begin
    FColor := Value;
    FParentColor := False;
    if (csDesigning in ComponentState) and not (csReading in ComponentState) and (Self is TWinControl) then
      TWinControl(Self).ParentBackground := False;
    Perform(CM_COLORCHANGED, 0, 0);
  end;
end;
Den Hintergrund selbst zeichnen löst leider nicht das Problem mit der ComboBox.

Alle anderen Controls werden übrigens korrekt gezeichnet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 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