![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать выравнивание по ширине в Memo? [D7, XP]
Shizik © (2006-02-04 17:55:00)Я его сам уже сделал только в конце все равно пробелы отсаються...
Как быть?
HITMAN (2006-02-04 20:08:00) [1]Courier New сизе 10
и читаемо и послушно
Shizik (2006-02-04 20:04:00) [2]Важно то что алгоритм должен работать при любом шрифте и размере...!!!
Anatoly Podgoretsky (2006-02-04 19:10:00) [3]А что важно?
Shizik (2006-02-04 18:41:00) [4]Моноширный не моноширный...это не важно...вот в чем соль...
sniknik (2006-02-04 18:38:00) [5]> но возникли проблемы...
шрифт оказывается не моноширинный? ;о)
ну так выбери такой какой надо (например "Lucida Console") правда проиграеш в его "читабельности".
Shizik (2006-02-04 18:31:00) [6]Дело в том что мне надо сделать это выравнивание именно в Memo, а самый простой способ это сделать (по моему мнению) это подстановка пробелов...но возникли проблемы...
Anatoly Podgoretsky (2006-02-04 18:06:00) [7]Это же ты пробелы вставляешь, а не выравниваешь по ширине. Выравнивание по ширине это достаточно сложная, низкоуровневая задача, надо оперировать характеристиками шрифта на уровне плохо описаного (сложного) АПИ Виндоус. Лучше перейти от TMemo к чему ни будь другому. Например сделать обертку вокруг RichEdit 3.0
Shizik (2006-02-04 18:01:00) [8]procedure TForm1.WidthClick(Sender: TObject);
var
i,j,p,k,l: Integer;
S: String;
SpaseWidth: Integer;
begin
SpaseWidth:=Canvas.TextWidth(' ');
for i:=0 to Memo1.Lines.Count-1 do
begin
s:=Memo1.Lines.Strings[i];
k:=0;
p:=0;
if Length(SpaseArray)<>0 then SetLength(SpaseArray,0);
for j:=0 to Length(s)-1 do
if s[j]=' ' then
begin
SetLength(SpaseArray,k+1);
SpaseArray[k]:=j;
Inc(k);
end;
if k=0 then Exit;
p:=(Memo1.ClientWidth-Canvas.TextWidth(s)) div SpaseWidth;
p:=Round(p div k);
if p=0 then Exit;
for j:=k-1 downto 0 do
begin
l:=0;
while l<>p do
begin
Insert(' ', S, SpaseArray[j]);
Inc(l);
end;
end;
Form1.Caption:=IntToStr(Memo1.ClientWidth-Canvas.TextWidth(s));
Memo1.Lines.Strings[i]:=s;
end;
end;
Это код процедуры обработчика...
Кефир87 (2006-02-04 17:58:00) [9]Код в студию 8)
@BraIN (2006-02-04 17:58:00) [10]Код бы посмотреть для начала.