# Native Code > برنامه نویسی در Delphi > ابزارهای گزارش سازی در دلفی >  مشکل در چاپ stringgrid بر روی پرینتر

## dana74

سلام. من خواستم از کد زیر برای چاپ محتوای 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

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

----------


## dana74

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


من میخوام اینکار را به آسانی انجام دهم و درگیر دیتابیس و این حرفها نشم وگرنه اگر منظور شما این باشد که از ابزارهای گزارشگیری (مثل fastreport) استفاده کنم، خودم بلدم .

----------


## SYNDROME

> من میخوام اینکار را به آسانی انجام دهم و درگیر دیتابیس و این حرفها نشم وگرنه اگر منظور شما این باشد که از ابزارهای گزارشگیری (مثل fastreport) استفاده کنم، خودم بلدم .


من در بالا گفتم که با ClientDataSet می توانید کار کنید و نیازی هم به DataBase ندارید.
فکر کنم ریختن اطلاعات داخل ClientDataSet و استفاده از QuieckReport خیلی راحتر از استفاده از روش فوق باشد.
*در ضمن این فقط یک پیشنهاد بود.
موفق باشید

----------


## mohammad_kerman65

سلام چطور میشه با fastreport یک جدولی که به پایگاه داده وصل نیس رو چاپ کرد؟؟مثل stringGrid یا ColumnGrid
با تشکر

----------


## samani

اگر دموهاي Fastreport رو نگاه كني هستش

----------


## mohammad_kerman65

اگر توی جدولم فقط عدد باش مشکلی پیش نمیاد ولی اگه یک متن باش پیغام خطا میده!!!!! 
مگه همه رو به عنوان string نمیشناسه؟چرا خطا میگیره؟؟؟
جدول من هم متن داخلش هست هم عدد.اگه میشه راهنمائیم کنید
با تشکر

----------


## mohammad_kerman65

یعنی کسی نمیدونه؟؟؟
براساس دمو کار کردم و این دستور رو نوشتم
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

سلام قبلا سوالی پرسیده میشد حداکثر 24 ساعت بعدش نظری در موردش داده میشد.اما حالا!!!!!!
شاید اساتید رفته اند خانه تکانی وقت نمیکنند...

----------


## samani

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



> سلام قبلا سوالی پرسیده میشد حداکثر 24 ساعت بعدش نظری در موردش داده میشد


به قول خودتون نظر ، ولي بعضي ها انتظار دارند براشون وقت گذاشته بشه و برنامه هم كامل نوشته بشه به نظر من خود عزيزان هم بايد تلاش كنند و خودشون ماهي بگيرند

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

----------

