Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   StringGrid Drucken erweiterung (https://www.delphipraxis.net/184718-stringgrid-drucken-erweiterung.html)

PaddyVII 16. Apr 2015 15:19

StringGrid Drucken erweiterung
 
Hallöchen Delphianer,

(bevor jemand kommt mit - Wie man ein StringGrid druckt, steht hier schoon 1000X - mal - ich weiß:-D)

alsoo vorab: Ich hab folgende routine in mein Programm eingebaut und angepasst, funktioniert alles auch sooweit wie gewollt: http://www.swissdelphicenter.ch/de/showcode.php?id=1577

Nun hab ich aber eine kleine frage: Wenn ich mit dieser routine etwas ausdrucke, dann geht das zwar, allerdings zeigt es mir KEINE raster auf dem ausdruck an...dies möchte ich ändern, ich will dass man die Horizontalen sowie die vertikalen linien sieht...

kann mir jemand sagen, Wie/Wo/Was ich verändern muss, dass die Linien mitgedruckt werden??


Danke im Vorraus ^^:thumb:

himitsu 16. Apr 2015 16:00

AW: StringGrid Drucken erweiterung
 
Es gibt da den Abschnitt
Delphi-Quellcode:
//Zeilen drucken
, wo aktuell nur Text gedruckt wird (TextOut)
und man mag es nicht glauben, aber wenn man nun auch die Linien haben will, dann wird man das ebenfalls dort mit einbauen müssen.

Wie man Linien zeichnet, kannst du dir ja bei Header und Footer abgucken, wo es bereits gemacht wird.
Die Berechnung für die Position der Linien kann man sich aus dem TextOut der Zellen ableiten.


PS: Kontakt/Fragen zum Ersteller des Codes, siehe http://www.swissdelphicenter.ch/de/sendmail.php?id=1577 (aber eigentlich sollte man das auch locker selber hinbekommen)

PaddyVII 17. Apr 2015 10:24

AW: StringGrid Drucken erweiterung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von himitsu (Beitrag 1298034)
Es gibt da den Abschnitt
Delphi-Quellcode:
//Zeilen drucken
, wo aktuell nur Text gedruckt wird (TextOut)
und man mag es nicht glauben, aber wenn man nun auch die Linien haben will, dann wird man das ebenfalls dort mit einbauen müssen.

Wie man Linien zeichnet, kannst du dir ja bei Header und Footer abgucken, wo es bereits gemacht wird.
Die Berechnung für die Position der Linien kann man sich aus dem TextOut der Zellen ableiten.


PS: Kontakt/Fragen zum Ersteller des Codes, siehe http://www.swissdelphicenter.ch/de/sendmail.php?id=1577 (aber eigentlich sollte man das auch locker selber hinbekommen)

Najaa, ich bekomms aber irgendwie trotzdem nicht hin...alsoo ich hab die routine an der stelle soo abgeändert, jedoch zeichnet der die linien irgendwie komisch, nicht durchgängig (screenshot häng ich an)... folgendermaßen habe ich den Quellcode erweitert...:

Delphi-Quellcode:
 if EigeneDruckerEinstellungen.rgLinien.ItemIndex = 0 then
            begin
              Printer.Canvas.MoveTo(XPos, -YPos);
            end;
              Printer.Canvas.TextOut(XPos, -YPos,
                Grid.Cells[j, i + (Seite - 1) * Zeilen - 1]);
              XPos := XPos + Grid.ColWidths[j] * 3;
               if EigeneDruckerEinstellungen.rgLinien.ItemIndex = 0 then
            begin
              Printer.Canvas.LineTo(XPos, -YPos);
            end;

kurze erklärung: Wenn der Itemindex der Radiogroup 0 ist, soll mit linien gedruckt werden...

Aviator 17. Apr 2015 10:32

AW: StringGrid Drucken erweiterung
 
Ohne mir jetzt großartig den Source anzuschauen. Das sieht aus, als würde er pro Zeile die Linie wieder mit dem Text übermalen. Das bedeutet, dass die Linie zu nah an deinem Text klebt. Um das zu ändern, müsstest du die Linie weiter weg vom Text zeichnen oder den BrushStyle der Texte auf bsClear setzen.
Delphi-Quellcode:
Canvas.BrushStyle := bsClear;

baumina 17. Apr 2015 10:39

AW: StringGrid Drucken erweiterung
 
Nach dem TextOut korrigierst du XPos. Das LineTo machst du mit der korrigierten XPos, denke daran liegt das.

PaddyVII 17. Apr 2015 12:06

AW: StringGrid Drucken erweiterung
 
Zitat:

Zitat von Aviator (Beitrag 1298169)
Ohne mir jetzt großartig den Source anzuschauen. Das sieht aus, als würde er pro Zeile die Linie wieder mit dem Text übermalen. Das bedeutet, dass die Linie zu nah an deinem Text klebt. Um das zu ändern, müsstest du die Linie weiter weg vom Text zeichnen oder den BrushStyle der Texte auf bsClear setzen.
Delphi-Quellcode:
Canvas.BrushStyle := bsClear;


Heyy, das mit dem Busstyle funktioniert irgendwie gar nicht...er stellt mir den brushstyle auf bsClear um, aber eine veränderung seh ich nicht...



Zitat:

Nach dem TextOut korrigierst du XPos. Das LineTo machst du mit der korrigierten XPos, denke daran liegt das.
aber auf welchen wert korrigieren??

BadenPower 17. Apr 2015 14:22

AW: StringGrid Drucken erweiterung
 
Zitat:

Zitat von PaddyVII (Beitrag 1298207)
aber auf welchen wert korrigieren??

Schau Dir den Quellcode, welchen Du gepostet hast an und versuche ihn zu verstehen.

Kleine Hilfe:

Mit TextOut gibst Du den Text aus.
Dann kommt XPos := XPos + .... in dieser Zeile wird XPos ein neuer Wert zugewiesen.
Danach willst Du die Linie zeichnen.

Du musst die Linie natürlich voher zeichnen, bevor XPos einen neuen Wert bekommt.

Blup 20. Apr 2015 08:36

AW: StringGrid Drucken erweiterung
 
Natürlich muss sich "XPos" bei "MoveTo" und "LineTo" unterscheiden, sonst gibt es keine Linie.
Aber warum ausgerechnet um den Wert "Grid.ColWidths[j] * 3", soll damit die horizontale Linie für eine Zelle gezeichnet werden?

Viel sinnvoller währe es, die horizontale Linie einmal pro Zeile über die ganze Tabellenbreite zu zeichnen.
Auf jeden Fall sollte sich "YPos" beim Zeichnen der Linie und des Textes unterscheiden.
Der Rahmen soll ja nicht durch den Text gehen, sondern darüber oder darunter gezeichnet werden.
Pseudocode:
Delphi-Quellcode:
YPos := InitYPos;
for Y := 0 to MaxY do
begin
  XPos := InitXPos;
  ZeichneZeilenLinie(XPos, XPosMax, YPos);
  YPos := BerücksichtigeHoeheDerLinie(YPos);

  for X := 0 to MaxX do
  begin
    ZeichneZellenText(XPos, YPos);
    XPos := BruecksichtigeBreiteDerZelle(XPos);
  end;

  YPos := BerücksichtigeHoeheDerZelle(YPos);
end;

BadenPower 20. Apr 2015 09:02

AW: StringGrid Drucken erweiterung
 
Zitat:

Zitat von Blup (Beitrag 1298464)
Natürlich muss sich "XPos" bei "MoveTo" und "LineTo" unterscheiden, sonst gibt es keine Linie.

Das ist natürlich Käse, denn Du hast das TextOut vergessen.

Und bei TextOut wird die PenPos auf die rechte obere Ecke gesetzt und somit wird die Linie selbstverständlich gezeichnet.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  XPos: Integer;
  YPos: Integer;
begin
  XPos := 20;
  YPos := 20;

  Canvas.MoveTo(XPos, YPos);
  Canvas.TextOut(XPos, YPos, 'Text1');
  Canvas.LineTo(XPos, YPos);
end;
Diese Ausgabe ergibt den 'Text1' mit einer Linie darüber, obwohl XPos nicht geändert wurde.

himitsu 20. Apr 2015 09:07

AW: StringGrid Drucken erweiterung
 
Zitat:

Zitat von BadenPower (Beitrag 1298471)
obwohl XPos nicht geändert wurde.

Wer behauptet denn, daß Textout nicht den Cursor verschiebt? :roll:

Delphi-Quellcode:
procedure TCanvas.TextOut(X, Y: Integer; const Text: String);
begin
  Changing;
  RequiredState([csHandleValid, csFontValid, csBrushValid]);
  if CanvasOrientation = coRightToLeft then Inc(X, TextWidth(Text) + 1);
  Windows.ExtTextOut(FHandle, X, Y, FTextFlags, nil, Text,
   Length(Text), nil);
  MoveTo(X + TextWidth(Text), Y);
  Changed;
end;
Delphi-Referenz durchsuchenTCanvas.TextOut
Zitat:

After a call to TextOut, the PenPos property indicates the point at the top right of the text on the canvas.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:35 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz