Holger Schieferdecker
2017-08-07 11:19:54 UTC
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;
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;