Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TStringGrid, Text doppelt bei Scrollen oder Resize (https://www.delphipraxis.net/176834-tstringgrid-text-doppelt-bei-scrollen-oder-resize.html)

Gutelo 29. Sep 2013 19:37


TStringGrid, Text doppelt bei Scrollen oder Resize
 
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.

Gutelo 29. Sep 2013 20:10

AW: TStringGrid, Text doppelt bei Scrollen oder Resize
 
Hmm, ich denke CellRect ist das Problem. Wenn die Groesse des StringGrids so eingestellt ist, dass die letzte Zeile nur teilweise angezeigt wird, dann wird der Text in dieser Zeile nach oben versetzt statt zentriert dargestellt. Ich vermute dass CellRect nur die Daten des sichtbaren Rechtecks zurueckliefert. Nur wie modifiziere ich den Code am besten?

Gutelo 29. Sep 2013 20:17

AW: TStringGrid, Text doppelt bei Scrollen oder Resize
 
Ahhh, Problem geloest:

RowHeights[0] statt CRect.Height


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz