üzerinde 4 grid olan bir formu yazdırma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

üzerinde 4 grid olan bir formu yazdırma

Mesaj gönderen ikutluay »

merhaba

formu önce print metodu ile yazdırdım ancak 4 te 3 ü boş çıkıyordu. aramalarım sonucu bir kod buldum ama bundada büyük çözünürlük olan ekranlarda çıktı byutu inanılmaz büyüyor ve kağıda sığmıyor.

4 gridde sql den çekilen sorgular listelenmekte.

işin özü bu listelemeleri tek bir componentte yapmak mümkünmü ... (4 listview ile yapmayı düşündüm ama pratikte bir fark olacak gibi değil)

2. yazdırma için daha başka bir yol varmıdır ....

formu clipboarda atıp oradan yazdırmayı düşündüm ama bu seferde resim olarak göreceğinden çıktıda boyulmalar olabilir diye düşünüyorum.


saygılar.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: üzerinde 4 grid olan bir formu yazdırma

Mesaj gönderen Battosai »

merhaba, bu işi raporlama bileşeni ile yapsanız daha kolay olmaz mı ? Böylece yazdırma işi ile siz uğraşmış olmazsınız.
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: üzerinde 4 grid olan bir formu yazdırma

Mesaj gönderen ikutluay »

mümkün olsa neden istemeyeyim. ama 4 ayrı sorgu 4 ayrı grid. bir fikriniz varmı nasıl yapabiliriz ?
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: üzerinde 4 grid olan bir formu yazdırma

Mesaj gönderen thelvaci »

Neden raporlama bileşenleri ile yapamadığınızı yada yapmak istemediğinizi anlayamadım ama, madem dataset'ler üzerinden raporlama bileşenleri ile gitmek istemiyorsunuz bu durumda; Printer.BeginDoc/Printer.EndDoc ile kendiniz yazdırabilirsiniz. Formu print ile yazdırdım bazı noktalarda boşluklar oluyordu diyorsunuz ardından da grafiksel olarak yazıdırmak istemiyorum diyorsunuz, inanın onu da anlamadım. Formu yazdırdı iseniz o zaten grafiksel olarak yazılmıştır. Sizin için grafiksel olarak yazdırmak bir sorun teşkil etmiyor ise her bir gridi birer bitmap'in içine yazdırabilir ardından istediğiniz gibi ölçekleyebilir(StretchBlt vb) ardından da yazdırabilirsiniz.

İşinize yarama ihtimali olan metod;

Kod: Tümünü seç

TWinControl.PaintTo(DC: HDC; X, Y: Integer);
olabilir.
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: üzerinde 4 grid olan bir formu yazdırma

Mesaj gönderen ikutluay »

ekranda ölçüleri farklı 4 gridim var. 4ü birbirinden ayrı datasetler. bunu tek sayfadaki bir raorda çıktıl almak hiç yapmadığım bir konu.

normal form1. print komutu ile büyük kısmı boş çıkıyor sayfanın.

bulduğum kod ile yazdırmada büyük küçük davası oluyor.

print scrren ile alıp yazıdırnca yazıların netlliği diğeri gibi olmuyor.

bizde sizin dediğinizi deneyelim.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: üzerinde 4 grid olan bir formu yazdırma

Mesaj gönderen ikra »

raporun columns özelligini kullan ve her bir column da ayri dataset'i yazdir.
kıdemsiz üye
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: üzerinde 4 grid olan bir formu yazdırma

Mesaj gönderen Lost Soul »

ikutluay yazdı: normal form1. print komutu ile büyük kısmı boş çıkıyor sayfanın.
Form1.Printte büyük boşluk çıkması muhtemelen sizin formu ekrana yaymanız ve ekranın çözünürlüğünün de yüksek olması olabilir. Eğer öyle ise yazdırma esnasında formu yeniden boyutlandırmak gibi birşey olabilir.
Aklıma delphide ilk defa çıktı almaya çalışıp da çözüm olarak form1.print ediğim günler geldi :) hey gidi hey.

Ek olarak sql sorgusu ise bunları joinliyerek tek bir gride çekebilirsiniz. Aralarında bir ilişki yok ise
mysql için row_number firebird için de bir ara bana lazım olan şu soruya ve cevabına bakabilirsiniz
ikutluay yazdı: ekranda ölçüleri farklı 4 gridim var. 4ü birbirinden ayrı datasetler. bunu tek sayfadaki bir raorda çıktıl almak hiç yapmadığım bir konu.
Raporlama atla deve bişey değil. Bir kaç küçük deneme ile eminim şu soruya beklediğiniz cevap için geçen süreden daha kısa bir zamanda güzel bir çalışma yapabileceksiniz (gridelerin sayısı önemli değil)

forumda fastreport, ravereport ve cyristalreport kullanımları için örnekler ve makaleler var.
kolay gelsin.

