AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

StringGrid DrawCell Werte sind unsichtbar

Ein Thema von peter314 · begonnen am 12. Nov 2010 · letzter Beitrag vom 12. Nov 2010
Antwort Antwort
peter314

Registriert seit: 3. Dez 2008
22 Beiträge
 
#1

StringGrid DrawCell Werte sind unsichtbar

  Alt 12. Nov 2010, 15:14
Hallo zusammen,

Auf meiner Form habe ich ein TStringGrid und ein TListView. Bei der Auswahl eines ListView Items werden im Stringgrid gewisse Zellen farbig hinterlegt. Das funktioniert auch soweit.
Klickt man jedoch zwischendurch auf das StringGrid und wählt anschließend wieder ein ListView Item aus, so kommt es zu Darstellungsfehlern, die sich in erster Linie dadurch bemerkbar machen, das in den Zellen des StringGrids keine Werte mehr angezeigt werden.

Ich würde mich freuen, wenn jemand den Fehler findet bzw. mir sagen kann was ich evetuell nicht beachtet habe.

Hier Auszüge meines Quelltextes:

Delphi-Quellcode:
{TStringGrid}
procedure TForm1.StundenplanDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var
s: string;
begin
 with Sender as TStringGrid do begin
  if FrList1.Liste.ItemIndex>-1 then begin
   if Cells[ACol,ARow]= FrList1.Liste.Selected.Caption then begin
    Canvas.Pen.Color:= clwhite;
    Canvas.Brush.Color:= clHighlight;
    Canvas.FillRect(Rect);
   end else begin
    if (ACol=0) or (ARow=0) then begin
      Canvas.Pen.Color:=clblack;
      Canvas.Brush.Color:= StundenPlan.FixedColor;
    end else begin
     Canvas.Pen.Color:=clwhite;
     Canvas.Brush.Color:= clwhite;
     Canvas.FillRect(Rect);
    end;
   end;
  end else begin
   if (ACol=0) or (ARow=0) then begin
    Canvas.Pen.Color:=clblack;
    Canvas.Brush.Color:= StundenPlan.FixedColor;
   end else begin
    if (state= [gdSelected]) then
     Canvas.Brush.Color:= clHighlight
    else
     Canvas.Brush.Color:= clwhite;
    Canvas.Pen.Color:=clwhite;
    Canvas.FillRect(Rect);
   end;
  end;
   Font.Color:= clBlack;
   s:= Cells[ACol,ARow];
   DrawText(Canvas.Handle,PChar(s),length(s),Rect,DT_Left);
  end;
end;

procedure TForm1.StundenplanSelectCell(Sender: TObject; ACol,ARow: Integer; var CanSelect: Boolean);
var
Rect: TGridRect;
begin
 FrList1.Liste.ItemIndex:= -1;
end;

{TListView}
procedure TForm1.FrList1ListeSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
var
i,j: integer;
begin
 //Alle Stunden dieses Faches markieren
 for i:= 1 to 5 do
  for j:= 1 to 11 do
   StundenplanDrawCell(Stundenplan,i,j,StundenPlan.CellRect(i,j),[]);
