AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TStringGrid, Text doppelt bei Scrollen oder Resize

Ein Thema von Gutelo · begonnen am 29. Sep 2013 · letzter Beitrag vom 29. Sep 2013
Antwort Antwort
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
Gutelo

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

AW: TStringGrid, Text doppelt bei Scrollen oder Resize

  Alt 29. Sep 2013, 21:10
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?
  Mit Zitat antworten Zitat
Gutelo

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

AW: TStringGrid, Text doppelt bei Scrollen oder Resize

  Alt 29. Sep 2013, 21:17
Ahhh, Problem geloest:

RowHeights[0] statt CRect.Height
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:01 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