örneğin (denemedim ama) fastreportta kayıt sayısını datasete bağlamak yerine ilgiliband.RowNumber := (4 tablodan en çok kayıt sayısına sahip olan kayıt sayısı) diyip 4 tablonun kayıtlarını tek bantta gösterebilirsiniz.
ya da sayfayı 4 sütuna bölebilirsiniz. vesaie vesaire.

Bu cevapları yazarken biraz çekinerek yazdım zira (eğer hesabı başkasından devralmadıysanız) ikutluay olaraktan hem forumun eski bir üyesisisiniz hem de ikibinküsür mesajınız var ve Yazmış olduğum Bu tip cevaplar delphiyi bir kaç haftadır kullanan birisine verilecek türden cevaplar. Ya da aslında soruyu ben hâla anlayabilmiş değilim ;)
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Re: üzerinde 4 grid olan bir formu yazdırma

Mesaj gönderen ikutluay »

form print metodunda boşluklar olması genel bir sorunmuş. karşılaşan çok kişiye rastladım.

öte yandan çekinecek birşey yok. İnsanız ve şaşarız. Benim kullandığım raporlar genelde düz mantık raporlardı. Haliyle insan çözmek zorunda olmadığı bir kayaya rastladığında kırmak için yardım gerekebiliyor.

Benim formu yazdırmak için kullandığım kod burada ama bir yerinde mantıksal bir sorun var.

Kod: Tümünü seç

  
  ScaleX := Self.Width*5;
  ScaleY := Self.Height*5;
Kısmında ekran çözünürlüğü büyükse çıktı devasa oluyor. Kontrol edilebilir elbette ama bu seferde ızgaraları kullanıcının genişletmeyeceği belli değil. En sağlamı arkadaşların önerdiği gibi rapor olacak.

Kod: Tümünü seç

procedure TFrmCiro.BitBtn2Click(Sender: TObject);
var

  abc:tcolor;
  DC: HDC;
  isDcPalDevice: Bool;
  MemDC: HDC;
  MemBitmap: HBITMAP;
  OldMemBitmap: HBITMAP;
  hDibHeader: THandle;
  pDibHeader: Pointer;
  hBits: THandle;
  pBits: Pointer;
  ScaleX: Double;
  ScaleY: Double;
  pPal: PLOGPALETTE;
  pal: HPALETTE;
  OldPal: HPALETTE;
  i: Integer;
begin

  abc:=FrmCiro.Color;
  PnlFilterRecs.Visible:=false;
  FrmCiro.Color:=clWhite;
  clbrMn.Visible:=false;
  BitBtn2.Visible:=False;
//****
  {Get the screen dc}
  DC := GetDC(0);
  {Create a compatible dc}
  MemDC := CreateCompatibleDC(DC);
  {create a bitmap}
  MemBitmap := CreateCompatibleBitmap(DC, Self.Width, Self.Height);
  {select the bitmap into the dc}
  OldMemBitmap := SelectObject(MemDC, MemBitmap);

  {Lets prepare to try a fixup for broken video drivers}
  isDcPalDevice := False;
  if GetDeviceCaps(DC, RASTERCAPS) and RC_PALETTE=RC_PALETTE then
  begin
    GetMem(pPal, SizeOf(TLOGPALETTE)+(255*SizeOf(TPALETTEENTRY)));
    FillChar(pPal^, SizeOf(TLOGPALETTE)+(255*SizeOf(TPALETTEENTRY)),
             #0);
    pPal^.palVersion := $300;
    pPal^.palNumEntries := GetSystemPaletteEntries(DC, 0, 256, pPal^.palPalEntry);
    if pPal^.palNumEntries<>0 then
    begin
      pal := CreatePalette(pPal^);
      OldPal := SelectPalette(MemDC, pal, False);
      isDcPalDevice := True
    end
    else
      FreeMem(pPal, SizeOf(TLOGPALETTE)+(255*SizeOf(TPALETTEENTRY)));
  end;
  {copy from the screen to the memdc/bitmap}
  BitBlt(MemDC, 0, 0, Self.Width, Self.Height, DC, Self.Left, Self.Top, SRCCOPY);

  if isDcPalDevice=True then
  begin
    SelectPalette(MemDC, OldPal, False);
    DeleteObject(pal);
  end;
  {unselect the bitmap}
  SelectObject(MemDC, OldMemBitmap);
  {delete the memory dc}
  DeleteDC(MemDC);
  {Allocate memory for a DIB structure}
  hDibHeader := GlobalAlloc(GHND, SizeOf(TBITMAPINFO)+(SizeOf(TRGBQUAD)*
                            256));
  {get a pointer to the alloced memory}
  pDibHeader := GlobalLock(hDibHeader);

  {fill in the dib structure with info on the way we want the DIB}
  FillChar(pDibHeader^, SizeOf(TBITMAPINFO)+(SizeOf(TRGBQUAD)*
           256), #0);
  PBITMAPINFOHEADER(pDibHeader)^.biSize := SizeOf(TBITMAPINFOHEADER);
  PBITMAPINFOHEADER(pDibHeader)^.biPlanes := 1;
  PBITMAPINFOHEADER(pDibHeader)^.biBitCount := 8;
  PBITMAPINFOHEADER(pDibHeader)^.biWidth := Self.Width;
  PBITMAPINFOHEADER(pDibHeader)^.biHeight := Self.Height;
  PBITMAPINFOHEADER(pDibHeader)^.biCompression := BI_RGB;

  {find out how much memory for the bits}
  GetDIBits(DC, MemBitmap, 0, Self.Height, nil, TBITMAPINFO(pDibHeader^),
            DIB_RGB_COLORS);

  {Alloc memory for the bits}
  hBits := GlobalAlloc(GHND, PBITMAPINFOHEADER(pDibHeader)^.BiSizeImage);

  {Get a pointer to the bits}
  pBits := GlobalLock(hBits);

  {Call fn again, but this time give us the bits!}
  GetDIBits(DC, MemBitmap, 0, Self.Height, pBits, PBitmapInfo(pDibHeader)^,
            DIB_RGB_COLORS);

  {Lets try a fixup for broken video drivers}
  if isDcPalDevice=True then
  begin
    for i := 0 to (pPal^.palNumEntries-1) do
    begin
      PBitmapInfo(pDibHeader)^.bmiColors[i].rgbRed := pPal^.palPalEntry[i].peRed;
      PBitmapInfo(pDibHeader)^.bmiColors[i].rgbGreen := pPal^.palPalEntry[i].peGreen;
      PBitmapInfo(pDibHeader)^.bmiColors[i].rgbBlue := pPal^.palPalEntry[i].peBlue;
    end;
    FreeMem(pPal, SizeOf(TLOGPALETTE)+(255*SizeOf(TPALETTEENTRY)));
  end;
  {Release the screen dc}
  ReleaseDC(0, DC);
  {Delete the bitmap}
  DeleteObject(MemBitmap);

  {Start print job}
  Printer.Orientation:=poLandscape;
  Printer.BeginDoc;

  {Scale print size }
  ScaleX := Self.Width*5;
  ScaleY := Self.Height*5;



  if Printer.PageWidth < Printer.PageHeight then
  begin
    ScaleX := Printer.PageWidth;
    ScaleY := Self.Height*(Printer.PageWidth/Self.Width);
  end
  else
  begin
    ScaleX := Self.Width*(Printer.PageHeight/Self.Height);
    ScaleY := Printer.PageHeight;
  end;


  {Just incase the printer drver is a palette device}
  isDcPalDevice := False;
  if GetDeviceCaps(Printer.Canvas.Handle, RASTERCAPS) and RC_PALETTE=RC_PALETTE
                   then
  begin
    {Create palette from dib}
    GetMem(pPal, SizeOf(TLOGPALETTE)+(255*SizeOf(TPALETTEENTRY)));
    FillChar(pPal^, SizeOf(TLOGPALETTE)+(255*SizeOf(TPALETTEENTRY)),
             #0);
    pPal^.palVersion := $300;
    pPal^.palNumEntries := 256;
    for i := 0 to (pPal^.palNumEntries-1) do
    begin
      pPal^.palPalEntry[i].peRed := PBitmapInfo(pDibHeader)^.bmiColors[i].rgbRed;
      pPal^.palPalEntry[i].peGreen := PBitmapInfo(pDibHeader)^.bmiColors[i].rgbGreen;
      pPal^.palPalEntry[i].peBlue := PBitmapInfo(pDibHeader)^.bmiColors[i].rgbBlue;
    end;
    pal := CreatePalette(pPal^);
    FreeMem(pPal, SizeOf(TLOGPALETTE)+(255*SizeOf(TPALETTEENTRY)));
    OldPal := SelectPalette(Printer.Canvas.Handle, pal, False);
    isDcPalDevice := True
  end;
  {send the bits to the printer}
  StretchDiBits(Printer.Canvas.Handle, 0, 0, Round(ScaleX), Round(ScaleY),
                0, 0, Self.Width, Self.Height, pBits, PBitmapInfo(pDibHeader)^,
                DIB_RGB_COLORS, SRCCOPY);

  {Just incase you printer drver is a palette device}
  if isDcPalDevice=True then
  begin
    SelectPalette(Printer.Canvas.Handle, OldPal, False);
    DeleteObject(pal);
  end;
  {Clean up allocated memory}
  GlobalUnlock(hBits);
  GlobalFree(hBits);
  GlobalUnlock(hDibHeader);
  GlobalFree(hDibHeader);

  {end the print job}
  Printer.EndDoc;
//**
 end;
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Cevapla