Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/12: Рейтинг темы: голосов - 12, средняя оценка - 4.75
ZverBlin
1 / 1 / 1
Регистрация: 04.08.2011
Сообщений: 228
1

Перенос по строчкам

14.08.2011, 12:56. Просмотров 2145. Ответов 3
Метки нет (Все метки)

Как можно сделать, чтобы переносилось по строчкам в ListBox
Вот мне написали
перенос делается так:
1. Берется моноширный шрифт (у которого все символы одной ширины)
2. Умножается кол-во символов на их ширину.
3. Если ширина компонента меньше содержимого, то добавляем строку, ниже и вставляем в нее, не влезшую часть строки.
Только я тут вообще ничего не понял
Кто нить может код написать??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2011, 12:56
Ответы с готовыми решениями:

Добавление текста из файла в Label по строчкам
Суть задания такова что нужно добавлять какой-то текст из текстового файла в...

Коментарии к строчкам
Var a,b:array of integer; c:array of integer; i:byte; begin randomize; for...

коментарии к строчкам
Не могли б вы написать коментарии к строчкам данной задачи

Выборка по нескольким строчкам
Как сделать выборку по нескольким строчкам? На скрине видно подробно. Вывел все...

Комментарии к строчкам программы
1.uses crt; {Подключение модуля CRT} var a:array of integer; {Описание...

3
Mawrat
12827 / 5735 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
15.08.2011, 02:49 2
Можно не ограничиваться моноширинными шрифтами.
Делается так. Надо будет обрабатывать 2 события TListBox: OnMeasureItem и OnDrawItem.
- В обработчике события OnMeasureItem надо выполнить работу по разбиению текста на строки и в соответствии с этим выставить высоту данного элемента списка в ListBox. Здесь надо учесть отступы от краёв рамки, ограничивающей элемент. - По 2 пиксела можно установить. А также надо учесть межстрочные интервалы: 2 - 4 пиксела.
- В обработчике события OnDrawItem прорисовать полученные строки в соответствие с выставленными размерами и принятыми отступами. Для этого применяется метод:
TListBox.Canvas.TextOut(); - прорисовка текста.
Либо: TListBox.Canvas.TextRect(); - прорисовка текста с обрезкой по границам заданной прямоугольной области.
---
Алгоритм разбиения на строки (перенос строк) выполняется на основе метода:
TListBox.Canvas.TextWidth() - определение длины заданного текста в пикселах.
Высота элемента рассчитвыается с помощью метода:
TListBox.Canvas.TextHeight() - определение высоты заданного текста в пикселах.
0
PineTea
0 / 0 / 1
Регистрация: 17.11.2015
Сообщений: 12
22.12.2015, 13:00 3
Цитата Сообщение от Mawrat Посмотреть сообщение
Алгоритм разбиения на строки (перенос строк) выполняется на основе метода:
TListBox.Canvas.TextWidth() - определение длины заданного текста в пикселах.
Высота элемента рассчитвыается с помощью метода:
TListBox.Canvas.TextHeight() - определение высоты заданного текста в пикселах.
Это всё в сам ListBox писать, верно?
0
Mawrat
12827 / 5735 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
29.12.2015, 13:14 4
Цитата Сообщение от PineTea Посмотреть сообщение
Это всё в сам ListBox писать, верно?
Для экземпляра TListBox надо создать обработчики событий OnMeasureItem и OnDrawItem. В обработчике события OnMeasureItem надо определить высоту элемента в пикселах. В обработчике события OnDrawItem надо выполнить прорисовку элемента.
Надо учитывать следующее обстоятельство. В обработчике события OnMeasureItem надо определить высоту элемента. Высота зависит от разбиения текста на строки. А это разбиение зависит от ширины элемента. Так вот, ширина элемента в разные моменты может быть разной - в зависимости от того, показана вертикальная полоса прокрутки или скрыта. Когда элементов мало, то вертикальная полоса прокрутки скрыта и не занимает место. При этом ширина элемента равна ширине клиентской области ListBox. Когда элементов становится больше, то вертикальная полоса прокрутки появляется автоматически и ширина элемента становится равной разности между шириной клиентской области и шириной вертикальной полосы прокрутки. Поэтому, лучше сразу для элементов задать ширину, равную этой разности.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    ...
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ListBox1MeasureItem(Control: TWinControl; Index: Integer;
      var Height: Integer);
    procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    ...
  private
    { Private declarations }
  protected
    //Список для хранения строк, на которые разбит текст элемента в ListBox1.
    FSl : TStrings;
    //Ширина в пикселах, равная разности между шириной клиентской области ListBox1
    //и шириной вертикальной полосы прокрутки.
    FWidth : Integer;
  public
    { Public declarations }
    function GetItemHeight(aLb : TListBox; const aIndex, aWidth : Integer) : Integer;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
{ Процедура по заданной ширине aWidth, в контексте параметров канвы aCnv, выполняет
  разбиение текста aText на строки. Набор этих строк записывается в список aSl.}
procedure TextToStrings(aCnv : TCanvas; const aText : String; const aWidth : Integer; aSl : TStrings);
var
  i, Len, LenLine : Integer;
begin
  aSl.Clear;
  Len := Length(aText); //Длина текста.
  i := 1;               //Позиция начала строки.
  while i <= Len do     //Цикл разбиения текста на строки.
  begin
    LenLine := 1;
    while (i + LenLine <= Len) and (aCnv.TextWidth(Copy(aText, i, LenLine + 1)) < aWidth) do //Подбор ширины строки.
      Inc(LenLine);
    aSl.Add(Copy(aText, i, LenLine)); //Добавляем строку в список.
    Inc(i, LenLine);                  //Начальная позиция следующей строки.
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  //Список для хранения строк, на которые разбит текст элемента ListBox1.
  FSl := TStringList.Create;
  //Ширина в пикселах, равная разности между шириной клиентской области ListBox1
  //и шириной вертикальной полосы прокрутки.
  FWidth := ListBox1.ClientWidth - GetSystemMetrics(SM_CXHSCROLL);
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(FSl);
end;
 
//Подсчёт высоты в пикселах для элемента в экземпляре TListBox с индексом aIndex и шириной aWidth.
function TForm1.GetItemHeight(aLb : TListBox; const aIndex, aWidth : Integer) : Integer;
var
  i : Integer;
begin
  //Разбиение текста на строки. -4 - учёт ширины полей.
  TextToStrings(aLb.Canvas, aLb.Items[aIndex], aWidth - 4, FSl);
  Result := aLb.ItemHeight;
  if FSl.Count > 0 then
  begin
    Result := 2 + 2; //Учёт высоты полей.
    for i := 0 to FSl.Count - 1 do //Добавляем высоты строк.
      Inc(Result, aLb.Canvas.TextHeight(FSl[i]));
  end;
end;
 
//Обработчик события OnMeasureItem - задание высоты элемента.
procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer;
  var Height: Integer);
