AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

StringGrid Drucken erweiterung

Ein Thema von PaddyVII · begonnen am 16. Apr 2015 · letzter Beitrag vom 20. Apr 2015
Antwort Antwort
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#1

AW: StringGrid Drucken erweiterung

  Alt 17. Apr 2015, 14:22
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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.492 Beiträge
 
Delphi 12 Athens
 
#2

AW: StringGrid Drucken erweiterung

  Alt 20. Apr 2015, 08:36
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;
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#3

AW: StringGrid Drucken erweiterung

  Alt 20. Apr 2015, 09:02
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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.542 Beiträge
 
Delphi 12 Athens
 
#4

AW: StringGrid Drucken erweiterung

  Alt 20. Apr 2015, 09:07
obwohl XPos nicht geändert wurde.
Wer behauptet denn, daß Textout nicht den Cursor verschiebt?

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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#5

AW: StringGrid Drucken erweiterung

  Alt 20. Apr 2015, 09:26
obwohl XPos nicht geändert wurde.
Wer behauptet denn, daß Textout nicht den Cursor verschiebt?
Ich auf jeden Fall nicht.

Ich schrieb, dass XPos nicht geändert wird, und dies ist nicht die Position des Zeichenstiftes, sondern nur eine Variable.

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.
Genau das habe ich auch noch geschrieben.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.492 Beiträge
 
Delphi 12 Athens
 
#6

AW: StringGrid Drucken erweiterung

  Alt 20. Apr 2015, 15:35
Zusammengefasst ist die einfachste Lösung, die Reihenfolge des Codes umzustellen.
Damit wird die durch "MoveTo" gesetzte Cursorposition nicht durch das folgende "TextOut" verändert.
Delphi-Quellcode:
Printer.Canvas.TextOut(XPos, -YPos, Grid.Cells[j, i + (Seite - 1) * Zeilen - 1]);

if EigeneDruckerEinstellungen.rgLinien.ItemIndex = 0 then
begin
  Printer.Canvas.MoveTo(XPos, -YPos);
end;
XPos := XPos + Grid.ColWidths[j] * 3;
if EigeneDruckerEinstellungen.rgLinien.ItemIndex = 0 then
begin
  Printer.Canvas.LineTo(XPos, -YPos);
end;
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz