Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.07;
Скачать: CL | DM;

Вниз

Глюки TMemo   Найти похожие ветки 

 
saNat ©   (2004-10-25 02:11) [0]

Доброго времени суток...
Помогите разобраться с проблемой. Есть Memo. Я выравниваю в нем строки - в первом абзаце по центру, в остальных - по ширине. Задача нижеуказанной функции - определить границу первого абзаца. Проблема в том, что IMHO не верно указывается ширина Memo в пикселях.

Function TDeskTop.FindEnter:Integer;
Var
 SymbolNumber:Integer; //Текущий символ
 TextBuffer:String; //Буфер - копия текста из Memo
 WordBuffer:String; //Буфер - текущее слово
 LineBuffer:STring; //Буфер - текущая строка (входит по длине в ширину Memo
 SpaceCount:Integer; //Количество прробелов в строке
 alCenter:Boolean; //Параметр - текущий абзац первый или нет
 alCenterNumber:Integer; //Строка, на которой оканчивается первый абзац
Begin
SymbolNumber:=1;  //Становимся на первый символ
TextBuffer:=TextEdit.Lines.Text; //Копируем текст в буфер из Memo
WordBuffer:=""; //Очищаем буфер слова
LineBuffer:="";  //Очищаем буфер строки
SpaceCount:=0; //Сбрасываем количество пробелов
alCenter:=True; //Работаем с первым абзацем
alCenterNumber:=-1; //Окончание первого абзаца неизвестно
TextEdit.Clear; //Очишаем Memo
While (SymbolNumber<=Length(TextBuffer)) Do //Пока не переберем все символы в буфере текста
 Begin
  Case TextBuffer[SymbolNumber] Of //Если текущий символ...
    #13: Begin //...конец абзаца
          TextEdit.Lines.Add(LineBuffer+WordBuffer); //Вставляем в Memo текущую строку и текущее слово
          If (alCenter=True) //если работаем с первым абзацем...
           Then //...то
            Begin
             alCenterNumber:=TextEdit.Lines.Count; //записываем номер строки окончания первого абзаца
             alCenter:=False; //сбрасываем флаг
            End;
          WordBuffer:=""; //очищаем буфер слова
          LineBuffer:=""; //очищаем буфер строки
          SpaceCount:=0; //количество пробелов в 0
          Inc(SymbolNumber); //переход на следующий символ - #10
         End;
    #32: Begin //...пробел
          WordBuffer:=WordBuffer+TextBuffer[SymbolNumber]; //прибавляем пробел к текущему слову
          LineBuffer:=LineBuffer+WordBuffer; //вставляем текущее слово в текущую строку
          WordBuffer:=""; //очищаем буфер слова
          Inc(SpaceCount); //увеличиваем счетчик пробелов
         End;
   Else  Begin //...если другие символы
          //Если длина текущей строки+текущего слова+текущего символа больше или равна клиентской ширине Memo
          If (Canvas.TextWidth(LineBuffer+WordBuffer+TextBuffer[SymbolNumber])>=TextEdit.ClientWidth)
           Then //...то
            Begin
             If (SpaceCount=0) //если в строке нет пробелов
              Then
               Begin
                TextEdit.Lines.Add(WordBuffer); //вставляем в Memo буфер слова
                WordBuffer:=""; //сбрасываем буфер слова
               End
              Else //..иначе
               Begin
                TextEdit.Lines.Add(LineBuffer); //вставляем буфер строки
                LineBuffer:=""; //сбрасываем буфер строки
                SpaceCount:=0; //сбрасываем количество пробелов
               End;
            End;
          WordBuffer:=WordBuffer+TextBuffer[SymbolNumber]; //в любом случае прибавляем текущий символ к буферу слова
         End;
  End;
  Inc(SymbolNumber); //переходим к следующему символу
 End; //конец цикла
If (Length(WordBuffer)<>0) //если буфер слова не пустой (всего 1 абзац)
 Then
  Begin
   TextEdit.Lines.Add(WordBuffer); //вставляем буфер слова
  End;
Result:=0; //возврат значения пока не важен
End;

