Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.30;
Скачать: CL | DM;

Вниз

Многострочный текст в CheckListBox   Найти похожие ветки 

 
Pavelkq   (2008-02-21 12:52) [0]

По аналогии с многострочным ListBox-ом без проблем вывел много строк в CheckListBox, но каждая из них с маркером выделения. А мне надо, чтобы на все несколько строк был одн маркер. Естественно, что количество строк каждого элемента может быть разным, в зависимости от наполнения. (т.е. один элемент чеклистбокса - это несколько строк текста).
 Пробовал копать в сторону рисования в листбоксе. Рисунок выводится, а текст - нет. Может, я как-то неверно управляю объектами? Хотел вместо объекта типа TBitmap запихать TMemo.
procedure TForm1.CheckListBox3DrawItem(Control: TWinControl;
 Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
 MyMemo: TMemo;
 Offset: Integer;
 BMPRect: TRect;
begin
 with (Control as TCheckListBox).Canvas do
 begin
   FillRect(Rect);
   MyMemo := TMemo.Create(CheckListBox3);
   MyMemo.Text:="fgsdf sdfg sfg sdfg s dfgsdf f gnsf h345245 fg w y 356y2345e v45t24";
   Offset := 0;
   if MyMemo <> nil then
   begin
     BMPRect := Bounds(Rect.Left+2, Rect.Top+2,
     (Rect.Bottom-Rect.Top-2)*2, Rect.Bottom-Rect.Top-2);
     {StretchDraw(BMPRect, Bitmap); Можно просто нарисовать, но лучше сначала убрать фон}
//      BrushCopy(BMPRect,MyMemo, Bounds(0, 0, Bitmap.Width, Bitmap.Height),
//      MyMemo.Canvas.Pixels[0, Bitmap.Height-1]);
     Offset := (Rect.Bottom-Rect.Top+1)*2;
   end;
   TextOut(Rect.Left+Offset, Rect.Top, CheckListBox3.Items[index]);
   MyMemo.Free;
 end;
end;

 Как это сделать?


 
{RASkov} ©   (2008-02-21 13:14) [1]

> [0] Pavelkq   (21.02.08 12:52)

procedure TForm1.FormCreate(Sender: TObject);
var N: Integer;
begin
 CheckListBox1.OnMeasureItem:=CheckListBox1MeasureItem;
 CheckListBox1.OnDrawItem:=CheckListBox1DrawItem;
 CheckListBox1.Style:=lbOwnerDrawVariable;
 for N:=0 to 9 do CheckListBox1.AddItem("String ?"+IntToStr(N), nil);
end;

procedure TForm1.CheckListBox1MeasureItem(Control: TWinControl;
 Index: Integer; var Height: Integer);
begin
 Height:=12 * ((Index mod 3)+1);
end;

procedure TForm1.CheckListBox1DrawItem(Control: TWinControl;
 Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
 with Control as TCheckListBox, Canvas do begin
  FillRect(Rect);
  TextOut(Rect.Left, Rect.Top, Items[Index]);
  case Index mod 3 of
   1: TextOut(Rect.Left, Rect.Top+12, "Second string");
   2: begin
       TextOut(Rect.Left, Rect.Top+12, "Second string");
       TextOut(Rect.Left, Rect.Top+24, "The third line");
      end;
  end;
 end;
end;


 
Pavelkq   (2008-02-21 13:38) [2]

Ух ты! Заработало (CheckListBox1.OnMeasureItem:=CheckListBox1.MeasureItem;)!
Спасибо!


 
{RASkov} ©   (2008-02-21 13:41) [3]

> [2] Pavelkq   (21.02.08 13:38)

Это что там за точка, окуда она!?
:)


 
Pavelkq   (2008-02-21 13:52) [4]

Ошибка там была маленькая. Еще точнее :  CheckListBox3.OnMeasureItem:=CheckListBox1.OnMeasureItem;


 
Pavelkq   (2008-02-21 13:54) [5]

Упс, нет, не ошибка. Это я чё-то напорол. Все верно в Вашем коде!
Еща наз спасибо!


 
Pavelkq   (2008-02-21 14:33) [6]

Хм, оказывается, высота строк не меняется в зависимости от содержимого. Один текст наползает на другой.


 
Johnmen ©   (2008-02-21 14:37) [7]


> Хм, оказывается, высота строк не меняется в зависимости
> от содержимого. Один текст наползает на другой.

Ты жалуешься или претензии выдвигаешь?


 
Pavelkq   (2008-02-21 14:47) [8]

Извините, возможно я действительно некорректно высказался. Перефразирую: Как задавать разные значения Height для каждой строки в CheckListBox?


 
{RASkov} ©   (2008-02-21 17:44) [9]

> [8] Pavelkq   (21.02.08 14:47)

procedure TForm1.CheckListBox1MeasureItem(Control: TWinControl; Index: Integer; var Height: Integer);
var R: TRect;
begin
 R:=CheckListBox1.ItemRect(Index);
 with TCheckListBox(Control) do
  DrawText(Canvas.Handle, PChar(Items[Index]), -1, R, DT_WORDBREAK or DT_CALCRECT);
 Height:=R.Bottom-R.Top;
end;

procedure TForm1.CheckListBox1DrawItem(Control: TWinControl;
 Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
 with Control as TCheckListBox, Canvas do begin
  FillRect(Rect);
  DrawText(Handle, PChar(Items[Index]), -1, Rect, DT_WORDBREAK);
 end;
end;


 
Pavelkq   (2008-02-22 08:53) [10]

Заработало при установленном  CheckListBox1.Style:=lbOwnerDrawVariable;
В справке сказано, что OnMeasureItem возникает только при этом значении стиля.
Очень здорово получились переносы строк!
 Огромное спасибо!


 
Pavelkq   (2008-03-03 09:51) [11]


> {RASkov} ©   (21.02.08 17:44) [9]

Обнаружился глюк. Вывожу в чеклистбокс предложение, а оно отображается не полностью (последние 1-3 слова исчезают). Хотя, если проверить содержимое элемента программно, то там все есть.
Например, вывожу предложение :"Во всех космических амплитудах будет краеугольным основанием мысль, она может изменять карму, она может решать сроки, она открывает врата и может закрыть их."
В результате получаю: "Во всех космических амплитудах будет краеугольным основанием мысль, она может изменять карму, она может решать сроки, она открывает врата и может"
Не подскажите ли, как это можно исправить?


 
Washington ©   (2008-03-03 10:40) [12]

О, а я уже задавал недавно такой вопрос :)


 
Pavelkq   (2008-03-03 12:35) [13]

Я сам нашел выход:
 DrawText(Canvas.Handle, PChar(Items[Index]), length(CheckListBox3.Items[Index])+6, R, DT_WORDBREAK or DT_CALCRECT);
6 - это опытным путем подобранное число. Меньше него все равно обрезает. протестил на паре десятков предложений. Работает хорошо. Очевидно это связано с тем, что при значении длинны -1 строка должна быть с нулевым символом в конце. А какая она там на самом деле - фиг ее знает.


 
DiamondShark ©   (2008-03-03 13:35) [14]


> Не подскажите ли, как это можно исправить?

Очень просто: при расчёте высоты текста учитывать размер "галочки". В приведённом коде этого нет.


> length(CheckListBox3.Items[Index])+6

бред сивой кобылы.

Совсем недавно был точно такой же вопрос. Там привели полностью готовый код.


 
clickmaker ©   (2008-03-03 14:20) [15]


> при значении длинны -1 строка должна быть с нулевым символом
> в конце. А какая она там на самом деле - фиг ее знает

а с чего бы ей не быть с нулевым символом в конце?



Страницы: 1 вся ветка

Текущий архив: 2008.03.30;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.031 c
15-1202909284
Ega23
2008-02-13 16:28
2008.03.30
Zip-Unzip для Delphi - посоветуйте


15-1202996771
Сергей М.
2008-02-14 16:46
2008.03.30
Skype, интересная любопытность)


2-1204457589
<code>
2008-03-02 14:33
2008.03.30
Подскажите как рисовать на форме без мерцания?


2-1204125571
scorpio
2008-02-27 18:19
2008.03.30
Помогите переделать функцию из фокса в дельфи


6-1182924533
jailbrecker
2007-06-27 10:08
2008.03.30
Как осуществить синхронизацию времени через инет сервисы