var
  Lb : TListBox;
begin
  Lb := Control as TListBox;
  Height := GetItemHeight(Lb, Index, FWidth - 4); //-4 - учёт ширины полей.
end;
 
//Обработчик события OnDrawItem - прорисовка элемента.
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  Lb : TListBox;     
  i, L, T : Integer;
begin          
  Lb := Control as TListBox;
  Lb.Canvas.FillRect(Rect); //Заливаем область элемента цветом кисти.
  //Lb.Canvas.Rectangle(Rect); //Чертим рамку вокруг элемента цветом пера.
  //Рисуем строки текста.
  TextToStrings(Lb.Canvas, Lb.Items[Index], FWidth - 4, FSl); //-4 - учёт ширины полей.
  T := Rect.Top + 2;  //+2 - учёт отступа сверху.
  L := Rect.Left + 2; //+2 - учёт отступа слева.
  for i := 0 to FSl.Count - 1 do
  begin
    Lb.Canvas.TextOut(L, T, FSl[i]);
    Inc(T, Lb.Canvas.TextHeight(FSl[i]));
  end;
end;
 
...
 
end.
1
Миниатюры
Перенос по строчкам  
Вложения
Тип файла: 7z MultilineElementsInListBox-01.7z (162.9 Кб, 7 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2015, 13:14

Обращение к строчкам Маткада
Здравствуйте! У меня есть таблица с данными, суть задачи такова: любой человек...

Способ считывания файла по строчкам
Как мне объявить переменные по сторочкам в файле или просто скажить просто...

Построить график по 3 строчкам из массива
Подскажите, пожалуйста, как вывести 3 линии на график Одна выводится хорошо (...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru