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 In Kombobox zeichnen (https://www.delphipraxis.net/35905-kombobox-zeichnen.html)

TheAn00bis 13. Dez 2004 15:21


In Kombobox zeichnen
 
Hi,

wie kann ich auf eine Kombobox zeichnen?

Ich weiß, dass die Kombobox den Style CSOwnerDraw (Fixed, oder Variable?) haben muss und, dass der Code für das Zeichnen in DrawItem kommt.

Wenn ich
Delphi-Quellcode:
 
procedure TStyle.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
Combobox1.Canvas.Rectangle(0,0,10,10);
end;
verwende passiert leider rein garnichts. Was mache ich falsch, bzw. wie mache ich es richtig?

shmia 13. Dez 2004 16:46

Re: In Kombobox zeichnen
 
Dein Zeichenbereich ist auf das übergebene Rechteck beschränkt; ausserhalb darfst/kannst du nicht zeichnen.
Delphi-Quellcode:
procedure TStyle.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  InflateRect(Rect, -1, -1); // Rechteck schrumpfen
  control.Canvas.Pen.color := clRed;
  control.Canvas.Rectangle(Rect);
end;

TheAn00bis 13. Dez 2004 17:04

Re: In Kombobox zeichnen
 
Wenn ich deinen Code nehme, erscheinen folgendee Fehler:

Zitat:

[Fehler] abc.pas(60): Undefinierter Bezeichner: 'Canvas'
[Fehler] abc.pas(60): Operator oder Semikolon fehlt
[Fehler] abc.pas(61): Undefinierter Bezeichner: 'Canvas'
[Fehler] abc.pas(61): Inkompatible Typen: 'HDC' und 'TRect'
[Fataler Fehler] xyz.dpr(8): Verwendete Unit abc.pas' kann nicht compiliert werden
(60 - 61 sind die ersten Zeilen deines Codes.)

OwnerDraw ist aktiviert. Kann es and Delphi4 liegen? Weiß jemand Rat?

SirThornberry 13. Dez 2004 17:09

Re: In Kombobox zeichnen
 
Mit GetwindowDC kann man sich das Handle zur Canvas holen, damit sollte es dann funktionieren.
(desweiteren meinst du bestimmt die "Combobox")

TheAn00bis 13. Dez 2004 17:56

Re: In Kombobox zeichnen
 
Zitat:

Zitat von SirThornberry
Mit GetwindowDC kann man sich das Handle zur Canvas holen, damit sollte es dann funktionieren.
(desweiteren meinst du bestimmt die "Combobox")

Etwas so:

Delphi-Quellcode:
procedure TStyle.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var Canv: TCanvas;
begin
  Canv := TCanvas.create;
  Canv.handle := GetWindowDC(0);
  InflateRect(Rect, -1, -1);
  control.Canv.Pen.color := clRed;
  control.Canv.Rectangle(Rect);

end;
Zitat:

[Fehler] abc.pas(64): Undefinierter Bezeichner: 'Canv'
[Fehler] abc.pas(65): Undefinierter Bezeichner: 'Canv'
[Fehler] abc.pas(65): Inkompatible Typen: 'HDC' und 'TRect'
[Fataler Fehler] xyz.dpr(8): Verwendete Unit abc.pas' kann nicht compiliert werden
:pale:

Neutral General 13. Dez 2004 18:11

Re: In Kombobox zeichnen
 
Also bei den ersten beiden Fehlern hast du vergessen Canv als TCanvas zu deklarieren :wink:
Bei dem anderen Fehler kenn ich mich auch nicht aus, da ich nicht weis was InflateRect tut...

Ultimator 13. Dez 2004 18:20

Re: In Kombobox zeichnen
 
Da hab ich nen heißen Tip für dich:
InflateRect schreiben, Cursor drauf und tapfer F1 drücken ;-)

Neutral General 13. Dez 2004 18:26

Re: In Kombobox zeichnen
 
Jaaa... normalerweise schon, aber da ichs nicht brauche und es mich nicht interressiert bin ich zu faul dafür :mrgreen:

SirThornberry 13. Dez 2004 18:50

Re: In Kombobox zeichnen
 
Zitat:

Zitat von TheAn00bis
Etwas so:

Delphi-Quellcode:
procedure TStyle.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var Canv: TCanvas;
begin
  Canv := TCanvas.create;
  Canv.handle := GetWindowDC(0);
  InflateRect(Rect, -1, -1);
  control.Canv.Pen.color := clRed;
  control.Canv.Rectangle(Rect);
end;

