Есть у меня наследник от TListBox со стилем OwnerDrawVariable, т.е. разные элементы могут быть разной высоты.
Поставил я, значит, обработчик MeasureItem и там меняю высоту в зависимости от того, какая она мне нужна.
Проблема в том, что MeasureItem вызывается только сразу после добавления элемента в Items и никогда больше. А как раз на тот момент высота элемента еще не расчитана и ее не расчитать. А в процессе работы или на Resize контрола высота элемента может меняться.
Можно ли поменять высоту элемента не через MeasureItem или как-нибудь вызвать его еще раз? Насильно O.o
Здравствуйте, silentroach, Вы писали:
S>неужели такой глупый вопрос что никто не хочет отвечать? =(
Нет, ну почему же
// тут самый простой обработчик (для 3 строк)procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer;
var Height: Integer);
begin
case Index of
0: Height:=20;
1: Height:=40;
2: Height:=60;
end;
end;
// тут по кнопке меняем высоту элементов (принудительный вызов MeasureItem и т.п.)procedure TForm1.Button2Click(Sender: TObject);
var WP:TWMPaint;
begin
WP.Msg:=WM_PAINT;
WP.DC:=GetDC(ListBox1.Handle);
WP.Unused:=0;
WP.Result:=0;
ListBox1.Dispatch(WP);
end;
Здравствуйте, DarkMaster, Вы писали:
DM>Здравствуйте, silentroach, Вы писали:
S>>неужели такой глупый вопрос что никто не хочет отвечать? =(
DM>Нет, ну почему же
Вроде работает. По нажатии кнопки действительно меняется размер, MeasureItem происходит.
Но. Высота становится обычной когда я выделяю какой-нибудь элемент.
Что не так?
...
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure ListBox1MeasureItem(Control: TWinControl; Index: Integer;
var Height: Integer);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
FTest: integer;
public
end;
var
Form1: TForm1;
implementation{$R *.dfm}procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer;
var Height: Integer);
begin
Height := FTest;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FTest := 10;
end;
procedure TForm1.Button1Click(Sender: TObject);
var WP:TWMPaint;
begin
inc(FTest, 5);
with WP do
begin
Msg := WM_PAINT;
DC := GetDC(ListBox1.Handle);
Unused := 0;
Result := 0;
end;
ListBox1.Dispatch(WP);
end;
end.
Извиняюсь за прошлый пост — этот код должон работать корректно.
procedure TForm1.Button3Click(Sender: TObject);
var i,H:integer;
begin
for i:=ListBox1.TopIndex to Pred(ListBox1.Items.Count) do
begin
Self.ListBox1MeasureItem(nil,i,H); // тут мы высоту элементов как-то считаем
SendMessage(ListBox1.Handle, LB_SETITEMHEIGHT,I,H); // тут мы высоту элементов ставимend;
ListBox1.Repaint; // а тут - перерисовываемсяend;