Solved

Delphi Combobox ItemHeight Custom?!

Posted on 2009-04-02
3
3,210 Views
Last Modified: 2013-11-23
Hello,

I'd like to use a Combobox but with a Custom Height...

I tried to change the property "ItemHeight" but doesnt work, except if i set it style to "csOwnerDrawFixed" or "csOwnerDrawVariable" but i dont want to use at this
style, i want to use in normal style "csDropDown" but with a custom ItemHeigth...

Is it possible? :D

Best Regards,
Carlos
0
Comment
Question by:cebasso
  • 2
3 Comments
 
LVL 30

Expert Comment

by:Wayne Barron
Comment Utility
I do not have Delphi installed right now due to a recent reinstall of the system.
But this is what I found on the subject.

===============================================
The control changes its size when the font size changes.
If you want to change the height without changing the font size,
you need to design your own combobox and override the way the height is set.
===============================================

hth
Carrzkiss
0
 
LVL 26

Accepted Solution

by:
EddieShipman earned 500 total points
Comment Utility
You can also override that using the OnMeasureItem event like in this sample of a Font Combo by Peter Below

unit Unit1;
 

interface
 

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs,

  StdCtrls;
 

const

  UM_MEASUREFONTS = WM_USER;

type

  TForm1 = class(TForm)

    ComboBox1: TComboBox;

    procedure FormCreate(Sender: TObject);

    procedure ComboBox1MeasureItem(Control: TWinControl; Index:

Integer;

      var Height: Integer);

    procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer;

      Rect: TRect; State: TOwnerDrawState);

  private

    { Private declarations }

    Procedure UMMeasureFonts( Var msg: TMessage ); message

UM_MEASUREFONTS;

  public

    { Public declarations }

  end;
 

var

  Form1: TForm1;
 

implementation
 

{$R *.DFM}
 

procedure TForm1.FormCreate(Sender: TObject);

begin

  combobox1.Items := Screen.Fonts;

  combobox1.itemindex := 0;

  // Measure items after form has been shown

  PostMessage( handle, UM_MEASUREFONTS, 0, 0 );

end;
 

procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index:

Integer;

  var Height: Integer);

begin

  // Is called too early to be of use, trying to use the controls

canvas

  // to measure items fails since the control is not visible yet.

  // Return design-time size + some extra spacing.

  Height := (Control As TCombobox).ItemHeight+4;

end;
 

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index:

Integer;

  Rect: TRect; State: TOwnerDrawState);

var

  cb: TCombobox;

begin

  cb:= Control As TCombobox;

  cb.Canvas.FillRect( rect );

  If (index >= 0) and (index < cb.Items.Count) Then Begin

    If odComboBoxEdit In State Then Begin

      // Draw the edit portion of the control, use the controls

      // design-time font for this since the edit control is

      // fixed height and drawing a bunch of symbols if the selected

      // font is Symbol etc. is not very informative for the user.

      cb.Canvas.Font := cb.Font;

      If odSelected In State Then

       cb.Canvas.Font.Color := clHighlightText;

    End

    Else Begin

      cb.Canvas.Font.Name := cb.Items[index];

      cb.Canvas.Font.Size := 10;

    End;

    cb.Canvas.TextRect( Rect, rect.left+2, rect.top+2, cb.Items[index]

);

  End;

end;
 

procedure TForm1.UMMeasureFonts(var msg: TMessage);

var

  i: Integer;

begin

  // use form canvas for measurements

  canvas.font.size := 10;

  For i := 0 To combobox1.items.count - 1 Do Begin

    canvas.font.name := combobox1.items[i];

    combobox1.perform( CB_SETITEMHEIGHT,

                       i,

                       canvas.TextHeight(combobox1.items[i]));

  End; { For }
 

end;
 

end.

Open in new window

0
 
LVL 26

Expert Comment

by:EddieShipman
Comment Utility
Oh, to use csDropDown and still offer a variation of item height, you'd have to subclass TCustomComboBox and override the CNMeasureItem to call MeasureItem if the FStyle included csDropdown and then inherit your combo from that TCustomCombo.
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
The viewer will learn how to synchronize PHP projects with a remote server in NetBeans IDE 8.0 for Windows.

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now