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

Поиск:

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


Шустрый
*


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

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



Добрый день уважаемы ппрограммисты.
Никак не могу добиться, чтобы распечатать вcе содержание своего Sting grida.
Использую вот такой код (взят из DRKB)
Код

uses  
  Printers;  

procedure PrintGrid(sGrid: TStringGrid; sTitle: string);  
var  
  X1, X2: Integer;  
  Y1, Y2: Integer;  
  TmpI: Integer;  
  F: Integer;  
  TR: TRect;  
begin  
  Printer.Title := sTitle;  
  Printer.BeginDoc;  
  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);  
  for F := 1 to sGrid.ColCount - 1 do   
  begin  
    X1 := 0;  
    for TmpI := 1 to (F - 1) do  
      X1 := X1 + 5 * (sGrid.ColWidths[TmpI]);  
    Y1 := 300;  
    X2 := 0;  
    for TmpI := 1 to F do  
      X2 := X2 + 5 * (sGrid.ColWidths[TmpI]);  
    Y2 := 450;  
    TR := Rect(X1, Y1, X2 - 30, Y2);  
    Printer.Canvas.Font.Style := [fsBold];  
    Printer.Canvas.Font.Size := 7;  
    Printer.Canvas.TextRect(TR, X1 + 50, 350, sGrid.Cells[F, 0]);  
    Printer.Canvas.Font.Style := [];  
    for TmpI := 1 to sGrid.RowCount - 1 do   
    begin  
      Y1 := 150 * TmpI + 300;  
      Y2 := 150 * (TmpI + 1) + 300;  
      TR := Rect(X1, Y1, X2 - 30, Y2);  
      Printer.Canvas.TextRect(TR, X1 + 50, Y1 + 50, sGrid.Cells[F, TmpI]);  
    end;  
  end;  
  Printer.EndDoc;  
end;  


//Examplem, Beispiel:  

procedure TForm1.Button1Click(Sender: TObject);  
begin  
  PrintGrid(StringGrid1, 'Print Stringgrid');  
end;

В принципе все работает, но печатается только первые 42 строки моего SGrida, а уменя их может быть более 500.
Не хотелось бы использовать Reportы и передавать в MS EXel.
Может дадите свои комментарии к коду,что там и где делается, пока сам разобраться не могу или как его подправить.
Спасибо! smile
PM MAIL   Вверх
Snowy
Дата 14.12.2005, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(RN3QGA @ 14.12.2005, 09:38)
Не хотелось бы использовать Reportы и передавать в MS EXel.

Тогда ты сам должен отслеживать, сколько строк у тебя помещается на страницу.
Создавать новую страницу и продолжать на ней.
PM MAIL   Вверх
RN3QGA
Дата 14.12.2005, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А немогли бы Вы сделать комментарии к коду, мне так легче будет разобраться что там и где, (думаю на этом примере поучиться), а уж дальше постараюсь сам.
Спасибо! (извините я самоучка приходиться грызть).
PM MAIL   Вверх
Snowy
Дата 14.12.2005, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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




Код

procedure PrintGrid(sGrid: TStringGrid; sTitle: string);    
var    
  X1, X2: Integer;    
  Y1, Y2: Integer;    
  TmpI: Integer;    
  F: Integer;    
  TR: TRect;    
begin    
  Printer.Title := sTitle; 
  Printer.BeginDoc; // Начинаем новый документ
  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); // Нарисовать заголовок
  for F := 1 to sGrid.ColCount - 1 do  // начинаем перебирать столбцы
  begin    
    X1 := 0; // Расчитываем месторасположение прямоугольника X1,Y1,X2,Y2 ячейки
    for TmpI := 1 to (F - 1) do  
      X1 := X1 + 5 * (sGrid.ColWidths[TmpI]); 
    Y1 := 300; 
    X2 := 0;    
    for TmpI := 1 to F do    
      X2 := X2 + 5 * (sGrid.ColWidths[TmpI]);    
    Y2 := 450;    
    TR := Rect(X1, Y1, X2 - 30, Y2);  // Вычислили координаты, собираем их в TRect
    Printer.Canvas.Font.Style := [fsBold];  // жирный шрифт
    Printer.Canvas.Font.Size := 7;  // размер шрифта
    Printer.Canvas.TextRect(TR, X1 + 50, 350, sGrid.Cells[F, 0]); // Пишем ячейку заголовка
    Printer.Canvas.Font.Style := []; // стиль шрифта - обычный
    for TmpI := 1 to sGrid.RowCount - 1 do // перебираем строки, ниже заголовка
    begin    
      Y1 := 150 * TmpI + 300;  // опять расчитываем прямоуголькик. X1 и X2 те же.
      Y2 := 150 * (TmpI + 1) + 300;    
      TR := Rect(X1, Y1, X2 - 30, Y2);  // собираем координаты в TRect
      Printer.Canvas.TextRect(TR, X1 + 50, Y1 + 50, sGrid.Cells[F, TmpI]);  // пишем текст ячейки
    end;    
  end;    
  Printer.EndDoc;  // завершить документ
