Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5) (https://www.delphipraxis.net/178658-mehrzeiliges-stringgrid-doppeltes-zeichnen-bei-xe5.html)

Headbucket 20. Jan 2014 07:27

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:
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;
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).
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

Headbucket 22. Jan 2014 12:17

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

baumina 22. Jan 2014 12:23

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.

Headbucket 22. Jan 2014 12:57

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:
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;
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:

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

himitsu 22. Jan 2014 13:03

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: http://if-schleife.de

baumina 22. Jan 2014 13:04

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?

DeddyH 22. Jan 2014 13:11

AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
 
Kleine Anmerkung am Rande:
Zitat:

Delphi-Quellcode:
DT_LEFT+DT_WORDBREAK

Das mag in diesem Fall zwar gut gehen, allgemein ist es aber keine gute Idee, Bitmasken zu addieren.

himitsu 22. Jan 2014 13:20

AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
 
Zitat:

Zitat von baumina (Beitrag 1244887)
was für eine Farbe wäre denn in stringgrid1.Canvas.Brush.Color, wenn du sie nicht extra setzt?

Wenn das auf "clear" steht, dann könnte es sein, daß FillRect nichts macht und der "Default"-Text noch sichtbar ist.

[edit]
DeddyH meint
Delphi-Quellcode:
DT_LEFT or DT_WORDBREAK
.

baumina 22. Jan 2014 13:22

AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
 
Zitat:

Zitat von DeddyH (Beitrag 1244892)
Kleine Anmerkung am Rande:
Zitat:

Delphi-Quellcode:
DT_LEFT+DT_WORDBREAK

Das mag in diesem Fall zwar gut gehen, allgemein ist es aber keine gute Idee, Bitmasken zu addieren.

Ich bin ja so der Kopiertyp :oops: Meine Quelle war diese hier : http://www.delphi-treff.de/tipps/kom...id-ausrichten/

Headbucket 22. Jan 2014 13:44

AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von himitsu (Beitrag 1244886)
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?

DefaultDrawing habe ich ehrlich gesagt bisher immer auf true gehabt. Bei Delphi 2007 hatte ich da keine Probleme. Habe dann aber in einem englschen Beitrag gelesen, dass man es auf false setzen sollte, wenn man selber zeichnen möchte.
Meine Funktion wird nur einmal aufgerufen und ist denke ich nicht für das doppelte Zeichnen zuständig.
Zitat:

Zitat von himitsu (Beitrag 1244886)

Mist :oops:

Zitat:

Zitat von baumina (Beitrag 1244887)
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?

Ja ich habe es auch ohne versucht. Ich muss zugeben, dass WITH nicht besonders zur Übersichtlichkeit beiträgt - im Gegenteil. Aber wenns das schon gibt kann mans ja ruhig ab und zu mal nutzen ;-).
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 13:41 Uhr.
Seite 1 von 2  1 2      

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