PDA

View Full Version : مشکل در چاپ stringgrid بر روی پرینتر



dana74
چهارشنبه 21 فروردین 1387, 15:42 عصر
سلام. من خواستم از کد زیر برای چاپ محتوای stringgrid بر روی پرینتر استفاده کنم اما با یک مشکل برخوردم. BiDiMode مربوط به stringgrid من bdRightToLeft است ولی نتیجه چاپ این موضوع را رعایت نمی کند! چطور میتونم این مشکل را حل کنم؟
پیشاپیش متشکرم!


uses
printers;

//StringGrid Inhalt ausdrucken
procedure PrintStringGrid(Grid: TStringGrid; Title: string;
Orientation: TPrinterOrientation);
var
P, I, J, YPos, XPos, HorzSize, VertSize: Integer;
AnzSeiten, Seite, Zeilen, HeaderSize, FooterSize, ZeilenSize, FontHeight: Integer;
mmx, mmy: Extended;
Footer: string;
begin
//Kopfzeile, Fu?zeile, Zeilenabstand, Schriftgr??e festlegen
HeaderSize := 100;
FooterSize := 200;
ZeilenSize := 36;
FontHeight := 36;
//Printer initializieren
Printer.Orientation := Orientation;
Printer.Title := Title;
Printer.BeginDoc;
//Druck auf mm einstellen
mmx := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH) /
GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX) * 25.4;
mmy := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALHEIGHT) /
GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) * 25.4;

VertSize := Trunc(mmy) * 10;
HorzSize := Trunc(mmx) * 10;
SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC);

//Zeilenanzahl festlegen
Zeilen := (VertSize - HeaderSize - FooterSize) div ZeilenSize;
//Seitenanzahl ermitteln
if Grid.RowCount mod Zeilen <> 0 then
AnzSeiten := Grid.RowCount div Zeilen + 1
else
AnzSeiten := Grid.RowCount div Zeilen;

Seite := 1;
//Grid Drucken
for P := 1 to AnzSeiten do
begin
//Kopfzeile
Printer.Canvas.Font.Height := 48;
Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Title) div 2)),
- 20,Title);
Printer.Canvas.Pen.Width := 5;
Printer.Canvas.MoveTo(0, - HeaderSize);
Printer.Canvas.LineTo(HorzSize, - HeaderSize);
//Fu?zeile
Printer.Canvas.MoveTo(0, - VertSize + FooterSize);
Printer.Canvas.LineTo(HorzSize, - VertSize + FooterSize);
Printer.Canvas.Font.Height := 36;
Footer := 'Seite: ' + IntToStr(Seite) + ' von ' + IntToStr(AnzSeiten);
Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Footer) div 2)),
- VertSize + 150,Footer);
//Zeilen drucken
Printer.Canvas.Font.Height := FontHeight;
YPos := HeaderSize + 10;
for I := 1 to Zeilen do
begin
if Grid.RowCount >= I + (Seite - 1) * Zeilen then
begin
XPos := 0;
for J := 0 to Grid.ColCount - 1 do
begin
Printer.Canvas.TextOut(XPos, - YPos,
Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);
XPos := XPos + Grid.ColWidths[J] * 3;
end;
YPos := YPos + ZeilenSize;
end;
end;
//Seite hinzufügen
Inc(Seite);
if Seite <= AnzSeiten then Printer.NewPage;
end;
Printer.EndDoc;
end;

//Example
procedure TForm1.Button1Click(Sender: TObject);
begin
//Drucken im Querformat
PrintStringGrid(Grid, 'StringGrid Print Landscape', poLandscape);
//Drucken im Hochformat
PrintStringGrid(Grid, 'StringGrid Print Portrait', poPortrait);
end;

SYNDROME
چهارشنبه 21 فروردین 1387, 16:58 عصر
یک پیشنهاد:
اطلاعات خود را داخل یک ADO یا ClientDataSet و . . . بریزید و در این این صورت به راحتی می توانید اطلاعات را چاپ کنید.
کار تا حد خیلی زیادی راحت می شود و نیاز به کد نویسی چندانی هم ندارد.
موفق باشید

dana74
چهارشنبه 21 فروردین 1387, 18:30 عصر
یک پیشنهاد:
اطلاعات خود را داخل یک ADO یا ClientDataSet و . . . بریزید و در این این صورت به راحتی می توانید اطلاعات را چاپ کنید.
کار تا حد خیلی زیادی راحت می شود و نیاز به کد نویسی چندانی هم ندارد.
موفق باشید
من میخوام اینکار را به آسانی انجام دهم و درگیر دیتابیس و این حرفها نشم وگرنه اگر منظور شما این باشد که از ابزارهای گزارشگیری (مثل fastreport) استفاده کنم، خودم بلدم .

SYNDROME
پنج شنبه 22 فروردین 1387, 07:40 صبح
من میخوام اینکار را به آسانی انجام دهم و درگیر دیتابیس و این حرفها نشم وگرنه اگر منظور شما این باشد که از ابزارهای گزارشگیری (مثل fastreport) استفاده کنم، خودم بلدم .
من در بالا گفتم که با ClientDataSet می توانید کار کنید و نیازی هم به DataBase ندارید.
فکر کنم ریختن اطلاعات داخل ClientDataSet و استفاده از QuieckReport خیلی راحتر از استفاده از روش فوق باشد.
*در ضمن این فقط یک پیشنهاد بود.
موفق باشید

mohammad_kerman65
سه شنبه 01 اسفند 1391, 09:28 صبح
سلام چطور میشه با fastreport یک جدولی که به پایگاه داده وصل نیس رو چاپ کرد؟؟مثل stringGrid یا ColumnGrid
با تشکر

samani
سه شنبه 01 اسفند 1391, 09:55 صبح
اگر دموهاي Fastreport رو نگاه كني هستش

mohammad_kerman65
چهارشنبه 02 اسفند 1391, 08:45 صبح
اگر توی جدولم فقط عدد باش مشکلی پیش نمیاد ولی اگه یک متن باش پیغام خطا میده!!!!!
مگه همه رو به عنوان string نمیشناسه؟چرا خطا میگیره؟؟؟
جدول من هم متن داخلش هست هم عدد.اگه میشه راهنمائیم کنید
با تشکر

mohammad_kerman65
پنج شنبه 03 اسفند 1391, 08:53 صبح
یعنی کسی نمیدونه؟؟؟
براساس دمو کار کردم و این دستور رو نوشتم
procedure TForm1.frxReport1BeforePrint(c: TfrxReportComponent);
var
Cross: TfrxCrossView;
i, j: Integer;
begin
if c is TfrxCrossView then
begin
Cross := TfrxCrossView(c);
for i := 1 to 5 do
for j := 1 to 3 do
Cross.AddValue([i], [j], [AdvColumnGrid1.Cells[i - 1, j - 1]]);
end;
end;
اگر تمام خانه های جدولم عدد باش مشکلی پیش نمیاد ولی اگر عدد اعشاری باش یا متن، خطا میگیره!!!
لطفا راهنمائی کنید

mohammad_kerman65
شنبه 05 اسفند 1391, 09:04 صبح
سلام قبلا سوالی پرسیده میشد حداکثر 24 ساعت بعدش نظری در موردش داده میشد.اما حالا!!!!!!
شاید اساتید رفته اند خانه تکانی وقت نمیکنند...

samani
شنبه 05 اسفند 1391, 09:39 صبح
سلام
اگر شما كمي دقت كنيد از خطايي كه بهتون نشون ميده بايد بفهميد كه مشكل كار كجاست

سلام قبلا سوالی پرسیده میشد حداکثر 24 ساعت بعدش نظری در موردش داده میشد
به قول خودتون نظر ، ولي بعضي ها انتظار دارند براشون وقت گذاشته بشه و برنامه هم كامل نوشته بشه به نظر من خود عزيزان هم بايد تلاش كنند و خودشون ماهي بگيرند

و اما مشكل شما:
توي طراحي گزارش اگه بري و روي Cross دبل كليك كني ميبيني روي سلول جمع خورده و خب جمع كه روي رشته خطا ميده
موفق باشي