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

Вниз

Сделать разбиение по строкам   Найти похожие ветки 

 
Urvin   (2005-03-07 19:17) [0]

Необходимо сделать из одной переменной типа string несколько строчек на канвасе, причем с разделением по словам.
Т.е. Нам задана максимальная ширина строки в пикселях, N. В одну строку могут помещаться несколько слов, если они достаточно короткие. Если слово длиннее заданной ширины строки, надо обрезать это слово по ширине строки, и остаток, если не слишком длинен напечатать на следующей строчке. Если он длинный, повторить обрезание..
Вот. Как бы это сделать? Желательно без всяких целомудренных функций...


 
MU ©   (2005-03-07 19:25) [1]

Вот одна очень похотливая функция:

int DrawText(

   HDC hDC, // handle to device context
   LPCTSTR lpString, // pointer to string to draw
   int nCount, // string length, in characters
   LPRECT lpRect, // pointer to structure with formatting dimensions  
   UINT uFormat  // text-drawing flags
  );

и флаг DT_WORDBREAK


 
Urvin   (2005-03-07 20:00) [2]

Ннне то. ТЬакое я уже видел, и не известно, насколько длинный получится столбец текста.
Желательно алгоритмом...


 
MU ©   (2005-03-07 20:07) [3]

Используй TCanvas.TextHeight и TCanvas.TextWidth
и TCanvas.TextOut.


 
Urvin   (2005-03-07 21:38) [4]

Да. Тка как ни делаю, все мимо... Вот и хотел попросить алгоритм.
Цели и средства уже давно знаю...


 
MU ©   (2005-03-07 21:38) [5]

покажите, как делаете


 
Palladin ©   (2005-03-07 21:46) [6]

Нюка нюка, чего ты там старался :)


 
Urvin   (2005-03-07 21:55) [7]

Получается плохо, использую стронние элементы, но не суть важно:
procedure TfrmMain.actPrintExecute(Sender: TObject);
var i,j,ii,iii,jjj,isf: integer;
   n:integer;
   kx,ky,dy: integer;
   polex,poley: single;
   pwidth: array[0..12] of integer;
   pcontent: array[0..12] of string;
   nmax,nmaxall,cury,onrow,rowis,rows:integer;
   curstr,curword,currow:string;
   curchar: string[1];
const
   ptitles: array[0..12] of string = ( "№", "Название", "Клиент", "Дата", "Срок исполнения", "Менеджер", "Тираж", "Формат", "Цветность", "Бумага", "Особенности", "Макет", "Пленки");
