Jump to content
GSForum - Segélyvonal

Print és Savedialog


Recommended Posts

Posted

Sziasztok!

 

Nekem lenne egy olyan kérdésem, hogy Delphi 7-ben most írok egy programot, de elakadtam egy résznél, ahol el kéne menteni és ki kéne nyomtatni egy StringGrid-et.

 

Ha valaki tudja, hogy hogyan lehetséges ezt végrehajtani a StringGrid-del, akkor az pls segítsen.

 

Elõre is köszönöm mindenkinek:

Attila

  • 5 months later...
Posted

Üdv!

 

Az egész StringGridet egyben nem hiszem, hogy el tudod menteni, esetleg soronként, vagy oszloponként, az adott sor/oszlop SaveToFile függvényével.

Esetleg írhatsz egy saját eljárást, valahogy így:

procedure TForm1.Button1Click(Sender: TObject);
var i, j: Integer;
   sl: TStrings;
   S: string;
begin
 sl:=TStringList.Create;
 for i:=0 to StringGrid1.RowCount-1 do
 begin
   S:='';
   for j:=0 to StringGrid1.ColCount-1 do
   begin
     S:=S+StringGrid1.Cells[j, i];
     if j<>StringGrid1.ColCount-1 Then S:=S+#09;
   end;
   sl.Add(S);
 end;
 sl.SaveToFile('C:\hehe.txt');
 sl.Free;
end;

Aztán ha formázni is akarsz, akkor hajrá...

 

A nyomtatás már egy kicsit bonyolultabb, ehhez a Printers unitot és a globális Printer változót kell használni.

 

Ezt majd utólag megírom, de most a suliban vagyok, és ha még véletlenül egy igazi nyomtatóra megy a szöveg, akkor leszedik a fejemet. :upsz:

 

Ui: tudom, hogy már vagy fél éves a kérdés, de azért válaszolok... :D

  • 2 months later...
Posted

Ezt a nyomtatásos dolgot azért szívesen meghalgatnám.

Posted

Hogy én milyen feledékeny vagyok... Teljesen elfelejtettem, hogy megígértem, hogy válaszolok. :) Bocsi.

Tehát:

A legegyszerűbb, ha a StringGridet úgy, ahogy van kinyomtatod. Görgetősávokkal, rácsokkal, meg mindennel. Ezt az alábbi módon tudod megtenni:

Printer.BeginDoc;
Printer.Canvas.CopyRect(Rect(0, 0, StringGrid1.Width, StringGrid1.Height), StringGrid1.Canvas, Rect(0, 0, StringGrid1.Width, StringGrid1.Height));
Printer.EndDoc;

Ez nem lesz túl szép, de egyszerű...

Ha szebbet akarsz, akkor azt saját magadnak kell megcsinálnod. A Printer-nek van egy Canvas propertyje, amire tudsz rajzolgatni, vagy például TextRect-tel szöveget írni. A Printer.NewPage kezd új oldalt, a Printer.PageHeight-ben van az oldal magassága, PageWidth-ben a szélessége, stb. Itt már elég sokmindenre kell figyelni, ezt most így röptében inkább nem írom meg... :zokog: De ha nem felejtem el, akkor pénteken elküldöm, jó? :D

Posted

Elvileg a Delphiben magának a formnak (ablak) is van egy Print eljárása, ami elrejti pl. a gombokat, de a mezõket kinyomtatja, szerintem mûködne. Legalábbis már csináltam ilyet, megspórolandó a Reportkészítést.

Posted

De jó, hogy már nem tudtam szerkeszteni. Na mindegy, írom külön:

A kód (kell hozzá a Printers unit, illetve egy Button1 és egy PrintDialog a Formon):

procedure TForm1.Button1Click(Sender:TObject);
// Beállítások
const
  Zoom:           Real        = 4.0;         // nagyítás
  AutoZoom:       Boolean     = true;        // a szélesség automatikus igazítása az oldalszélességhez
  MarginLeft:     Integer     = 12;          // bal margó
  MarginTop:      Integer     = 12;          // felsõ margó
  MarginRight:    Integer     = 12;          // jobb margó
  MarginBottom:   Integer     = 12;          // alsó margó
  CellPadding:    Integer     = 2;           // cellán belüli margók
  THBackground:   TColor      = $00CCCCCC;   // a 'Fixed' cellák háttérszíne
  TDBackground:   TColor      = $00FFFFFF;   // a normális cellák háttérszíne
  PageBackground: TColor      = $00FFFFFF;   // az oldal háttérszíne
  LineColor:      TColor      = $00000000;   // a cellák szegélyeinek színe
  THFontColor:    TColor      = $00FFFFFF;   // betûszín (normál cellák)
  TDFontColor:    TColor      = $00000000;   // betûszín (fixed cellák)
