Форум: "Начинающим";
Текущий архив: 2008.03.30;
Скачать: [xml.tar.bz2];
ВнизМногострочный текст в 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.045 c