Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать выравнивание по ширине в 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]

Код бы посмотреть для начала.


Наверх

Титульная страница Поиск, карта сайта Написать письмо