end;    
//Examplem, Beispiel:    
procedure TForm1.Button1Click(Sender: TObject);    
begin    
  PrintGrid(StringGrid1, 'Print Stringgrid');    
end;

Все, что не влазит на канву принтера, на принтер не пойдет. Нужно расчитывать, не вылвзит ли за канву принтера, и, если вылазит, дробить на следующий лист.
Также читай про TPrinter.
PM MAIL   Вверх
RN3QGA
Дата 14.12.2005, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Огромное спасибо ! Буту терзать !
PM MAIL   Вверх
RN3QGA
Дата 15.12.2005, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброй ночи или дня.
"Терзал, терзал" и ничего не натерзал.

С самим кодом разобрался но как расчитать то, что не помещается на канву и добавить новый лист не смог - видимо знаний слабовато. Не плохо бы посмотреть конкретный пример.
Если есть таков то подскажите пожалуйста.

Попробывал передавать данные в Exel, все получилось, все работает - но если нет его,
вот и вопрос.

Помогите кто может и кто не может!
Спасибо!

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


Evil Skynet
****


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

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



можно чуть преобразовать код:
Код

procedure PrintGrid(sGrid: TStringGrid; sTitle: var string; Col:Integer);     
var     
  X1, X2: Integer;     
  Y1, Y2: Integer;     
  TmpI: Integer;     
  F: Integer;     
  TR: TRect;     
begin     
  Printer.Title := sTitle;    
  Printer.BeginDoc; // Начинаем новый документ    
  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 F<sGrid.ColCount do  // начинаем перебирать столбцы    
     begin     
     X1 := 0; // Расчитываем месторасположение прямоугольника X1,Y1,X2,Y2 ячейки    
     for TmpI := 1 to (F - 1) do    
         X1 := X1 + 5 * (sGrid.ColWidths[TmpI]);    
     Y1 := 300;    
     X2 := 0;     
     for TmpI := 1 to F do     
        X2 := X2 + 5 * (sGrid.ColWidths[TmpI]);     
     Y2 := 450;     
     TR := Rect(X1, Y1, X2 - 30, Y2);  // Вычислили координаты, собираем их в TRect    
     Printer.Canvas.Font.Style := [fsBold];  // жирный шрифт    
     Printer.Canvas.Font.Size := 7;  // размер шрифта    
     Printer.Canvas.TextRect(TR, X1 + 50, 350, sGrid.Cells[F, 0]); // Пишем ячейку заголовка    
     Printer.Canvas.Font.Style := []; // стиль шрифта - обычный    
     while col<sGrid.RowCount do // перебираем строки, ниже заголовка    
         begin     
         Y1 := 150 * TmpI + 300;  // опять расчитываем прямоуголькик. X1 и X2 те же.    
         Y2 := 150 * (TmpI + 1) + 300;     
         TR := Rect(X1, Y1, X2 - 30, Y2);  // собираем координаты в TRect    
         if Printer.Canvas.Hight>Y2 then                       // если координаты не вышли за высоту листа
            Printer.Canvas.TextRect(TR, X1 + 50, Y1 + 50, sGrid.Cells[F, TmpI])     // пишем текст ячейки
            else                                                                    // если координаты вышли за пределы листа
            PrintGrid(StringGrid1, 'Print Stringgrid',col);       // рекурсивно вызываем процедуру
         inc(col);          
        end;
    inc(f);     
    end;     
  Printer.EndDoc;  // завершить документ    
end;     
//Examplem, Beispiel:     
procedure TForm1.Button1Click(Sender: TObject);     
begin     
  PrintGrid(StringGrid1, 'Print Stringgrid', 1);     
end;


не проверял, могут быть ошибки, но думаю идея понятна


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


Творец
****


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

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



Я бы сделал так:
Установливаем EhLib, там есть MemoTable
В MemoTable создаем структуру таблицы (поля) и отправляем твой StringGrid в эту MemoTable
К MemoTable подключены из этой же EhLib компонент для печати и сетка
Как ты сетку (DBGridEh) настроишь, так все и будет на листе при предварительном просмотре, т.е. размер колонок, шрифты, цвета и т.д.

Очень удобно.
PM MAIL   Вверх
Snowy
Дата 15.12.2005, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Albinos_x @ 15.12.2005, 05:36)
// рекурсивно вызываем процедуру

Так низя. Иначе ты начнешь новый документ, только закончив первый столбец.
Да и к тому же начнешь сначала.
Так что получишь гору бумаги с первой колонкой.
Здесь нужно менять вложения циклов.
В цикл, перебирающий строки, нужно вкладывать цикл, перебирающий колонки.
И вот, если внешний цикл дошел до края листа, заканчивать страницу, начинать новую, ризовать заголовок и дальше по циклу.
PM MAIL   Вверх
Albinos_x
Дата 15.12.2005, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



