Einzelnen Beitrag anzeigen

Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#1

TStringGrid, Text doppelt bei Scrollen oder Resize

  Alt 29. Sep 2013, 20:37
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.

Geändert von Luckie (30. Sep 2013 um 02:32 Uhr) Grund: Delphi-Tags eingefügt. Beim nächsten mnal bitte selber machen.
  Mit Zitat antworten Zitat