// Beállítások vége
var i, j:      Integer;
    FullWidth:    Integer;
    Zoom_:        Real;
    SumWidths:    Integer;
    SumHeights:   Integer;
    CurrRowHeight:Integer;
    CurrColWidth: Integer;
begin
  if PrintDialog1.Execute then
  begin
    Printer.BeginDoc;
    Zoom_:=Zoom;
    SumHeights:=round(MarginTop*Zoom_);
    if AutoZoom Then
    begin
      FullWidth:=0;
      for i:=0 to StringGrid1.ColCount-1 do
      begin
        FullWidth:=FullWidth+StringGrid1.ColWidths[i];
      end;
      FullWidth:=FullWidth+MarginLeft+MarginRight;
      Zoom_:=(Printer.PageWidth)/(FullWidth);
    end;
    Printer.Canvas.Font:=StringGrid1.Font;
    Printer.Canvas.Font.Size:=round(StringGrid1.Font.Size*Zoom_/(300/96));
    Printer.Canvas.Brush.Style:=bsSolid;
    Printer.Canvas.Brush.Color:=PageBackground;
    Printer.Canvas.FillRect(Rect(0, 0, Printer.PageWidth, Printer.PageHeight));
    for i:=0 to StringGrid1.RowCount-1 do
    begin
      // új lap, ha nem fér ki
      if i<>0 Then SumHeights:=SumHeights+round(StringGrid1.RowHeights[i-1]*Zoom_);
      CurrRowheight:=round(StringGrid1.RowHeights[i]*Zoom_);
      if SumHeights+CurrRowHeight>(Printer.PageHeight-(MarginBottom*Zoom_)) Then
      begin
        Printer.NewPage;
        SumHeights:=round(MarginTop*Zoom_);
      end;
      SumWidths:=round(MarginLeft*Zoom_);
      for j:=0 to  StringGrid1.ColCount-1 do
      begin
        if j<>0 Then SumWidths:=SumWidths+round(StringGrid1.ColWidths[j-1]*Zoom_);
        CurrColWidth:=round(StringGrid1.ColWidths[j]*Zoom_);
        // Külön formázzuk az elsõ sort és az elsõ oszlopot
        if (i<StringGrid1.FixedCols) or (j<StringGrid1.FixedRows) Then
        begin
          Printer.Canvas.Font.Style:=[fsBold];
          Printer.Canvas.Brush.Color:=THBackground;
          Printer.Canvas.Font.Color:=THFontColor;
        end
        else
        begin
          Printer.Canvas.Font.Style:=[];
          Printer.Canvas.Brush.Color:=TDBackground;
          Printer.Canvas.Font.Color:=TDFontColor;          
        end;
        Printer.Canvas.Rectangle(Rect(SumWidths,
                                      SumHeights,
                                      SumWidths+CurrColWidth,
                                      SumHeights+CurrRowHeight));
        Printer.Canvas.Brush.Style:=bsClear;
        Printer.Canvas.TextRect(Rect(SumWidths,
                                     SumHeights,
                                     SumWidths+CurrColWidth,
                                     SumHeights+CurrRowHeight),
                                     SumWidths+round(CellPadding*Zoom_),
                                     SumHeights+round(CellPadding*Zoom_),
                                     StringGrid1.Cells[j, i]);
      end;
    end;
    Printer.EndDoc;
  end;
end;

 

Tud szegélyeket rajzolni a celláknak, bal oldalt és fent található, nem megváltoztatható sorok (fixed rows/cols, vagy mi) más színnel és betûstílussal jelennek meg, mint a többi. Változtatható betûszín, háttérszín (a celláknak), lapszín, szegélyszín és margók(oldalmargók, és belsõ margók a cellákban). Zoomolás, akár automatikusan is (a táblázat szélességét a lap szélességéhez igazítja), automatikus oldaltörés (ha nem fér ki a táblázat), illetve a szabványos Nyomtatás ablak megjelenítése. Ja, és támogatja azt is, ha a sorok, vagy oszlopok szélességei/magasságai nem egyformák...

 

Ez már egész használható, és kiindulási alapnak jó. A kód egy kicsit kusza ugyan, mert nem igazán terveztem, csak írtam, ami eszembe jutott.

Aztán ha kell, akkor még bõvíthetem pl. fej- illetve lábléccel(oldalszámozás), vagy különféle vonaltípusokkal, stb.

 

Sok sikert a használatához!

Posted

Ezer köszönet minden segítségért. Ha esetleg értesz az internet kezeléshez is, akkor várom a segítségedet a

Internet kezelés formon belül
címû rovaton belül.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...