AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Combobox owenerdraw

Ein Thema von hanspeter · begonnen am 13. Aug 2007 · letzter Beitrag vom 14. Aug 2007
Antwort Antwort
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#1

Combobox owenerdraw

  Alt 13. Aug 2007, 17:20
Hallo,
vielleicht hat wer einen schnellen Tip.
Ich habe eine Combobox. In der Liste dieser Combobox möchte ich eine einzelne Zeile färben.
Das geht ja mit csOwnerDrawFixed problemlos.
Leider ist in diesem Mode das Editfeld der Combobox dann readonly.

Weis wer wie ich in einer Combobox im Style csDropDown, trotzdem im Listteil zeichen kann
oder im Style csOwnerDrawFixed das Editfeld funktioniert ?

Gruß
Peter
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#2

Re: Combobox owenerdraw

  Alt 13. Aug 2007, 18:35
hat mich auch interesiert und bin hier (mittels google)
http://www.delphi.cz/soubor.asp?rok=...r=dlfaaaap.htm
fündig geworden

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TXYComboBox = class(TComboBox)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure ComboBox1Change(Sender: TObject);
  private
    XYCombo: TXYComboBox;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TXYCombo }

procedure TXYComboBox.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
    Style := Style or CBS_OWNERDRAWFIXED;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  XYCombo := TXYComboBox.Create(Self);
  with XYCombo do
  begin
    Parent := Self;
    Style := csDropDown;
    for I := 1 to 100 do Items.Add(Format('Item %d', [I]));
    OnDrawItem := ComboBox1DrawItem;
    OnChange := ComboBox1Change;
  end;
end;

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
  with TXYComboBox(Control) do
  begin
    Canvas.Font.Color := Index * 5000;
    Canvas.TextRect(Rect, Rect.Left, Rect.Top, Items[Index]);
  end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  MessageBeep(0);
end;

end.
ich kann zwar kein tschechisch, aber code sagt mehr als 1000 worte *g*

evtl. findet der code auch Anklang in der Codelib

//edit
nimmt man in CreateParams den Style CBS_OWNERDRAWVARIABLE lassen sich die Items in der Höhe verändern.
hab beim debuggen herausgefunden, dass man mit der ItemID prüfen kann, ob es sich um die Combobox oder die "Listbox" handelt. Die Items der Listbox fangen mit 0 an, -1 ist die Combo selbst. So kann man erreichen, dass bei größeren Items in der Liste die Combobox nicht mitwächst (wie sich das ItemHeight in der VCL auswirkt).
Delphi-Quellcode:
procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;

procedure TFWComboBox.CNMeasureItem(var Message: TWMMeasureItem);
begin
  if Message.MeasureItemStruct^.ItemId>-1 then
    Message.MeasureItemStruct^.itemHeight := FItemheight //height of list-entries
  else
    Message.MeasureItemStruct^.itemHeight := 15; //height of item in CB itself
end;
ist übrigends auch ein Trick, um die combobox kleiner als 21px in der Höhe zu bekommen, wenn man das normale Eingabe-Feld behalten will...funktioniert auch mit dem CBS_OWNERDRAWFIXED

"kleine" demo-anwendung mit richtiger Klasse im Anhang (werde die wohl in meinen DFMeditor einbauen)
weis nur noch nicht, wie man ggf. in der Combo selbst noch malen kann (leinwand erlaubt kein zeichnen, beim zugriff auf Combobox.canvas, wenn Liste geschlossen) und den text ab nem gewissen punkt beginnen lassen kann (wenn icon davor).

HTH Frank
Angehängte Dateien
Dateityp: zip ownerdrawcb_522.zip (100,8 KB, 22x aufgerufen)
  Mit Zitat antworten Zitat
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Combobox owenerdraw

  Alt 14. Aug 2007, 09:00
Danke!
werde ich ausprobieren.

Gruß Peter
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:15 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