mata2 Posted July 12, 2005 Posted July 12, 2005 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
DonTomika Posted January 11, 2006 Posted January 11, 2006 Ü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. Ui: tudom, hogy már vagy fél éves a kérdés, de azért válaszolok...
mata2 Posted March 22, 2006 Author Posted March 22, 2006 Ezt a nyomtatásos dolgot azért szívesen meghalgatnám.
DonTomika Posted March 29, 2006 Posted March 29, 2006 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... De ha nem felejtem el, akkor pénteken elküldöm, jó?
TheSaurus Posted March 30, 2006 Posted March 30, 2006 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.
DonTomika Posted March 31, 2006 Posted March 31, 2006 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!
mata2 Posted April 2, 2006 Author Posted April 2, 2006 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now