Discussion:
Offset bei StringGrid.Canvas.TextOut
(zu alt für eine Antwort)
Holger Schieferdecker
2017-08-07 11:19:54 UTC
Permalink
Hallo,

in einem StringGrid möchte ich einen Teil des Textes einer Zelle farbig
hervorheben. Im Internet habe ich dazu den Hinweis gefunden, in
OnDrawCell mittels TextOut den entsprechenden Teil farbig nochmals zu
übermalen. Das hat auch wunderbar funktioniert (D4).

Dann habe ich das Programm spaßeshalber mal nach Lazarus portiert, was
auch ohne Probleme funktionierte. Nur die farbige Ausgabe in OnDrawCell
war versetzt. Anscheinend wird in Larazus der Text in einer Zelle mit
einem anderen X-Offset gezeichnet.

Natürlich kann ich die entsprechenden Werte mittels Compilerdirektive
passend setzen, aber sauberer fände ich es, wenn die nicht vom Himmel
fallen, sondern irgendwoher bezogen werden könnten. In den Sourcen habe
ich nichts gefunden, aber so richtig wußte ich auch nicht, in welcher
Methode und in welcher Basisklasse ich suchen sollte.

Gibt es da was? Irgendeine vordefinierte Konstante oder Eigenschaft, die
die Offsets enthält?

Gruß
Holger


procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
CellPixelLeft: integer;
Xoffs, Yoffs: integer;
StCell, StPart: string;
begin
// Offsets damit per TextOut neu gezeichneter Text exakt auf dem
Original liegt
{$IFDEF FPC}
Xoffs:=3; // Lazarus
{$ELSE}
Xoffs:=2; // Delphi
{$ENDIF}
Yoffs:=2;

// zu löschenden Text hervorheben
if CheckBoxDelete.Checked then begin
if (ACol=1) and (ARow>0) then begin
// gesamter Zellentext
StCell:=StringGrid1.Cells[ACol, ARow];
// Text vor zu löschendem Teil
StPart:=copy(StCell, 1, SpinEditPos.Value-1);
// Anfangsposition des zu löschenden Teils
CellPixelLeft:=Rect.Left+Xoffs+StringGrid1.Canvas.TextWidth(StPart);
// zu löschender Teil
StPart:=copy(StCell, SpinEditPos.Value, SpinEditDigits.Value);
StringGrid1.Canvas.Font.Color:=clRed;
// Ausgabe zu löschender Teil in rot
StringGrid1.Canvas.TextOut(CellPixelLeft, Rect.Top+Yoffs, StPart);
end;
end;
end;
Jens Köhler
2017-08-07 11:52:42 UTC
Permalink
Post by Holger Schieferdecker
Hallo,
in einem StringGrid möchte ich einen Teil des Textes einer Zelle farbig
hervorheben. Im Internet habe ich dazu den Hinweis gefunden, in
OnDrawCell mittels TextOut den entsprechenden Teil farbig nochmals zu
übermalen. Das hat auch wunderbar funktioniert (D4).
wie ist es, den Inhalt komplett selbst zu zeichnen?
Also mit Rechteck übermalen und dann den Text auszugeben.
Dann kommt es auf ein Pixel nicht an.

Jens
Holger Schieferdecker
2017-08-07 12:54:24 UTC
Permalink
Post by Jens Köhler
Post by Holger Schieferdecker
Hallo,
in einem StringGrid möchte ich einen Teil des Textes einer Zelle
farbig hervorheben. Im Internet habe ich dazu den Hinweis gefunden, in
OnDrawCell mittels TextOut den entsprechenden Teil farbig nochmals zu
übermalen. Das hat auch wunderbar funktioniert (D4).
wie ist es, den Inhalt komplett selbst zu zeichnen?
Also mit Rechteck übermalen und dann den Text auszugeben.
Dann kommt es auf ein Pixel nicht an.
Könnte ich natürlich machen. Da die Hervorhebung nicht in allen Zellen
erfolgt, müßte ich das aber für das gesamte Grid durchführen, damit es
einheitlich aussieht. Wobei dann wieder fixierte Zellen anders behandelt
werden müssen. Das wollte ich mir eigentlich sparen.

Gruß
Holger
Holger Schieferdecker
2017-08-08 07:28:08 UTC
Permalink
Post by Holger Schieferdecker
Hallo,
in einem StringGrid möchte ich einen Teil des Textes einer Zelle farbig
hervorheben. Im Internet habe ich dazu den Hinweis gefunden, in
OnDrawCell mittels TextOut den entsprechenden Teil farbig nochmals zu
übermalen. Das hat auch wunderbar funktioniert (D4).
[...]
Post by Holger Schieferdecker
Gibt es da was? Irgendeine vordefinierte Konstante oder Eigenschaft, die
die Offsets enthält?
Jetzt bin ich doch noch fündig geworden.

In Delphi wird letztlich Canvas.TextRect(...) aufgerufen, und da steht
als Offset fest eine 2 drin.

Bei Lazarus blicke ich noch nicht ganz durch. Da gibt es eine Konstante
"constCellPadding" mit dem Wert 3, die wird in TCustomGrid.DrawCellText
allerdings als Offset für X und Y verwendet (noch in Abhängigkeit von
der Ausrichtung). Für Y paßt in meinem Programm jedoch 2, nur bei X sind
es 3.

Naja, es ist nur für ein Programm, das ich selbst verwende, da kann ich
damit leben.

Gruß
Holger

Loading...