text: StringGrid OnDrawCell, eigener Inhalt wird überschrieben, wenn Zelle selektiert - Delphi-PRAXiS
  Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls StringGrid OnDrawCell, eigener Inhalt wird überschrieben, wenn Zelle selektiert
  StringGrid OnDrawCell, eigener Inhalt wird überschrieben, wenn Zelle selektiert
  Ein Thema von alleinherrscher · begonnen am 9. Aug 2012 · letzter Beitrag vom 10. Aug 2012
  9. Aug 2012, 15:08
  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:
  if (arow>0) and (acol=1) then
  if pos('TICKETNUMBER',orderby)>0 then
  if (DL[arow-1].ticketNumber<>-1) and (ExitsSameTicketNumberBefore(arow-1, DL[arow-1].ticketNumber)) then
  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);
  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)?
  Geändert von alleinherrscher ( 9. Aug 2012 um 16:10 Uhr)
  AW: StringGrid OnDrawCell, eigener Inhalt wird überschrieben, wenn Zelle selektiert
  9. Aug 2012, 15:15
  Was ich machen, außer komplett auf ein DrawGrid welchen?
  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?
  9. Aug 2012, 15:46
  Vielleicht den Canvas vorher löschen bevor du den Zelleninhalt schreibst. Unterscheidest du nach Selected?
  9. Aug 2012, 16:09
  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.
  9. Aug 2012, 16:35
  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 ????? "
  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;
  aus der Unit Grids
  Geändert von p80286 ( 9. Aug 2012 um 16:42 Uhr)
  9. Aug 2012, 16:49
  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 ...
  9. Aug 2012, 16:50
  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?
  9. Aug 2012, 22:31
  ich hatte deine Frage falsch verstanden!
  Du unterliegst dem Logikfehler beim 'malen' eine Auswahl über den Zellinhalt zu treffen. Das DrawCell - Event ist dafür denkbar ungeeignet, denn selber zeichnen möchtest du doch eigentlich gar nicht.
  Den Zelleninhalt würde ich entweder in OnClick oder noch besser in SelectCell ändern.
  10. Aug 2012, 00:53
  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.