Цитата(Snowy @ 15.12.2005, 10:32)
Здесь нужно менять вложения циклов.
В цикл, перебирающий строки, нужно вкладывать цикл, перебирающий колонки.
И вот, если внешний цикл дошел до края листа, заканчивать страницу, начинать новую, ризовать заголовок и дальше по циклу.

да точно... думал об этом... но спешил, поэтому не написал...


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


Шустрый
*


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

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



Ну коли так, а нельзя ли дописать (простите уж за невежливость).
Дело в том, что я вот по совету Dsergey скачал EhLib 4.0 для D7 и попробывал поставить, но не тут то было (Мой D7 ругается и выдает фат. ошибки) ну думаю придеться спрашивать как установить, а сам грешным делом не люблю браться за несколько дел сразу.
Поэтому пока затею с установкой EhLib 4.0 для D7 оставил, хочу все таки разобраться с кодом.
Уж будте добры напишите полную версию, хочется разобраться, а уж потом дальше.
Спасибо![quote] Ученье свет, а неученье чуть свет и на работу !!!
PM MAIL   Вверх
Albinos_x
Дата 16.12.2005, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


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

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



приблизительно так:
Код

procedure PrintGrid(sGrid: TStringGrid; sTitle: var string; Col:Integer);      
var      
  X1, X2: Integer;      
  Y1, Y2: Integer;      
  TmpI: Integer;      
  F: Integer;      
  TR: TRect;      
begin      
  Printer.Title := sTitle;     
  Printer.BeginDoc; // Начинаем новый документ     
  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      
      Y1 := 150 * TmpI + 300;  // опять расчитываем прямоуголькик. X1 и X2 те же.     
      Y2 := 150 * (TmpI + 1) + 300;      
      TR := Rect(X1, Y1, X2 - 30, Y2);  // собираем координаты в TRect     
      while F<sGrid.ColCount do  // начинаем перебирать столбцы      
         begin      
         X1 := 0; // Расчитываем месторасположение прямоугольника X1,Y1,X2,Y2 ячейки     
         for TmpI := 1 to (F - 1) do     
             X1 := X1 + 5 * (sGrid.ColWidths[TmpI]);     
         Y1 := 300;     
         X2 := 0;      
         for TmpI := 1 to F do      
            X2 := X2 + 5 * (sGrid.ColWidths[TmpI]);      
         Y2 := 450;       
         TR := Rect(X1, Y1, X2 - 30, Y2);  // Вычислили координаты, собираем их в TRect     
         Printer.Canvas.Font.Style := [fsBold];  // жирный шрифт     
         Printer.Canvas.Font.Size := 7;  // размер шрифта     
         Printer.Canvas.TextRect(TR, X1 + 50, 350, sGrid.Cells[F, 0]); // Пишем ячейку заголовка     
         Printer.Canvas.Font.Style := []; // стиль шрифта - обычный     
         inc(f);      
        end;   
         if Printer.Canvas.Hight>Y2 then                       // если координаты не вышли за высоту листа    
            Printer.Canvas.TextRect(TR, X1 + 50, Y1 + 50, sGrid.Cells[F, TmpI])     // пишем текст ячейки    
            else                                                                    // если координаты вышли за пределы листа    
            PrintGrid(StringGrid1, 'Print Stringgrid',col);       // рекурсивно вызываем процедуру    
         inc(col);           
        end;    
  Printer.EndDoc;  // завершить документ     
end;      
//Examplem, Beispiel:      
procedure TForm1.Button1Click(Sender: TObject);      
begin      
  PrintGrid(StringGrid1, 'Print Stringgrid', 1);      
end;


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


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


Эксперт
****


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

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



Цитата(Albinos_x @ 16.12.2005, 00:49)
// рекурсивно вызываем процедуру 

Ну не нужно этого делать. Никакая рекурсия здесь не нужна совсем.
Снова ты делаешь гору листочков. Опять же печать заново начнется.

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


Evil Skynet
****


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

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



Цитата(Snowy @ 16.12.2005, 10:04)
Ну не нужно этого делать. Никакая рекурсия здесь не нужна совсем.
Снова ты делаешь гору листочков. Опять же печать заново начнется.


не совсем, новая печать начнётся не с новой строки, а с той на которой остановились:
Цитата
...
          else                                                                    // если координаты вышли за пределы листа   
            PrintGrid(StringGrid1, 'Print Stringgrid',col); 
...


я задал как входной параметр переменную номер строчки с которой надо начинать печать и использую цикл не for, т.к. в нем нельзя изменять параметр i, а while... единственное в чём я сомневаюсь... это в окончании печати, вернее можно ли начинать новую печать не закончив старую... если можно, то этот код должен прокатить... если нет, то тогда придётся переписывать так, сначала вычисляем количество строк умещяющихся на листе, щитаем количество листов, открываем цыкл по количеству листов, потом код функции, только без рекурсии...


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


Шустрый
*


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

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



Добрый вечер.
Попробывал код, но теперь D7 ругается на Hight в строке
if Printer.Canvas.Hight>Y2 then
пишет, что : Undeclared identifier: 'Hight', во как, а как подправить? smile
PM MAIL   Вверх
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   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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