Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   StringGrid OnDrawCell, eigener Inhalt wird überschrieben, wenn Zelle selektiert (https://www.delphipraxis.net/169755-stringgrid-ondrawcell-eigener-inhalt-wird-ueberschrieben-wenn-zelle-selektiert.html)

alleinherrscher 9. Aug 2012 14:08

StringGrid OnDrawCell, eigener Inhalt wird überschrieben, wenn Zelle selektiert
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hiho, ich nutze die Standard Windows VCL. Im OnDrawCell möchte ich gerne in bestimmten Fällen den Inhalt einer Zelle ändern. (Es soll später ein kleines Bild in die Zelle, der Zelltext soll eingerückt werden).

Das Einrücken übernehme ich nun testweise im OnDrawCell, was auch klappt, bis die entsprechende Zelle selektiert ist:

Delphi-Quellcode:
   if (arow>0) and (acol=1) then
   begin
     if pos('TICKETNUMBER',orderby)>0 then
     begin
       if (DL[arow-1].ticketNumber<>-1) and (ExitsSameTicketNumberBefore(arow-1, DL[arow-1].ticketNumber)) then
          begin
            str:='>>'+sgDataList.Cells[ACol, ARow];
            sgDataList.Canvas.TextRect(Rect,Rect.Left + 2,Rect.top+((Rect.Bottom-Rect.top)-sgDataList.Canvas.TextHeight(str)) div 2,str);
          end;
     end;
Ergebnis: Siehe Anhang: Links: Zelle nicht selektiert, rechts: Zelle selektiert.

Was (edit) kann (/edit) ich machen, außer komplett auf ein DrawGrid (edit) zu wechseln (/edit)?

Danke und besten Gruß,
Michael

s.h.a.r.k 9. Aug 2012 14:15

AW: StringGrid OnDrawCell, eigener Inhalt wird überschrieben, wenn Zelle selektiert
 
Zitat:

Zitat von alleinherrscher (Beitrag 1177523)
Was ich machen, außer komplett auf ein DrawGrid welchen?

WHAT? :shock:

Ist das die ganze Methode oder nur ein Teil davon? Poste doch mal alles bitte! Rufst du vielleicht irgendwo inherited OnDrawCell() auf, wo es nicht sein sollte?

Hobby-Programmierer 9. Aug 2012 14:46

AW: StringGrid OnDrawCell, eigener Inhalt wird überschrieben, wenn Zelle selektiert
 
Vielleicht den Canvas vorher löschen bevor du den Zelleninhalt schreibst. Unterscheidest du nach Selected?

alleinherrscher 9. Aug 2012 15:09

AW: StringGrid OnDrawCell, eigener Inhalt wird überschrieben, wenn Zelle selektiert
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1177525)
Zitat:

Zitat von alleinherrscher (Beitrag 1177523)
Was ich machen, außer komplett auf ein DrawGrid welchen?

WHAT? :shock:

Ist das die ganze Methode oder nur ein Teil davon? Poste doch mal alles bitte! Rufst du vielleicht irgendwo inherited OnDrawCell() auf, wo es nicht sein sollte?

Sorry, da fehlen nicht die Deutschkenntnisse, sondern nur ein "kann" ;) Das ist der Inhalt der OnDrawCell Prozedur. Ansonsten ist nur noch der Code, der die E-Mail Icons in die erste Spalte zeichnet, davor, der aber keinen Einfluss auf den hier gezeigten Effekt hat.

@Hobby-Programmierer: Nein, ich unterschiede nicht nach "Selected", das ist ja, was mich wundert. State:TGridDrawState wird bei mir NICHT abgefragt.

p80286 9. Aug 2012 15:35

AW: StringGrid OnDrawCell, eigener Inhalt wird überschrieben, wenn Zelle selektiert
 
Aber wenn die Zelle "selected" ist wird ja zumindestens der Hintergrund schön gemalt, wenn auch der Inhalt anders gezeichnet wird??

Das mit der Grammatik interessiert mich aber auch
"Was kann ich machen, außer komplett auf ein DrawGrid ????? "