nicht ganz, eher so (schließlich willst du ja die canvas von der Combobox und nicht von dem Desktop)
Delphi-Quellcode:
procedure TStyle.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var Canv: TCanvas;
begin
  Canv := TCanvas.create;
  Canv.handle := GetWindowDC(Control.Handle);
  Canv.Pen.color := clRed;
  Canv.Rectangle(Rect);
  ReleaseDC(Control.Handle, Canv.Handle);
  Canv.Free;

TheAn00bis 13. Dez 2004 20:12

Re: In Kombobox zeichnen
 
Vielen Dank schonmal,

es ist mir schon fast peinlich, aber ich weiß nicht, wie ich folgenden, letzten Fehler beheben kann:

Delphi-Quellcode:
Canv.Rectangle(Rect);
Zitat:

[Fehler] abc.pas(63): Inkompatible Typen: 'Integer' und 'TRect'
[Fataler Fehler] xyz.dpr(8): Verwendete Unit abc.pas' kann nicht compiliert werden

shmia 14. Dez 2004 09:09

Re: In Kombobox zeichnen
 
Die Klasse TWinControl kennt das Property Canvas noch nicht.
Deshalb:
Delphi-Quellcode:
procedure TStyle.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  InflateRect(Rect, -1, -1); // Rechteck schrumpfen
  (Control as TComboBox).Canvas.Pen.color := clRed;
  (control as TComboBox).Canvas.Rectangle(Rect);
end;
Wenn deine Zeichenoperationen umfangreicher sind, lohnt es sich den Canvas in einer Variablen zu halten:
Delphi-Quellcode:
procedure TStyle.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
   canv : TCanvas;
begin
  canv := (Control as TComboBox).Canvas;
  InflateRect(Rect, -1, -1); // Rechteck schrumpfen
  canv.Pen.color := clRed;
  canv.Canvas.Rectangle(Rect);
end;

TheAn00bis 14. Dez 2004 10:47

Re: In Kombobox zeichnen
 
Auch bei
Delphi-Quellcode:
(control as TComboBox).Canvas.Rectangle(Rect);
bleibt der Fehler der selbe:
Zitat:

[Fehler] abc.pas(63): Inkompatible Typen: 'Integer' und 'TRect'
[Fataler Fehler] xyz.dpr(8): Verwendete Unit abc.pas' kann nicht compiliert werden
[/quote]

Wenn ich statt des "Rect" Zahlen einsetze erscheint keine Fehlermeldung, aber das darf ich ja nicht.

Gibt es keine Möglichkeit auch das noch irgendwie hinzubiegen?

shmia 14. Dez 2004 11:10

Re: In Kombobox zeichnen
 
Zitat:

Zitat von TheAn00bis
Auch bei
Delphi-Quellcode:
(control as TComboBox).Canvas.Rectangle(Rect);
bleibt der Fehler der selbe:
Code:
[Fehler] abc.pas(63): Inkompatible Typen: 'Integer' und 'TRect'
[Fataler Fehler] xyz.dpr(8): Verwendete Unit abc.pas' kann nicht compiliert werden

Wenn ich statt des "Rect" Zahlen einsetze erscheint keine Fehlermeldung, aber das darf ich ja nicht.
Gibt es keine Möglichkeit auch das noch irgendwie hinzubiegen? [/quote]
Klar kann man das hinbiegen. :mrgreen:
Deine (alte) Delphi-Version kann keine Methoden überladen.
(Meine topmoderne D5 Version kann das.)
Deshalb gilt für D5 und neuer:
Delphi-Quellcode:
  (control as TComboBox).Canvas.Rectangle(Rect);
Ansonsten muss man sich so behelfen:
Delphi-Quellcode:
  (control as TComboBox).Canvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);

TheAn00bis 14. Dez 2004 12:34

Re: In Kombobox zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke, shmia, Fehler kommt jetzt keiner mehr :), aber es erscheint auch kein Rechteck. Ich weiß jetzt noch nicht einmal, wonach ich frage müsste... , deshalb habe ich, in der Hoffnung, dass sich jemand die Mühe macht einfach mal das Beispiel angehägt. Es enthält die Combobox, mit dem Code.

shmia 14. Dez 2004 12:39

Re: In Kombobox zeichnen
 
Du musst der Combobox einige Strings in das Property Items einfüllen, sonst gibt es nix
anzuzeigen.

TheAn00bis 14. Dez 2004 15:00

Re: In Kombobox zeichnen
 
Danke! Eine letzte Frage sei mir erlaubt: Wie kann ich jetzt in das 2. Feld der Combobox auch noch ein Rechteck zeichnen?


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