AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)

Ein Thema von Headbucket · begonnen am 20. Jan 2014 · letzter Beitrag vom 22. Jan 2014
Antwort Antwort
Seite 1 von 2  1 2      
Headbucket

Registriert seit: 12. Dez 2013
Ort: Dresden
172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)

  Alt 20. Jan 2014, 08:27
Delphi-Version: XE5
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
Miniaturansicht angehängter Grafiken
stringgrid.jpg  
  Mit Zitat antworten Zitat
Headbucket

Registriert seit: 12. Dez 2013
Ort: Dresden
172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)

  Alt 22. Jan 2014, 13:17
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
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)

  Alt 22. Jan 2014, 13:23
Ich hab nur XE, DefaultDrawing ist true, allerdings sieht bei mir der DrawText so aus:

DrawText(Grid.Canvas.Handle, PChar(TextOut), StrLen(PChar(TextOut)),Rect,DT_LEFT+DT_WORDBREAK);

Keine Ahnung ob dich das weiter bringt.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Headbucket

Registriert seit: 12. Dez 2013
Ort: Dresden
172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)

  Alt 22. Jan 2014, 13:57
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

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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)

  Alt 22. Jan 2014, 14:03
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
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)

  Alt 22. Jan 2014, 14:04
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?
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#7

AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)

  Alt 22. Jan 2014, 14:11
Kleine Anmerkung am Rande:
Zitat:
DT_LEFT+DT_WORDBREAK
Das mag in diesem Fall zwar gut gehen, allgemein ist es aber keine gute Idee, Bitmasken zu addieren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)

  Alt 22. Jan 2014, 14:20
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 DT_LEFT or DT_WORDBREAK .
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)

  Alt 22. Jan 2014, 14:22
Kleine Anmerkung am Rande:
Zitat:
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 Meine Quelle war diese hier : http://www.delphi-treff.de/tipps/kom...id-ausrichten/
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)

Geändert von baumina (22. Jan 2014 um 14:26 Uhr)
  Mit Zitat antworten Zitat
Headbucket

Registriert seit: 12. Dez 2013
Ort: Dresden
172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Mehrzeiliges Stringgrid (Doppeltes Zeichnen bei XE5)

  Alt 22. Jan 2014, 14:44
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.
Mist

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
Miniaturansicht angehängter Grafiken
stringgrid.jpg  
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:36 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