Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];

Вниз

Глюки 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.038 c
14-1098034446
u
2004-10-17 21:34
2004.11.07
Есть ли способы лечить пивной алкоголизм?


4-1095749888
secret
2004-09-21 10:58
2004.11.07
Как в “Delphi 6” поменять шрифт, в котором выводится надпись на з


14-1097833874
NewDelpher
2004-10-15 13:51
2004.11.07
TClientSocket и TServerSocket


14-1097987302
default
2004-10-17 08:28
2004.11.07
Удаление архива для восстановления системы в WinME


1-1098683641
Mishenka
2004-10-25 09:54
2004.11.07
ImageIndex в TreeView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский