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

Вниз

Разбиение строкИ на стрОки   Найти похожие ветки 

 
Broot   (2003-09-10 10:42) [0]

Всем здрасьте.

Есть такая задача:
создать битмап в памяти, вывести на него текст(с переносами по словам), а затем отрисовать его (битмап).(Здесь все понятно)

НО:

Замучал такой вопрос:
Т.к. зараннее не известна длина текста(а он может включать в себя и #10#13, которые надо учитывать) как лучше решить проблему?

PS: битмап.height увеличивать можно, а width - нельзя


 
Skier   (2003-09-10 10:44) [1]

TStringList.Text := ???;


 
Erik   (2003-09-10 10:47) [2]

Пошеш алгоритьм который ищет пробелы, проверяет нетули после них #13#10 или #10. Поле обработаный кусок кидаеш в TStrings итд..


 
Broot   (2003-09-10 10:48) [3]

нет.

Я забыл указать, что мне надо также узнать высоту всего ОТРИСОВАННОГО на битмапе текста


 
ZEE   (2003-09-10 10:50) [4]

а еще можно зайти в раздел "UBPFD - бесплатная база готовых решений для Delphi" (вверху основного форума)
и там в "Строки и символы" найдешь кучу алгоритмов разбиения строк


 
Broot   (2003-09-10 10:54) [5]

2ZEE

ок, гляну


 
pasha_golub   (2003-09-10 11:12) [6]

Функция возвращет высоту выведенного. Параметры: DX, DY - отступы слева и сверху, остальные думаю и так понятно

function WriteCheckedText(ACanvas: TCanvas; const ARect: TRect; DX, DY: Integer; const Text: string; Alignment: TAlignment;):integer;
const
BreakingChars: set of Char = [ #0..#255] - ["a".."z","A".."Z","1".."9","0"];
var
H,RectWidth: integer;
OutStr:string;
LastBreakingCharPos:integer;
Left,Right,DHeight,DH: integer;
Len: integer;
StartPos, DPos: integer;
S:string;

begin
ACanvas.FillRect(ARect);
SetBkMode(ACanvas.Handle,Transparent);
RectWidth := (ARect.Right) - (ARect.Left);
Result := -1;
if RectWidth < ACanvas.TextWidth("W") then
Exit;
ACanvas.Lock;
try
H := ARect.Top+DY;
StartPos := 1;
DPos := 0;
Len := length(Text);
LastBreakingCharPos := 0;

while StartPos<Len do
begin
while (StartPos+DPos <= Len) //пока не вышли за строку
and (ACanvas.TextWidth(trim(copy(Text,StartPos,DPos)))<RectWidth)
do
begin
if Text[StartPos+DPos] in BreakingChars then
LastBreakingCharPos := StartPos+DPos;
inc(DPos);
end;

if not (StartPos+DPos >= Len) then
if (LastBreakingCharPos > StartPos)
then //разрываем по нормальному
DPos := LastBreakingCharPos-StartPos+1
else //разрываем принудительно
dec(DPos);
OutStr := Trim(Copy(Text,StartPos,DPos));
case Alignment of
taLeftJustify:
Left := ARect.Left+DX;
taRightJustify:
Left := ARect.Right - ACanvas.TextWidth(OutStr)-DY;
else { taCenter }
Left := ARect.Left + (RectWidth) shr 1
- (ACanvas.TextWidth(OutStr) shr 1);
end;
TextOut(ACanvas.Handle,Left,H,PChar(OutStr),
length(OutStr));
DHeight := ACanvas.TextHeight(OutStr);

inc(StartPos,DPos);
inc(H,DHeight);
DPos := 0;
end;
Result := H;
finally
ACanvas.Unlock;
end;
end;


 
pasha_golub   (2003-09-10 11:15) [7]

Кстати, есть такая вот функция DrawText, которая тоже возвращает высоту, но у нее, если слово выходит за пределы прямоугольника, оно не переносится. А код выше проверен и работает, сам использую


 
pasha_golub   (2003-09-10 12:53) [8]

Упс забыл русские буквы. так надо
BreakingChars: set of Char = [ #0..#255] - ["a".."z","A".."Z","а"..я"","А".."Я","1".."9","0"];,



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

Форум: "Основная";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.012 c
7-71970
bloodman
2003-07-08 21:23
2003.09.22
HOOk & DLL


3-71532
Relaxxx
2003-08-29 10:30
2003.09.22
Footer у DBGridEh


14-71955
Карелин Артем
2003-08-29 15:26
2003.09.22
Жигули VS Мерседес.


14-71874
jack128
2003-09-04 12:23
2003.09.22
Именинники 4 сентября


3-71513
RusGrek
2003-09-01 09:46
2003.09.22
Создание новой таблицы FoxPro с помощью SQL - проблема размера





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский