TListBox OwnerDrawVariable и MeasureItem
От: silentroach Россия  
Дата: 09.01.08 19:14
Оценка:
Здрасте.

Есть у меня наследник от TListBox со стилем OwnerDrawVariable, т.е. разные элементы могут быть разной высоты.
Поставил я, значит, обработчик MeasureItem и там меняю высоту в зависимости от того, какая она мне нужна.
Проблема в том, что MeasureItem вызывается только сразу после добавления элемента в Items и никогда больше. А как раз на тот момент высота элемента еще не расчитана и ее не расчитать. А в процессе работы или на Resize контрола высота элемента может меняться.
Можно ли поменять высоту элемента не через MeasureItem или как-нибудь вызвать его еще раз? Насильно O.o

Заранее благодарен за любую наводку.
Re: TListBox OwnerDrawVariable и MeasureItem
От: silentroach Россия  
Дата: 10.01.08 12:44
Оценка:
неужели такой глупый вопрос что никто не хочет отвечать? =(
Re[2]: TListBox OwnerDrawVariable и MeasureItem
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 10.01.08 15:09
Оценка: 1 (1)
Здравствуйте, 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;
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re[3]: TListBox OwnerDrawVariable и MeasureItem
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 10.01.08 15:21
Оценка:
Здравствуйте, DarkMaster, Вы писали:

S>>неужели такой глупый вопрос что никто не хочет отвечать? =(

DM>Нет, ну почему же

Блин, ReleaseDC(ListBox1.Handle,DC) забыл вставить после GetDC()
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re[3]: TListBox OwnerDrawVariable и MeasureItem
От: silentroach Россия  
Дата: 10.01.08 15:27
Оценка:
Здравствуйте, 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.
Re[2]: TListBox OwnerDrawVariable и MeasureItem
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 10.01.08 15:40
Оценка: 3 (1)
Здравствуйте, silentroach, Вы писали:

Извиняюсь за прошлый пост — этот код должон работать корректно.

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;
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re[3]: спасибо
От: silentroach Россия  
Дата: 10.01.08 21:14
Оценка:
Спасибо большое. Помогло.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.