Gruß
K-H

Zusatz:
Zitat:

Delphi-Quellcode:
Cells
        A ColCount by RowCount array of strings which are associated with each
        cell. By default, the string is drawn into the cell before OnDrawCell
        is called. This can be turned off (along with all the other default
        drawing) by setting DefaultDrawing to false.
procedure TStringGrid.DrawCell(ACol, ARow: Longint; ARect: TRect;
  AState: TGridDrawState);
begin
  if DefaultDrawing then
    Canvas.TextRect(ARect, ARect.Left+2, ARect.Top+2, Cells[ACol, ARow]);
  inherited DrawCell(ACol, ARow, ARect, AState);
end;

aus der Unit Grids

Blup 9. Aug 2012 15:49

AW: StringGrid OnDrawCell, eigener Inhalt wird überschrieben, wenn Zelle selektiert
 
Zitat:

Zitat von alleinherrscher (Beitrag 1177533)
Ansonsten ist nur noch der Code, der die E-Mail Icons in die erste Spalte zeichnet, davor, der aber keinen Einfluss auf den hier gezeigten Effekt hat.

Die Behauptung in der zweiten Satzhälfte bezweifle ich ...

alleinherrscher 9. Aug 2012 15:50

AW: StringGrid OnDrawCell, eigener Inhalt wird überschrieben, wenn Zelle selektiert
 
Zitat:

Zitat von p80286 (Beitrag 1177538)
Aber wenn die Zelle "selected" ist wird ja zumindestens der Hintergrund schön gemalt, wenn auch der Inhalt anders gezeichnet wird??

Das mit der Grammatik interessiert mich aber auch
"Was kann ich machen, außer komplett auf ein DrawGrid ????? "

Das mit der Grammatik habe ich oben korrigiert ;) [ot] Nebenbei lief das Radio und jemand berichtete über Olympia. Da kommt man schon mal durcheinander. [/ot]

Es scheint so zu sein, als würde NACH dem OnDrawCell noch der Selectedbereich inkl. Text gezeichnet.

Vielleicht liegt es daran, dass ich einen Delphi XE2 VCL-Style verwende?

Hobby-Programmierer 9. Aug 2012 21:31

AW: StringGrid OnDrawCell, eigener Inhalt wird überschrieben, wenn Zelle selektiert
 
Nabend,
ich hatte deine Frage falsch verstanden!
Du unterliegst dem Logikfehler beim 'malen' eine Auswahl über den Zellinhalt zu treffen. Das
Delphi-Quellcode:
DrawCell
- Event ist dafür denkbar ungeeignet, denn selber zeichnen möchtest du doch eigentlich gar nicht.
Den Zelleninhalt würde ich entweder in
Delphi-Quellcode:
OnClick
oder noch besser in
Delphi-Quellcode:
SelectCell
ändern.

LG Mario

alleinherrscher 9. Aug 2012 23:53

AW: StringGrid OnDrawCell, eigener Inhalt wird überschrieben, wenn Zelle selektiert
 
Zitat:

Zitat von Hobby-Programmierer (Beitrag 1177593)
Nabend,
ich hatte deine Frage falsch verstanden!
Du unterliegst dem Logikfehler beim 'malen' eine Auswahl über den Zellinhalt zu treffen. Das
Delphi-Quellcode:
DrawCell
- Event ist dafür denkbar ungeeignet, denn selber zeichnen möchtest du doch eigentlich gar nicht.
Den Zelleninhalt würde ich entweder in
Delphi-Quellcode:
OnClick
oder noch besser in
Delphi-Quellcode:
SelectCell
ändern.

LG Mario

Nene, ich möchte schon malen. Ich möchte ja ein Icon vor meinen Text auf die Canvas malen. Dafür brauche ich doch das DrawCell. Ich glaube aber, es ist das beste, wenn man schon selber malen möchte, direkt ein DrawGrid zu nehmen oder (wie ich es jetzt gemacht habe) das Icon in eine schmale neue Spalte vor dem Text zu malen.

Grüße und besten Dank an alle,
Michael


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 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