![]() |
TStringGrid, Text doppelt bei Scrollen oder Resize
Hallo,
ich habe ein Problem mit TStringGrid, welches aehnlich ist zu dem Problem beschrieben in folgendem Post: ![]() 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:
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.
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; 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. |
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?
|
AW: TStringGrid, Text doppelt bei Scrollen oder Resize
Ahhh, Problem geloest:
RowHeights[0] statt CRect.Height |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz