Помощь - Поиск - Пользователи - Календарь
Полная версия: Отображение CheckListBox
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Vinchkovsky
Возникло две проблемы с этим компонентом:
1) Как сделать, чтобы автоматично переводилась строка, если "нет места"? То есть, если строка длиннее компонента, та часть, что не влезает, должна "уйти" вниз.
2) Что надо поставить, чтобы "от руки" изменять размер компонента? ТИпа СкроллБокса, но для изменения размера.
Спасибо wink.gif
volvo
1. Код можно и усовершенствовать, но идея такая:

Сначала
Style := lbOwnerDrawFixed;

Потом увеличиваешь ItemHeight для CheckListBox-а в 2 раза, и на событие OnDrawItem вешаешь код:

procedure TForm1.CheckListBox1DrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var

  Sentence,
  CurWord: string;
  SpacePos,
  CurX, CurY: Integer;
  EndOfSentence: Boolean;

begin

  with (Control as TCheckListBox) do begin
    Canvas.Font.Size:=8;
    Canvas.FillRect(Rect);

    CurX := Rect.Left;
    CurY := Rect.Top;

    Sentence := Items[Index];
    EndOfSentence := FALSE;

    while (not EndOfSentence) do begin

      SpacePos := Pos(' ', Sentence);
      if SpacePos > 0 then begin
        CurWord := Copy(Sentence, 0, SpacePos);
        Sentence := Copy(Sentence, SpacePos + 1, Length(Sentence) - SpacePos);
      end
      else begin
        EndOfSentence := TRUE;
        CurWord := Sentence;
      end;

      with Canvas do begin
        if (TextWidth(CurWord) + CurX) > Rect.Right then begin
          CurY := CurY + TextHeight(CurWord);
          CurX := Rect.Left;
        end;

        TextOut(CurX, CurY, CurWord);
        CurX := CurX + TextWidth(CurWord);
      end;
    end;

  end;
end;

(С) ViktorXP

Вот так оно выглядит:
Vinchkovsky
Что-то не работает у меня этот код, ну и ладно - это наверное довольно сложно сделать возможность изменения вручную размера бокса в паре с автоматическим переводом строки.

Тогда есть два варианта:
1) (проще, но хуже) - сделать скроллбокс для листбокса, и, взависимости от размера строки изменять размер листбокса, что приведет к появлению линиии прокрутки. НО, насколько я понял, атоподстройку размера в CheckListBox (что-то типа AutoSize) сделать невозможно. Есть, конечно, уж очень простой (и не очень эфективный) вариант - подсчитать самую длинную строку и изменить размер CheckListBox (средний размер букв+20% или на число пикселей самой длинной буквы, умноженное на число символов). Меня интересует следущее - есть ли более надежный вариант? wink.gif
2) Сделать что-то с регулятором размера - никаких соображений в этой области. Какой компонент отвечает за это? rolleyes.gif
volvo
Не лучше при проведении мышью над TCheckListBox-ом показывать в качестве подсказки полную строку?
Нажмите для просмотра прикрепленного файла

Как это реализовать - см. Drkb -> VCL -> ListBox, CheckListBox, DbLookUp, Другие списки -> Показ in-place подсказки в TListBox и других компонентах

, а то опять начнешь говорить, что у тебя мой код не работает dry.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.