Hallo,
ich habe ein Problem mit TStringGrid, welches aehnlich ist zu dem Problem beschrieben in folgendem Post:
http://www.delphipraxis.net/153611-s...ndows-7-a.html
Allerdings bringt der Tipp in dem Post bei mir nichts.
Ich habe eine neue Stringgrid Komponente erstellt, die nur die Funktionenen Paint und DrawCell modifiziert:
Delphi-Quellcode:
procedure TMyStringGrid.Paint;
var
L_Rect:TRect;
L,T,R,B : integer;
MySelection : TGridRect;
SelRect : TRect;
begin
inherited;
if HideFocusRect then
begin
L := CellRect(Col,Row).Left;
R := CellRect(Col+5,Row).Right;
T := CellRect(Col,Row).Top;
B := CellRect(Col,Row).Bottom;
L_Rect := Rect(L,T,R,B);
InflateRect(L_Rect,-1,-1);
DrawFocusrect(Canvas.Handle,L_Rect);
Canvas.Brush.color := clBlue;
SelRect := Rect(L,T,R,B);
InflateRect(SelRect,-1,-1);
Canvas.FrameRect(SelRect);
end;
end;
procedure TMyStringGrid.DrawCell(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState);
var CRect : TRect;
OffsetLeft : integer;
OffsetTop : integer;
L,T,R,B : integer;
begin
// Fixed Cols and Rows
if (ACol = 0) or (ARow = 0) then
begin
CRect := CellRect(ACol, ARow);
OffsetLeft := Round(CRect.Width/2 - Canvas.TextWidth(Cells[ACol, ARow])/2);
OffsetTop := Round(CRect.Height/2 - Canvas.TextHeight('0')/2);
Canvas.TextOut(CRect.Left+OffsetLeft, CRect.Top + OffsetTop, Cells[ACol, ARow]);
end;
// Numbers 1 to 6
if ((ACol = 1) or (ACol = 2) or (ACol = 3) or (ACol = 4) or (ACol = 5) or (ACol = 6))
and not (gdFixed in AState) and (ARow <> selection.Top) then
begin
CRect := CellRect(ACol, ARow);
Canvas.Brush.Color := (145 + 245 shl 8 + 180 shl 16);
Canvas.FillRect(CRect);
OffsetLeft := Round(CRect.Width/2 - Canvas.TextWidth(Cells[ACol, ARow])/2);
OffsetTop := Round(CRect.Height/2 - Canvas.TextHeight('0')/2);
Canvas.TextOut(CRect.Left+OffsetLeft, CRect.Top + OffsetTop, Cells[ACol, ARow]);
end;
// Selected Row
if (ARow = selection.Top) and (ACol > 0) then
begin
CRect := CellRect(ACol, ARow);
Canvas.Brush.Color := clGradientInactiveCaption;//RGB2TColor(0, 0, 120);
Canvas.font.color := clBlack;
Canvas.FillRect(CRect);
OffsetLeft := Round(CRect.Width/2 - Canvas.TextWidth(Cells[ACol, ARow])/2);
OffsetTop := Round(CRect.Height/2 - Canvas.TextHeight('0')/2);
Canvas.TextOut(CRect.Left + OffsetLeft, CRect.Top + OffsetTop, Cells[ACol, ARow]);
end;
end;
Wenn ich diese Komponente verwende und das Fenster der Anwendung kleiner und anschliessend wieder groesser mache, wobei die Groesse des StringGrids mitskaliert, dann werden die Eintraege im stringgrid vertikal+horizontal versetzt doppelt gezeichnet (wahrscheinlich einmal von OwnerDraw und und einmal von der Standard methode). Der gleiche Effekt geschieht manchmal beim hoch und runter scrollen des Stringgrids.
Analog zu dem obigen Post, wird der Normalzustand ohne doppelten Text wieder erreicht wenn ich ein Repaint des StringGrids explizit ausfuehre.
Windows 7 + Delphi XE3
Hat jemand eine Idee wie ich das Loesen kann?
Gruesse,
Gutelo
Nachtrag: der Text wird nur in vertikale, nicht in horizontale Richtung verschoben verdoppelt. Die Verschiebung ist nicht einheitlich sondern variiert mit den Zeilen. Haengt wahrscheinlich davon ab wie schnell man das Fenster des Programms vergroessert.