Разберем на примере. Пусть есть строка, состоящая из 87 единиц. При данном шрифте ширина каждой - 7 пикселей (смотрел отладчиком). При этом клиентская часть Memo - 611 пикселей. => 87*7=609 пикселей и строка должна войти в 1 линию (Lines) Memo. Как бы не так. Одна единица не помещается.
Из-за чего? И как быть.
Параметры Memo:
Шрифт: Comic Sans MS 12 размера обычный кирилический
Длина Memo (Width): 632 пикселя
Полосы прокрутки (ScrollBars): ssVertical

С уважением...


 
kostan ©   (2004-10-25 02:40) [1]

1) ну может как вариант сделать запас пикселей в 5-10 при  проверке
(форматирование наверно не требует большей точности)
2) использовать моноширинные шрифты (Courier, Lucida Cons)


 
saNat ©   (2004-10-25 03:13) [2]

kostan © (25.10.04 02:40) [1]
1) ну может как вариант сделать запас пикселей в 5-10 при  проверке
Допустим, но возникает вопрос - а сколько прибавить и отчего зависит
2) использовать моноширинные шрифты (Courier, Lucida Cons)
Не прокатит. Шрифты можно менять.


 
kostan ©   (2004-10-25 03:54) [3]

тогда может TextEdit.ClientWidth берется с шириной Полосы прокрутки (ScrollBars): ssVertical + еще пар-тройка pix на границы
(и имхо надо уменьшать на это значение?)


 
saNat ©   (2004-10-25 04:04) [4]

Ну по идее (моей), клиентская часть на то и клиентская, чтобы выдавать доступную пользователю область. Иначе откуда мне знать ширину скролла...

С уважением...


 
kostan ©   (2004-10-25 04:16) [5]

извини TextEdit.ClientWidth точно без скрола,
но всетаки проверь тогда с моноширинными шрифтами [ими все равно красивее форматировать]
(если с ними будет OK тогда дело в определении ширины Canvas.TextWidth)


 
saNat ©   (2004-10-25 05:14) [6]

С моноширным работает... Но это противоречит задаче, да и вопрос остается открытым... Все равно непонятно, почему ошибка. По любому в примере с 1 на Comic шрифте длина текста 609<611 - шлиентская ширина Мемо. А он, урод, ее не помещает и принудительно переносит. Куда деваются 2 пикселя?.


 
kostan ©   (2004-10-25 05:21) [7]

ну тады PASS:(


 
saNat ©   (2004-10-25 05:33) [8]

Спасибо за помошь...
Еще мнения, варианты?


 
saNat ©   (2004-10-25 19:04) [9]

Up


 
Amoeba ©   (2004-10-25 19:09) [10]

A чем RichEdit не нравится? Откуда такая зацикленность на Memo, не предназначенное для таких задач?


 
saNat ©   (2004-10-25 19:12) [11]

Постановка задачи на курсовое проектирование... Выравнивание нужно сделать ручками, а не при помощи компонент

С уважением


 
Amoeba ©   (2004-10-25 19:34) [12]


> saNat ©   (25.10.04 19:12) [11]
> Постановка задачи на курсовое проектирование... Выравнивание
> нужно сделать ручками, а не при помощи компонент

Memo, кстати, такой же стандартный компонент (обертка), как и RichEdit.
Садизм какой-то. Заставляют делать через ж...у.


 
saNat ©   (2004-10-25 20:49) [13]

Тем не менее...


 
saNat ©   (2004-10-25 22:58) [14]

Мастера, помогите пожалуйста.


 
saNat ©   (2004-10-26 09:31) [15]

Вообщем, сделал я программку. Пришлось добавлять к длине строки некоторое количество пикселей, принудительно вызывая перенос. Остановился на значении 21. Однако вопрос остался открытым - почему так. Или уж если выкручиваться, то как определить количество пикселей... Типа по-научному :о))

С уважением...



Страницы: 1 вся ветка

Текущий архив: 2004.11.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.044 c
1-1098434349
onix
2004-10-22 12:39
2004.11.07
Горизонтальный скроллинг в ТМемо


14-1098131386
Piter
2004-10-19 00:29
2004.11.07
Можно отправить SMS на сотовые в Латвии из интернета?


14-1097965283
vecna
2004-10-17 02:21
2004.11.07
Приплыли...


4-1096535278
bSava
2004-09-30 13:07
2004.11.07
NT аутентификация


4-1096778093
XProger
2004-10-03 08:34
2004.11.07
MDI на Win API