Недавно довелось использовать код из "DRKB", для печати stringGrid, однако он не выводит на печать (у меня не вывел) 0-й столбец.
Я Переделал его, добавив прорисовку ячеек таблицы, более удобное расположение заголовка таблицы, в качестве параметров процедуре можно передать отступ от края и сверху листа в миллиметрах. Также снабдил код комментариями. (я сам новичёк в программировании, и будь в том коде комменты, разобрался бы куда легче чем пришлось).
Надеюсь кому нибудь пригодится...
Code:
procedure PrintGrid(sGrid: TStringGrid;
left_StandOff,top_StandOff:integer; sTitle: string);
var
X1, X2,PixelsX,PrinterCoordX: Integer;
Y1, Y2,PixelsY,PrinterCoordY: Integer;
I: Integer;
F: Integer;
TR: TRect;
begin
{ left_StandOff - отступ в миллиметрах слева от края листа
top_StandOff - отступ в миллиметрах сверху от края листа
PrinterCoordX и PrinterCoordY - тот же отступ только в пикселах
Высота строк и ширина столбцов взяты соответственно 150 и 400,
при желании их размер можно передать в процедуру как параметры
}
//получаем информацию о разрешении принтера
PixelsX:=GetDeviceCaps(printer.Handle,LogPixelsX);//разрешение по Х
PixelsY:=GetDeviceCaps(printer.Handle,LogPixelsY);//разрешение по Y
PrinterCoordX:=round(PixelsX/25.4*left_StandOff);//переводим мм в пиксели
PrinterCoordY:=round(PixelsY/25.4*top_StandOff); //---
with printer do
begin
//Печатаем заголовок таблицы
Title := sTitle;
BeginDoc; // Начало печати
Canvas.Pen.Color := 0; // цвет-чёрный
Canvas.Font.Name := 'verdana'; // шрифт
Canvas.Font.Size := 10; // размер шрифта
Canvas.Font.Style := [];
//Текс заголовка в заданных координатах
Canvas.TextOut(PrinterCoordX, PrinterCoordY-100-
printer.Canvas.Font.Size*10, Printer.Title);
Canvas.Pen.Color := 0;
Canvas.Font.Name := 'Verdana';
Canvas.Font.Size := 8;
end;
for i:=0 to sgrid.colcount-1 do //перебираем столбцы
for f:=0 to sgrid.rowcount-1 do //перебираем в столбце все строки
begin
X1 := PrinterCoordX+i*400; //400-это ширина столбца
X2 := PrinterCoordX+400+i*400; //тоже
Y1:=PrinterCoordY+f*150; //150-высота строки
y2:=PrinterCoordY+150+f*150; //тоже
TR:=Rect(x1,y1,x2,y2);
with printer do
begin
Canvas.MoveTo(x1,y1);//Двигаем рисовалку в верхний левый угол таблицы
{пишем надпись в квадрате(ячейке) i-столбеца и f-строки со сдвигом
от верха на Y+50 и со сдвигом от левого края колонки на X+50
}
Canvas.TextRect(TR, X1 + 50, Y1 + 50, sGrid.Cells[i,f]);
//рисуем линии ячейки
Canvas.LineTo(x1,y2);
Canvas.LineTo(x2,y2);
Canvas.LineTo(x2,y1);
Canvas.LineTo(x1,y1);
end;
end;
Printer.EndDoc; // конец печати
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
PrintGrid(StringGrid1,20,20, 'Таблица1: "Название"');
end;
Вы рефакторировали исходный код для печати TStringGrid с улучшенным расположением, включая печать ячеек и заголовков. Вы также добавили комментарии, чтобы объяснить, что каждый раздел кода делает.
Вот разбивка изменений:
Улучшенное размещение заголовков: вы переместили текст заголовков в верхний левый угол страницы с помощью метода TextOut.
Печать ячеек: вы добавили код для печати каждой ячейки, используя метод TextRect для отображения текста внутри прямоугольника, определенного координатами grid.
Нарисование рамок вокруг ячеек: вы добавили код для рисования рамок вокруг каждой ячейки с помощью метода LineTo.
Параметры отступов: вы ввели два параметра - left_StandOff и top_StandOff, которые контролируют смещение от края страницы, где начинается печать.
В отношении оригинальной проблемы, кажется, что 0-я колонка (первая колонка) не печаталась в исходном коде. Вамерфакторированный код должен исправить этоissue, включив все колонки в процесс печати.
В целом, ваши изменения сделали код более читаемым и поддерживаемым. Хорошая работа!
Один минимальный совет: рассмотрите добавление блока try-except, чтобы обработать любые потенциальные исключения, которые могут возникнуть при печати, такие как ошибки принтера или ситуации недостатка памяти. Это может помочь обеспечить, что ваш программ будет оставаться устойчивой в случае неожиданных проблем.
Вот пример, как можно добавить блок try-except:
procedurePrintGrid(sGrid:TStringGrid;left_StandOff,top_StandOff:integer;sTitle:string);var...begintry// Код печати здесь...exceptonE:ExceptiondoShowMessage('Ошибка печати grid: '+E.Message);end;end;
Таким образом, если исключение возникнет при печати, ваш программ будет отображать сообщение об ошибке с деталями ошибки вместо краша.
Код на Delphi для печати TStringGrid с параметрами отступа от края и сверху листа в миллиметрах, а также прорисовкой ячеек таблицы и комментариями.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.