begin
 n:=0;

 if lwTekush.SelCount<>0 then
   if prdPrint.Execute then begin
     Printer.Orientation:=poLandscape;

     polex:=0.1; poley:=0.1;
     kx:=round(Printer.PageWidth/29.7);
     ky:=round(Printer.PageHeight/21);

     dy:=Printer.Canvas.TextHeight("8)`_");

     ////////////////////////////////////////////////////////////
     for i:=0 to 12 do begin
       pwidth[i]:=Trunc((Printer.PageWidth - polex*2*kx)/13);
     end;
     ////////////////////////////////////////////////////////////

     Printer.Title:= "Manager Vis-a-viS";
     Printer.BeginDoc;

     with printer.Canvas do begin
       n:=0;
       for i:=0 to 12 do begin
         Brush.Style:=bsSolid;
         Brush.Color:= $EEEEEE;
         Rectangle(Trunc(polex*kx+n),Trunc(poley*kx),Trunc(polex*kx+n+pwidth[i]),Trunc(poley*kx + dy));
         Brush.Style:=bsClear;
         TextOut(Trunc(polex*kx+n+(pwidth[i] - TextWidth(ptitles[i]))/2),Trunc(poley*ky),ptitles[i]);
         n:= n+pwidth[i];
       end;

       //##################################################

       rows:=1;

       for i:=0 to lwTekush.Items.Count-1 do begin
        if lwTekush.Items[i].Selected=true then begin
           ibqQuery.First;
           ibqQuery.MoveBy(StrToInt(lwTekush.Items[i].SubItems[6]));

           pcontent[ 0]:=ibqQuery.Fields[ 0].AsString;
           pcontent[ 1]:=ibqQuery.Fields[ 4].AsString;
           pcontent[ 2]:=ibqQuery.Fields[ 2].AsString;
           pcontent[ 3]:=ibqQuery.Fields[ 1].AsString;
           pcontent[ 4]:=ibqQuery.Fields[10].AsString;
           pcontent[ 5]:=ibqQuery.Fields[ 3].AsString;
           pcontent[ 6]:=ibqQuery.Fields[ 5].AsString;
           pcontent[ 7]:=ibqQuery.Fields[ 6].AsString;
           pcontent[ 8]:=ibqQuery.Fields[ 7].AsString;
           pcontent[ 9]:=ibqQuery.Fields[ 8].AsString;
           pcontent[10]:=ibqQuery.Fields[ 9].AsString;
           pcontent[11]:="";
           pcontent[12]:="";

           //##################################################################
           nmaxall:=0;
           for j:= 0 to 12 do begin
             {onrow:=0;curstr:="";
             while TextWidth(curstr)<=pwidth[j] do begin
               curstr:=curstr + "W";
               onrow:=onrow+1;
             end;
              }
             nmax:=0; iii:=1;isf:=0;curstr:=""; currow:="";

             pcontent[j]:=StringReplace(pcontent[j],#10,"",[rfReplaceAll])+#13;

             {for ii:= 1 to length(pcontent[j]) do begin
               curstr:=curstr+copy(pcontent[j],ii,1);
               if copy(pcontent[j],ii,1)=#13 then nmax:=nmax+1;
               if (ii mod onrow) = 0 then begin
                 curstr:=curstr+#13;
                 nmax:=nmax+1;
               end;
             end; }

             for ii:= 1 to length(pcontent[j]) do begin
               curchar:=copy(pcontent[j],ii,1);
               case Ord(curchar[1]) of
                 13: begin
                   nmax:=nmax+1;
                   iii:=ii+1;
                   isf:=0;
                   curstr:=curstr+curchar;
                   currow:="";
                   nmax:=nmax+1;
                 end;

                 32: begin
                   curword:=Copy(pcontent[j],iii,ii-iii);
                   iii:=ii+1;
                   if TextWidth(currow + " " + curword) <= pwidth[j] then begin
                     currow:=currow+" "+curword;
                     isf:=1;

                   end
                   else begin
                     if isf=0 then begin
                       jjj:=0;
                       while textwidth(Copy(curword,1,jjj))<= pwidth[j] do begin
                         jjj:=jjj+1;
                       end;

                       currow:=Copy(curword,1,jjj-1);
                       curstr:=curstr+#13+currow;
                       currow:=Copy(curword,jjj,length(curword)-jjj+1);
                       nmax:=nmax+1;
                     end
                     else begin
                       curstr:=curstr+#13+currow;
                       currow:=curword;
                       nmax:=nmax+1;
                     end;
                   end;
                 end;
               end;
             end;

             pcontent[j]:=curstr;

             if nmax>nmaxall then nmaxall:=nmax;

           end;

           if rows*dy+nmaxall*dy+poley*ky > Printer.PageHeight-2*poley*ky-rowis*dy then begin
             rows:=1;
             printer.NewPage;

             n:=0;
             for ii:=0 to 12 do begin
               Brush.Style:=bsSolid;
               Brush.Color:= $EEEEEE;
               Rectangle(Trunc(polex*kx+n),Trunc(poley*kx),Trunc(polex*kx+n+pwidth[ii]),Trunc(poley*kx + dy));
               Brush.Style:=bsClear;
               TextOut(Trunc(polex*kx+n+(pwidth[ii] - TextWidth(ptitles[ii]))/2),Trunc(poley*ky),ptitles[ii]);
               n:= n+pwidth[ii];
             end;

           end;

           n:=0;
           Brush.Style:=bsClear;
           for j:= 0 to 12 do begin
             Rectangle(Trunc(polex*kx+n),Trunc(poley*kx+rows*dy),Trunc(polex*kx+n+pwidth[j]),Trunc(poley*kx + (rows+nmaxall)*dy));

             rowis:=0;

             iii:=1;
             
             for ii:= 1 to length(pcontent[j]) do begin
               if Copy(pcontent[j],ii,1)=#13 then begin
                 printer.Canvas.TextOut(Trunc(polex*kx+n),Trunc(rowis*dy+rows*dy+poley*ky),Copy(pcontent[j],iii,ii-iii));
                 iii:=ii+1;
                 rowis:=rowis+1;
               end;
             end;

             //printer.Canvas.TextOut(Trunc(polex*kx+n),Trunc(rowis*dy+rows*dy+poley*ky),pcontent[j]);

             n:= n+pwidth[j];
           end;

           rows:=rows+nmaxall;

           //##################################################################
         end;
       end;

     end;

     Printer.EndDoc;
   end;

end;


 
Palladin ©   (2005-03-07 22:06) [8]

О боже. За такое убивают.
Я конечно понимаю ООП и ООА... но парни, не забывайте о главном принципе "разделяй и влавствуй", это основной принцип структурного программирования, и никуда он не делся и не денется.
А здесь. Где здесь влавтсвовать то? Это нагромождение над тобой властно, его трудно читать и, соотвессно, его трудно постигать. На хрена оно кому т нужно? В таком случае...


 
MU ©   (2005-03-07 22:08) [9]

8|
я сейчас, конечно, попробую разобраться...
но пока спрошу, а почему генератор отчетов не использовать?


 
MU ©   (2005-03-07 22:37) [10]

или,там, в Word экспортнуть, в таблицу...


 
Urvin   (2005-03-07 23:21) [11]

Низзя. Ща попробую в функцию расписать..


 
Erik1 ©   (2005-03-08 12:01) [12]

Вобщето есть API функции которые возвращают ширину слова на даном Canvas. А далее все расчитать элементарно.


 
easy ©   (2005-03-08 16:04) [13]

procedure TForm1.Button1Click(Sender: TObject);
var sourceStr: string;
   sourceStrLen: Integer;
   sz: TSIZE;
   max,th: Integer;
begin
 sourceStr:="Необходимо сделать из одной переменной типа string несколько"+
 " строчек на канвасе, причем с разделением по словам."+
 " Т.е. Нам задана максимальная ширина строки в пикселях,"+
 " N. В одну строку могут помещаться несколько слов, если они достаточно"+
 " короткие. Если слово длиннее заданной ширины строки,"+
 " надо обрезать это слово по ширине строки, и остаток, если не слишком"+
 " длинен напечатать на следующей строчке. Если он длинный, повторить обрезание.."+
 " Вот. Как бы это сделать? Желательно без всяких целомудренных функций...";
 sourceStrLen:=length(sourceStr);
 max:=0;
 th:=0;
 while sourceStrLen>max do begin
   GetTextExtentExPoint(Canvas.Handle, PChar(sourceStr),sourceStrLen,
     width-10,@max, nil,sz);
   canvas.TextOut(0,th,copy(sourceStr,1,max));
   delete(sourceStr,1,max);
   sourceStrLen:=length(sourceStr);
   inc(th,canvas.TextHeight(sourceStr));
 end;
 canvas.TextOut(0,th,sourceStr);
end;


??



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

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

Наверх





Память: 0.52 MB
Время: 0.043 c
6-1105772012
tester666
2005-01-15 09:53
2005.03.20
CGI приложения


14-1109495138
cyborg
2005-02-27 12:05
2005.03.20
Скорость работы Линукса


3-1108998581
xman
2005-02-21 18:09
2005.03.20
ORACLE


1-1110198971
MU
2005-03-07 15:36
2005.03.20
FreeVCS ->JediVCS


3-1108731763
Квэнди
2005-02-18 16:02
2005.03.20
Проблема при использовании транзакций





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