end;
Mfg Peter
Angehängte Grafiken
Dateityp: jpg AnzeigeFehler.jpg (28,8 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: StringGrid DrawCell Werte sind unsichtbar

  Alt 12. Nov 2010, 15:17
Du musst die Färbung im entsprechenden Event durchführen
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: StringGrid DrawCell Werte sind unsichtbar

  Alt 12. Nov 2010, 15:39
Hallo,

rufe in FrList1ListeSelectItem Grid.Invalidate auf, um es zum Neuzeichnen zu zwingen.

Das if Cells[ACol,ARow]= FrList1.Liste.Selected.Caption kann übrigens
nach hinten losgehen, wenn es mehrere gleiche Fächer im Grid gibt.
Ich würde mit Grid.Cells[].Objects arbeiten.


Heiko
Heiko
  Mit Zitat antworten Zitat
peter314

Registriert seit: 3. Dez 2008
22 Beiträge
 
#4

AW: StringGrid DrawCell Werte sind unsichtbar

  Alt 12. Nov 2010, 15:55
Danke!
Das mit Invalidate funktioniert. Die Dinge können so einfach sein, nun gut.
Aber jetzt ist ein älteres Problem wieder aufgetaucht.

Das zurzeit ausgewählte StringGrid Cell wird jetzt ohne Text angezeigt (s. Anhang -> Mittwoch 2.Stunde).
Ich verstehe nicht wie das passieren kann, da ja das gesamte Stringgrid neu gezeichnet wird, sonst kommt es ja auch nicht zu Problemen.

Und das ist mir irgendwie nicht ganz klar
Zitat:
Das if Cells[ACol,ARow]= FrList1.Liste.Selected.Caption kann übrigens
nach hinten losgehen, wenn es mehrere gleiche Fächer im Grid gibt.
Ich möchte ja alle Zellen die den Namen des Faches enthalten einfärben. So wie es im Anhang auch der Fall ist.
Angehängte Grafiken
Dateityp: jpg AnzeigeFehler.jpg (33,2 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: StringGrid DrawCell Werte sind unsichtbar

  Alt 12. Nov 2010, 17:16
Setze mal die Fontcolor statt clBlack auf $010101, dann invertiert Windows die Textfarbe der selektierten Zelle nicht mehr.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
peter314

Registriert seit: 3. Dez 2008
22 Beiträge
 
#6

AW: StringGrid DrawCell Werte sind unsichtbar

  Alt 12. Nov 2010, 17:31
Mmmh,
Danke Bummi aber Font.Color auf $010101 zu setzen hat leider nichts geändert.

Ich habs jetzt über einen Umweg gelöst, indem ich eine der farblich hinterlegten Zellen als Selection festgelegt habe.

Aber ich würde schon gerne den direkten Weg kennen lernen.
  Mit Zitat antworten Zitat
peter314

Registriert seit: 3. Dez 2008
22 Beiträge
 
#7

AW: StringGrid DrawCell Werte sind unsichtbar

  Alt 12. Nov 2010, 19:00
Endlich!!

Ich suche jetzt in DrawCell nach der selektierten Zelle und weise ihr die Hintergrundfarbe zu.
Außerdem setzte ich Font.Color bereits beim Übermalen der Zelle dadurch bleibt die Farbe auch wie sie sein soll. Anscheinend muss man die Farbe schon früher setzen, damit sie korrekt ist.
Hier mein Code.

Delphi-Quellcode:
procedure TForm1.StundenplanDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var
s: string;
begin
 with Sender as TStringGrid do begin
  if FrList1.Liste.ItemIndex>-1 then begin
   if Cells[ACol,ARow]= FrList1.Liste.Selected.Caption then begin
    Canvas.Pen.Color:= clwhite;
    Canvas.Brush.Color:= clHighlight;
    Canvas.FillRect(Rect);
   end else begin
    if (ACol=0) or (ARow=0) then begin
      Canvas.Pen.Color:=clblack;
      Canvas.Brush.Color:= StundenPlan.FixedColor;
    end else begin
     if (state= [gdSelected]) or ((ACol=Selection.Left) and (ARow=Selection.Top)) then begin
      Canvas.Brush.Color:= clwhite;
     end else
      Canvas.Pen.Color:=clwhite;
     Canvas.Font.Color:= clBlack; //Schriftfarbe auch für die Selektierte Zelle
     Canvas.FillRect(Rect);
    end;
   end;
  end else begin
   if (ACol=0) or (ARow=0) then begin
    Canvas.Pen.Color:=clblack;
    Canvas.Brush.Color:= StundenPlan.FixedColor;
   end else begin
    if (state= [gdSelected]) or ((ACol=Selection.Left) and (ARow=Selection.Top)) then
     Canvas.Brush.Color:= clHighlight
    else
     Canvas.Brush.Color:= clwhite;
    Canvas.Pen.Color:=clwhite;
    Canvas.FillRect(Rect);
   end;
  end;
   Font.Color:= $010101; //--> Diese Farbe wird nicht für die selektierte Zelle verwendet
   s:= Cells[ACol,ARow];
   DrawText(Canvas.Handle,PChar(s),length(s),Rect,DT_Left);
  end;
end;
Vielen Dank nochmal an euch alle.

Mfg

Peter
  Mit Zitat antworten Zitat
Antwort Antwort


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