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

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

Печать в mdvXLGrid


<Falcon> ©   (2003-10-20 17:13:00) 

В частности интересует как реализовать вывод изображения на принтер объединенных ячеек? При оббегании ячеек в цикле и выводе четырехугольников, объединенные ячейки отображаются неправильно.
Пробовал чтобы это обойти так

procedure TForm1.Button1Click(Sender: PObj);
var
i,j,Px,Py : integer;
Rect: TRect;
begin
Printer.BeginDoc;

Px:=GetDeviceCaps(Printer.Handle,LOGPIXELSX) div 100;
Py:=GetDeviceCaps(Printer.Handle,LOGPIXELSY) div 100;
for j:=0 to Grid1.RowCount-1 do
 begin
   for i:=0 to Grid1.ColCount-1 do
     begin
       Printer.Canvas.Font.Assign(Grid1.Cells[i,j].Font);
       Printer.Canvas.Font.FontHeight:= Printer.Canvas.Font.FontHeight*Py;
       Printer.Canvas.Font.FontWidth:= Printer.Canvas.Font.FontWidth*Px;
       Printer.Canvas.Brush.Color:=Grid1.Cells[i,j].Color;
       Printer.Canvas.Pen.Color:= Grid1.LineColor;
       Printer.Canvas.Pen.PenWidth:= 1*Px;
       Printer.Canvas.Pen.PenMode:= pmCopy;
       Rect:=Grid1.CellToRect(i,j);
       Rect:=MakeRect(Rect.Left*Px,Rect.Top*Py,Rect.Right*Px,Rect.Bottom*Py);
       Printer.Canvas.RequiredState( HandleValid or FontValid or BrushValid or ChangingCanvas );
       if Grid1.IsMerge(MakePoint(i,j)) then
         begin
           if Grid1.Cells[i,j].Tag<>Grid1.Cells[i+1,j].Tag then
             begin
               Printer.Canvas.MoveTo(Rect.Right,Rect.Top);
               Printer.Canvas.LineTo(Rect.Right,Rect.Bottom);
             end;
           if Grid1.Cells[i,j].Tag<>Grid1.Cells[i,j+1].Tag then
             begin
               Printer.Canvas.MoveTo(Rect.Left,Rect.Top);
               Printer.Canvas.LineTo(Rect.Right,Rect.Top);
             end;
         end
         else Printer.Canvas.Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
         Printer.Canvas.DrawText(Grid1.Cells[i,j].Text,Rect,DT_SINGLELINE or DT_CENTER or DT_VCENTER);

     end;
 end;

Printer.EndDoc;
end;

В свойстве tag задаю принадлежность к определенной обьединенной ячейке.
Так работает, но сам чувствую сделано через... Помогите советом.


mdw   (2003-10-21 11:43:00) [1]

2 <Falcon>
Давай присылай. Я как-то пробовал, но что-то DrawText при вертикальном выводе, у меня странно работает.:(( Так что если получилось, то добавим.


&lt;Falcon&gt;   (2003-10-21 09:30:00) [2]

Спасибо! Попробую сегодня. Кстати мы как-то обсуждали вопрос о вертикальном выводе текста и переносах. Эти свойства можно было бы тоже добавить, я это сделал правда не в компоненте а в проге.Работает. Если нужно - могу выслать. Не знаю только насколько удачно вышло.


mdw   (2003-10-20 18:22:00) [3]

Тогда добавлю сответствующие свойства для ячеек. Просто, когда портировал компонент в KOL, все свойства ячеек грохнул, показалось что не нужны они.
А вообще изначально компонент делался как раз для получения однозначного соответствия того что на экране (96 dpi) и того что выводится в  Tif (600 dpi).
Кстати DrawText(...); не одинаково выводит текст при разных разрешениях (экран\принтер), поэтому лучше сначала пробегать всю строку и вызывать  DrawText с DT_CALCRECT, получать максимальную высоту ячеек, а потом уже выводить ячейки с этой высотой, иначе текст может вылазить за пределы ячейки.


mdw   (2003-10-20 18:09:00) [4]

Здесь наверное поможет перенос из секции private d public полей
FShow - видима ли ячейка(левая верхняя из обьединенных - True, остальные - False)
FIsMerge - обьеденина ли ячейка;
FBoundsWidth - кол-во обединенных ячеек (столбцы);
FBoundsHeight - кол-во обединенных ячеек (строки);
FMergePos: TPoint; - левая верхняя ячеека из обьединенных.

А печатать нужно у которых FShow - True.


Наверх

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