Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Печать StringGrida, Помогите разобраться с печатью StrGrida 
:(
    Опции темы
Snowy
Дата 17.12.2005, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(RN3QGA @ 17.12.2005, 21:42)
if Printer.Canvas.Hight>Y2 then

Код

if Printer.PageHeight > Y2 then 

PM MAIL   Вверх
Albinos_x
Дата 18.12.2005, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Код

....
uses Printers, Grids, Windows, Graphics, Classes;

    procedure PrintGrid(sGrid: TStringGrid; sTitle: string;var Col:Integer);

...

procedure PrintGrid(sGrid: TStringGrid; sTitle:string;var Col:Integer);
var
  X1, X2: Integer;
  Y1, Y2: Integer;
  TmpI: Integer;
  F: Integer;      
  TR: TRect;
  coll:integer;
  ff:boolean;
begin
  coll:=0;
  f:=0;
  ff:=false;
  Printer.Title := sTitle;
  if Printer.PageNumber=0 then
     begin
     Printer.BeginDoc; 
     ff:=true;
     end;
  Printer.Canvas.Pen.Color  := 0; 
  Printer.Canvas.Font.Name  := 'Times New Roman'; 
  Printer.Canvas.Font.Size  := 12; 
  Printer.Canvas.Font.Style := [fsBold, fsUnderline]; 
  Printer.Canvas.TextOut(0, 100, Printer.Title); 
  while col<=sGrid.RowCount do 
      begin
      x1:=0;
      x2:=0;
      Y1 := 150 * coll + 300;  
      Y2 := 150 * (coll + 1) + 300;
      TR := Rect(X1, Y1, X2 - 30, Y2); 
      Printer.Canvas.Font.Style := [fsBold];  
      Printer.Canvas.Font.Size := 7;  
      if Printer.PageHeight>Y2 then                       
         Printer.Canvas.TextRect(TR, X1 + 50, Y1 + 50, sGrid.Cells[0, col])  
         else
         begin
         Printer.NewPage;                                                        
         PrintGrid(sGrid, 'Print Stringgrid',col);       
         end;
      while F<sGrid.ColCount do 
         begin
         X1 := 0; 
         for TmpI := 1 to (F - 1) do
             X1 := X1 + 5 * (sGrid.ColWidths[TmpI]);
         X2 := 0;
         for TmpI := 1 to F do
            X2 := X2 + 5 * (sGrid.ColWidths[TmpI]);
         TR := Rect(X1, Y1, X2 - 30, Y2);  
         Printer.Canvas.TextRect(TR, X1 + 50, Y1 + 50, sGrid.Cells[F,col]); 
         inc(f);
         end;
      f:=1;
      inc(coll);
      inc(col);
      end;
  if ff then
     Printer.EndDoc;  
end;
....


разобрался... печать новую начинать нельзя пока не закончил старую, плюс ещё кое-чего поменял. Этот код точно работает, проверил...
предыдущий код писал в попыхах, там много ошибок... в этом всё исправлено, плюс добавлены переменные для печати сначала нового листа(coll) и определения создания нового документа или продолжения старого(ff), кроме того исправлены ошибки в вычислениях и убраны лишние операции...

Это сообщение отредактировал(а) Albinos_x - 18.12.2005, 01:36


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RN3QGA
Дата 18.12.2005, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 28.11.2005
Где: Воронежская обл.

Репутация: нет
Всего: нет



Добрый вечер !
Код проверил, действительно работает, но с оговоркой - после печати основных страниц (например 3-х листов) начинает печатать (повторять 3 лист) еще несколько раз (сколько не считал на 5 -м бумага закончилась, но предпологаю,что много (глянул в диспетчере висит число более 100 ), да и пришлось убрать в
( procedure PrintGrid(sGrid: TStringGrid; sTitle: var string; Col:Integer);
В чем дело ? smile
Спасибо.

Это сообщение отредактировал(а) RN3QGA - 18.12.2005, 18:52
PM MAIL   Вверх
Snowy
Дата 18.12.2005, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Это из-за рекурсии.
Поправь так:
Код

         begin    
         Printer.NewPage;                                                         
         PrintGrid(sGrid, sTitle,col);
         break;
         end;

PM MAIL   Вверх
RN3QGA
Дата 18.12.2005, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 28.11.2005
Где: Воронежская обл.

Репутация: нет
Всего: нет



Спасибо! Все вроде бы работает, но еще досконально разберусь сообщу. smile

PM MAIL   Вверх
Albinos_x
Дата 18.12.2005, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(RN3QGA @ 18.12.2005, 18:48)
, но с оговоркой - после печати основных страниц (например 3-х листов)

тож сначала такая проблема была, когда начал отладку кода, но потом исправил...видно при копировании исправленного кода, ты поменял только содержимое функции и не поменял строку:
Код

procedure PrintGrid(sGrid: TStringGrid; sTitle: var string; Col:Integer);

на эту:
Код

procedure PrintGrid(sGrid: TStringGrid; sTitle:string;var Col:Integer);

это происходило потому что переменная Col не изменялась при выходе из рекурсии, если же написать
Код

...var Col:Integer

то переменная изменяется и листы не повторяются. Но пердложенный вариант Snowy, тоже выход из положения.
Добавлено @ 19:38
к тому же в той строке была опечатка:
Код

procedure PrintGrid(sGrid: TStringGrid; sTitle: var string; Col:Integer);

по идее так она бы и не запустилась, а когда ты исправил на:
Код

procedure PrintGrid(sGrid: TStringGrid; sTitle: string; Col:Integer);

то как я написал, при выходе из процедуры, переменная Col оставалась такой же, как и при входе в неё, поэтому она делала кучу лишних листов.


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
RN3QGA
Дата 18.12.2005, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 28.11.2005
Где: Воронежская обл.

Репутация: нет
Всего: нет



Доброго времени всем!
С кодом разобрался полностью, Все подправил - работает, проверил окончательно!
Спасибо огромное за помощь, пока вопросов нет, но думаю в процессе совершенствования своей проги могут возникнуть, за дальнейшую помощь СПАСИБО заранее.
73! SK smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0686 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.