![]() |
Delphi-Version: XE5
Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
manche werden jetzt vllt denken "nicht schon wieder mehrzeiliges Stringgrid". Leider muss ich aber trotzdem meine Frage hier loswerden. Ich hatte bei Delphi 2007 ein Stringgrid, welches Texte mit Zeilenumbrüchen darstellen konnte. Dabei habe ich im DrawCell-Event folgenden Code benutzt:
Delphi-Quellcode:
Das ganze hat wunderbar funktioniert. Nun möchte ich solch ein Stringgrid auch unter XE5 verwenden. Leider wird hier der Text doppelt gezeichnet (siehe Anhang).
procedure TSelectTextDlg.StringGrid1DrawCell(Sender: TObject; ACol,ARow: Integer; Rect: TRect; State: TGridDrawState);
var s:string; begin with stringgrid1 do begin s := Cells[ACol, ARow]; Canvas.FillRect(Rect); DrawText(Stringgrid1.Canvas.Handle, PChar(s), Length(s), Rect, DT_left); end; end; Allerdings nur, wenn ich die Zelle direkt anwähle. So ist im oberen Teil des Bildes zu sehen, dass die 1 doppelt gezeichnet wird. Im unteren Teil des Bildes klicke ich dann die Zelle mit dem Text an, wobei der Inhalt der Zelle dann ohne Zeilenumbruch nochmal über die Zelle gezeichnet wird. Wenn ich den Inhalt der Zelle auslese, gibt er mir den richtigen Inhalt wieder. Das OnSelectCell-Event habe ich versuchshalber ausgeblendet. Daran liegt es also nicht. Hat schon jemand ein mehrzeiliges Stringgrid bei den neueren Delphi-Versionen hinbekommen? Ich habe schon alle möglichen Codes versucht. Bei manchen werden sogar die nicht angewählten Zellen doppelt ausgegeben. Hat jemand eine Idee? Grüße Headbucket |
AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
Wow - über 100 Klicks und keine Antwort? War die Frage zu leicht/zu schwer/zu unverständlich?
Inzwischen bin ich schon einen Schritt weiter. Das doppelte Zeichnen wurde durch die Eigenschaft "DefaultDrawing" des Stringgrids ausgelöst. Setze ich diese Eigenschaft auf false, so tritt der Effekt nicht mehr auf. Damit wird die Zelle beim Anklicken aber leider auch nicht mehr gehighlightet. Aber das bekomme ich wohl auch noch irgendwie hin :-). Grüße Headbucket |
AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
Ich hab nur XE, DefaultDrawing ist true, allerdings sieht bei mir der DrawText so aus:
Delphi-Quellcode:
DrawText(Grid.Canvas.Handle, PChar(TextOut), StrLen(PChar(TextOut)),Rect,DT_LEFT+DT_WORDBREAK);
Keine Ahnung ob dich das weiter bringt. |
AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
Vielen Dank für die Antwort.
Leider führt Deine Variante bei mir zu dem selben Ergebnis. In dieser Hinsicht habe ich wie gesagt schon relativ viel probiert. Ich habe gerade eben noch etwas festgestellt: Wenn ich "DefaultDrawing" auf true lasse und mein OnDrawCell-Event folgendermaßen aufbaue:
Delphi-Quellcode:
Dann tritt der Effekt des doppelten Zeichnens nicht auf. Quasi nur wegen der vorherigen Farbgebung. Lasse ich die if-Schleife weg wird wieder doppelt gezeichnet. Dafür kann es keine logische Erklärung geben :shock:
procedure TSelectTextDlg.StringGrid1DrawCell(Sender: TObject; ACol,ARow: Integer; Rect: TRect; State: TGridDrawState);
var s:string; begin with stringgrid1 do begin if (ARow <> SelectedItem) or (ACol = 0) then Canvas.Brush.Color := clWhite else Canvas.Brush.Color := clSkyBlue; s := Cells[ACol, ARow]; Canvas.FillRect(Rect); DrawText(Stringgrid1.Canvas.Handle, PChar(s), StrLen(PChar(s)),Rect,DT_LEFT+DT_WORDBREAK); end; end; Wie dem auch sei: Ich habe nun DefaultDrawing auf false gesetzt und die Markierung einer Zelle wie im obigen Code zu sehen umgesetzt. So sieht das Stringgrid genauso aus, wie ich es haben möchte. Grüße Headbucket |
AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
Wenn du selber zeichnest, dann müsste DefaultDrawing doch eigentlich auf False stehen?
Weißt du, ob deine Funktion für das doppelte zeichnen zuständig ist, oder ob es eine andere Funktion ist? - man könnte einen Zähler in StringGrid1DrawCell einbauen, der zählt wie oft das aufgerufen wurde - oder man legt Delphi IDE und Programm nebeneinander, so daß der Debugger nie über der Form ist und debuggt sich langsam durch, auch durch die VCL und schaut wann der doppelte Text erscheint. (DoubleBuffered darf da aber nirgendwo an sein, sonst sieht man ja nix) PS: ![]() |
AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
Also ich persönlich verwende niemals ein WITH, hast du es mal ohne WITH versucht und was für eine Farbe wäre denn in stringgrid1.Canvas.Brush.Color, wenn du sie nicht extra setzt?
|
AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
Kleine Anmerkung am Rande:
Zitat:
|
AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
Zitat:
[edit] DeddyH meint
Delphi-Quellcode:
.
DT_LEFT or DT_WORDBREAK
|
AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
Zitat:
![]() |
AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Meine Funktion wird nur einmal aufgerufen und ist denke ich nicht für das doppelte Zeichnen zuständig. Zitat:
Zitat:
Wenn ich die Farbe nicht extra setze hat sie einen Integer-Wert von 16777215. In Hex umgerechnet entspricht das ffffff. Das ist weiß ;-). Und genau das setze ich ja dann für alle Zellen, welche nicht gerade markiert (SelectedItem) sind. Klappt ja aber jetzt alles :-). Im Anhang nochmal ein Bild, wie es jetzt aussieht. Genau so wollte ich es haben. Grüße und Danke! Headbucket |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:21 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 by Thomas Breitkreuz