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;