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

Вниз

Печать TStringGrid в виде таблицы   Найти похожие ветки 

 
tv   (2003-05-29 12:06) [0]

Поскажите возможно ли это. Если да, то каким образом.
Заранее благодарен.


 
xfrost   (2003-05-29 13:00) [1]

Печатай через Word это самое простое . Создай табличку аналогичную Grid у и печатай . Это можно сделать даже без визуального запуска Word - а . Если заинтерисовало - подробности мылом...


 
Song   (2003-05-29 13:26) [2]

Нарисуй эту табличку на канве притера.


 
tv   (2003-05-29 13:42) [3]

на канве принтера напрямую не получается, потому что она видима только процентов на 30. видимая часть выводится, а невидимая - нет плюс некоторые колонки имеют текст, который выходит за их границы и получается невидим.

насчет Ворда или Екселя - нужно, чтобы прога была независима. а так если на системе не стоит офис, то как дальше быть?

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

пробовал так - создавал хтмл-строку с таблицей. Загружал ее в веббраузер. печатал. но постала проблема - как выбрать ориентацию бумаги и принтер из моей проги. просто на печать выводятся и другие данные в виде рисунков, а их я масштабируя вывожу на канву принтера. а рисунки хтмл-строку не загониш - их нужно сохранять сначала на диске.


 
Polevi   (2003-05-29 13:45) [4]

2tv © (29.05.03 13:42)
тебе изсветно:
колве колонок грида
ширина этих колонок
высота этих колонок
их заголовок
кол-во записей в датасете
данные этого датасета

чего тебе еще ?


 
tv   (2003-05-29 13:52) [5]

высота колонок грида одинаковая. но есть строки, которые не входят в ячеку им выделенную. таблицу я нарисую на канве, но как вывести текст двумя, а то и более строками на канву.


 
Anatoly Podgoretsky   (2003-05-29 13:53) [6]

Два послених лишнее, их просто нет. А для рисования есть все данные.


 
Anatoly Podgoretsky   (2003-05-29 13:55) [7]

TCancas + F1, там столько методов, что хватит на все случаи жищни, а если не получается работать с канвой, то с Дельфи поставляются генераторы отчетов.


 
reonid   (2003-05-29 14:48) [8]

Пример, как пользоваться канвой принтера:


unit GrdPrn;

interface

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

const
OrdinaryLineWidth: Integer = 2;
BoldLineWidth: Integer = 4;

procedure PrintStringGrid(Grid: TStringGrid; Scale: Double; LeftMargin, TopMargin, BottomMargin: Integer);

function DrawStringGridEx(Grid: TStringGrid; Scale: Double; FromRow, LeftMargin, TopMargin,
Yfloor: Integer; DestCanvas: TCanvas): Integer;
// возвращает номер строки, которая не поместилась до Y = Yfloor

// не проверяет, вылезает ли общая длина таблицы за пределы страницы
// Слишком длинное слово обрежется - перенос только по словам

implementation

procedure PrintStringGrid(Grid: TStringGrid; Scale: Double; LeftMargin, TopMargin, BottomMargin: Integer);
var NextRow: Integer;
begin
//Printer.BeginDoc; //

if not Printer.Printing then raise Exception.Create("function PrintStringGrid must be called between Printer.BeginDoc and Printer.EndDoc");

NextRow := 0;
repeat
NextRow := DrawStringGridEx(Grid, Scale, NextRow, LeftMargin, TopMargin,
Printer.PageHeight - BottomMargin, Printer.Canvas);
if NextRow <> -1 then Printer.NewPage;
until NextRow = -1;

//Printer.EndDoc;
end;

function DrawStringGridEx(Grid: TStringGrid; Scale: Double; FromRow, LeftMargin, TopMargin,
Yfloor: Integer; DestCanvas: TCanvas): Integer;
// возвращает номер строки, которая не поместилась до Y = Yfloor
const
// Выравнивание по правому краю
//DT_Flags = DT_LEFT or DT_TOP or DT_WORDBREAK or DT_NOPREFIX;

// Выравнивание по центру
DT_Flags = DT_CENTER or DT_TOP or DT_WORDBREAK or DT_NOPREFIX;
var
i, j, d, TotalPrevH, TotalPrevW, CellH, CellW, LineWidth: Integer;
R: TRect;
s: string;


procedure CorrectCellHeight(ARow: Integer);
// вычисление правильной высоты ячейки с учетом многострочного текста
// Текст рабивается только по словам слишком длинное слово обрубается
var
i, H: Integer;
R: TRect;
s: string;
begin
R := Rect(0, 0, CellH*2, CellH);
s := ":)"; // Одинарная высота строки
CellH := DrawText(DestCanvas.Handle, PChar(s), Length(s), R,
DT_Flags or DT_SINGLELINE or DT_CALCRECT) + 3*d;
for i := 0 to Grid.ColCount-1 do
begin
CellW := Round(Grid.ColWidths[i]*Scale);
R := Rect(0, 0, CellW, CellH);
//InflateRect(R, -d, -d);
R.Left := R.Left+d;
R.Top := R.Top + d;


s := Grid.Cells[i, ARow];
H := DrawText(DestCanvas.Handle, PChar(s), Length(s), R,
DT_Flags or DT_CALCRECT); // Вычисление ширины и высоты текста
if CellH < H + 2*d then CellH := H + 2*d;
// if CellW < R.Right - R.Left then Слишком длинное слово - не помещается в одну строку;
// Перенос слов не поддерживается
end;
end;

begin
Result := -1; // все строки уместились между TopMargin и Yfloor
if (FromRow < 0)or(FromRow >= Grid.RowCount) then Exit;

DestCanvas.Brush.Style := bsClear;
DestCanvas.Font := Grid.Font;
// DestCanvas.Font.Height := Round(Grid.Font.Height*Scale);
DestCanvas.Font.Size := 10;

Grid.Canvas.Font := Grid.Font;
Scale := DestCanvas.TextWidth("test")/Grid.Canvas.TextWidth("test");

d := Round(2*Scale);
TotalPrevH := 0;

for j := 0 to Grid.RowCount-1 do
begin
if (j >= Grid.FixedRows) and (j < FromRow) then Continue;
// Fixed Rows рисуются на каждой странице

TotalPrevW := 0;
CellH := Round(Grid.RowHeights[j]*Scale);
CorrectCellHeight(j);

if TopMargin + TotalPrevH + CellH > YFloor then
begin
Result := j; // j-я строка не помещается в заданный диапазон
if Result < Grid.FixedRows then Result := -1;
// если фиксированные строки не влезают на страницу - это тяжёлый случай...
Exit;
end;

for i := 0 to Grid.ColCount-1 do
begin
CellW := Round(Grid.ColWidths[i]*Scale);

R := Rect(TotalPrevW, TotalPrevH, TotalPrevW + CellW, TotalPrevH + CellH);
OffSetRect(R, LeftMargin, TopMargin);

if (i < Grid.FixedCols)or(j < Grid.FixedRows) then LineWidth := BoldLineWidth
else LineWidth := OrdinaryLineWidth;

DestCanvas.Pen.Width := LineWidth;
if LineWidth > 0 then
DestCanvas.Rectangle(R.Left, R.Top, R.Right+1, R.Bottom+1);

//InflateRect(R, -d, -d);
R.Left := R.Left+d;
R.Top := R.Top + d;

s := Grid.Cells[i, j];
DrawText(DestCanvas.Handle, PChar(s), Length(s), R,
DT_Flags);

TotalPrevW := TotalPrevW + CellW; // Общая ширина всех предыдущих колонок
end;

TotalPrevH := TotalPrevH + CellH; // Общая высота всех предыдущих строк
end;
end;

end.




 
Song   (2003-05-29 15:54) [9]

>>на канве принтера напрямую не получается, потому что она видима только процентов на 30. видимая часть выводится, а невидимая - нет плюс некоторые колонки имеют текст, который выходит за их границы и получается невидим.

ИМЕЛОСЬ ввиду распечатать не через PaintTo() как ты подумал, а ручками: линии отдельно, ячеечки отдельно, текстик отдельно, вообще немного головой подумать..


 
tv   (2003-05-29 16:01) [10]

2 Song © (29.05.03 15:54)
так и делаю

2 reonid © (29.05.03 14:48)
Огромное СПАСИБО



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

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

Наверх





Память: 0.48 MB
Время: 0.008 c
1-26454
k-sergey
2003-05-29 12:22
2003.06.09
Удалить саму себя...


1-26440
Rocker
2003-05-29 09:27
2003.06.09
создать html файл


8-26610
Сашок
2003-02-25 15:19
2003.06.09
Фон в TextOut


14-26659
vidiv
2003-05-24 03:01
2003.06.09
Посоветуйте HTTP Прокси(Кеш), и Почтовый сервер


1-26546
borg
2003-05-28 09:32
2003.06.09
Edit + степень





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