StringGrid Zeilen einfärben

Für Fragen von Einsteigern und Programmieranfängern...
aldi
Beiträge: 59
Registriert: Sa 26. Apr 2014, 14:03

StringGrid Zeilen einfärben

Beitrag von aldi »

Hallo,
schon ein wenig nervig :-)

Möchte gerne die Zeilen im StringGrid einfärben. bzw. wenn sich in der 3 Spalte bestimmte Wörter befinden,
möchte ich die Zeile einfärben.

so ungefähr aber ohne Funktion :-(

Code: Alles auswählen

 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
    var
     Wert: string;
begin
  // Wert := StringGrid1.FieldAddress('Status');
  if Wert = 'Eingang' then begin
    StringGrid1.Canvas.Brush.Color:= clyellow;
    StringGrid1.Canvas.Font.Color := clblack;
  end else if Wert = 'Disponiert' then begin
 
  end;
end;

Yogi72108
Beiträge: 22
Registriert: Fr 10. Feb 2012, 19:09
OS, Lazarus, FPC: Debian wheezy (FPC 2.7.1 SVN 29278; Laz 1.3 SVN 47189)
CPU-Target: 32Bit
Wohnort: im Schwabenländle

Re: StringGrid Zeilen einfärben

Beitrag von Yogi72108 »

So funktioniert das auch nicht :mrgreen:
Du setzt zwar den Brush, aber der hat keinen Einfluss auf die Hintergrundfarbe des Textes.

Das sollte gehen:

Code: Alles auswählen

 
StringGrid1.Canvas.Brush.Color:= clyellow;
StringGrid1.Canvas.FillRect(aRect); // Das füllt den Hintegrund
StringGrid1.Canvas.Font.Color := clblack;
Aber ich würde Dir dringend empfehlen Dich mal mit der Dokumentation auseinanderzusetzen.
Das Lazarus-Wiki gibt da recht viel her :!:

aldi
Beiträge: 59
Registriert: Sa 26. Apr 2014, 14:03

Re: StringGrid Zeilen einfärben

Beitrag von aldi »

Hallo,

jetzt wird die Zeile gelb eingefärbt, aber dafür ist der Text weg ! :shock:

Code: Alles auswählen

 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
 if StringGrid1.Cells[3,Arow]='Eingang' then
  begin
   StringGrid1.Canvas.Brush.Color := clYellow;
   StringGrid1.Canvas.FillRect(aRect);
 end;
end; 

aldi
Beiträge: 59
Registriert: Sa 26. Apr 2014, 14:03

Re: StringGrid Zeilen einfärben

Beitrag von aldi »

Ok,

habe das Problem selber gelöst, dafür aber ein neues :cry:

Code: Alles auswählen

 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
 if StringGrid1.Cells[3,Arow]='Eingang' then
  begin
   StringGrid1.Canvas.Brush.Color := clYellow;
   StringGrid1.Canvas.FillRect(aRect);
   StringGrid1.Canvas.TextOut(aRect.Left, aRect.Top, StringGrid1.Cells[ACol, ARow]);
 end;
end;
das neue Problem ist, dass die selektierte Zeile jetzt eine weiße Schrift hat ?? auf gelben Hintergrund :oops:

Yogi72108
Beiträge: 22
Registriert: Fr 10. Feb 2012, 19:09
OS, Lazarus, FPC: Debian wheezy (FPC 2.7.1 SVN 29278; Laz 1.3 SVN 47189)
CPU-Target: 32Bit
Wohnort: im Schwabenländle

Re: StringGrid Zeilen einfärben

Beitrag von Yogi72108 »

Ok, Hier gehts los :idea:

Code: Alles auswählen

procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
 if StringGrid1.Cells[3,Arow]='Eingang' then
  begin
   if aState=gdSelected then
      StringGrid1.Canvas.Brush.Color:=clSkyBlue
   else
      StringGrid1.Canvas.Brush.Color := clYellow;
   StringGrid1.Canvas.FillRect(aRect);
   StringGrid1.Canvas.Font.Color:=clBlack;
   StringGrid1.Canvas.TextOut(aRect.Left, aRect.Top, StringGrid1.Cells[ACol, ARow]);
 end;
end;
Wenn Du schon selbst die Darstellung übernimmst, dann musst Du auch ALLES selbst zeichnen :!:

Annsonsten hilft das hier vielleicht noch ein wenig weiter:
:P http://lazarus-ccr.sourceforge.net/docs ... grids.html

aldi
Beiträge: 59
Registriert: Sa 26. Apr 2014, 14:03

Re: StringGrid Zeilen einfärben

Beitrag von aldi »

Hallo Yogi72108,

es kommt immer diese Meldung hier ?
Dateianhänge
grid1fehler.png

Yogi72108
Beiträge: 22
Registriert: Fr 10. Feb 2012, 19:09
OS, Lazarus, FPC: Debian wheezy (FPC 2.7.1 SVN 29278; Laz 1.3 SVN 47189)
CPU-Target: 32Bit
Wohnort: im Schwabenländle

Re: StringGrid Zeilen einfärben

Beitrag von Yogi72108 »

Upps, meinFehler :wink:
das muss heissen:

Code: Alles auswählen

if gdSelected in aState then
aState ist ein Set; da gibts dann noch mehrere Möglichkeiten:
:arrow: http://lazarus-ccr.sourceforge.net/docs ... state.html

aldi
Beiträge: 59
Registriert: Sa 26. Apr 2014, 14:03

Re: StringGrid Zeilen einfärben

Beitrag von aldi »

Yogi72108 es geht :D :D

noch eine Frage, was ich nicht verstehe!

Hier die ersten Bezeichnungen, "Eingang" und "In Bearbeitung" funktionieren !
Aber die dritte Funktion "Einheit ausgerückt" nicht?

Code: Alles auswählen

 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
 if StringGrid1.Cells[3,Arow]='Eingang' then
  begin
   if gdSelected in aState then
      StringGrid1.Canvas.Brush.Color:=clSkyBlue
   else
      StringGrid1.Canvas.Brush.Color := clYellow;
   StringGrid1.Canvas.FillRect(aRect);
   StringGrid1.Canvas.Font.Color:=clBlack;
   StringGrid1.Canvas.TextOut(aRect.Left, aRect.Top, StringGrid1.Cells[ACol, ARow]);
 end;
  if StringGrid1.Cells[3,Arow]='In Bearbeitung' then
  begin
   if gdSelected in aState then
      StringGrid1.Canvas.Brush.Color:=clSkyBlue
   else
      StringGrid1.Canvas.Brush.Color := clFuchsia;
   StringGrid1.Canvas.FillRect(aRect);
   StringGrid1.Canvas.Font.Color:=clBlack;
   StringGrid1.Canvas.TextOut(aRect.Left, aRect.Top, StringGrid1.Cells[ACol, ARow]);
end;
   if StringGrid1.Cells[3,Arow]='Einheit ausgerückt' then
  begin
   if gdSelected in aState then
      StringGrid1.Canvas.Brush.Color:=clSkyBlue
   else
      StringGrid1.Canvas.Brush.Color := clred;
   StringGrid1.Canvas.FillRect(aRect);
   StringGrid1.Canvas.Font.Color:=clBlack;
   StringGrid1.Canvas.TextOut(aRect.Left, aRect.Top, StringGrid1.Cells[ACol, ARow]);
 end;
end; 

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: StringGrid Zeilen einfärben

Beitrag von theo »

Hatten wir das nicht neulich?

Es geht auch einfacher, mit dem OnPrepareCanvas Event.

Code: Alles auswählen

procedure TForm1.StringGrid1PrepareCanvas(sender: TObject; aCol, aRow: Integer;
  aState: TGridDrawState);
var Sg: TStringGrid;
begin
    Sg:=(Sender as TStringGrid);
    if gdSelected in aState then  Sg.Canvas.Brush.Color:=clYellow;
    if (aCol=2) and (aRow=2) then
      begin
        Sg.Canvas.Brush.Color:=clGreen;
        Sg.Canvas.Font.Color:=clWhite;
      end;
end;
http://wiki.lazarus.freepascal.org/Grids_Reference_Page
Zuletzt geändert von theo am Do 1. Mai 2014, 12:42, insgesamt 1-mal geändert.

Yogi72108
Beiträge: 22
Registriert: Fr 10. Feb 2012, 19:09
OS, Lazarus, FPC: Debian wheezy (FPC 2.7.1 SVN 29278; Laz 1.3 SVN 47189)
CPU-Target: 32Bit
Wohnort: im Schwabenländle

Re: StringGrid Zeilen einfärben

Beitrag von Yogi72108 »

Das sieht sowieso fürchterlich aus :twisted: , Du machst alles doppelt und dreichach
Hier was einfacheres:

Code: Alles auswählen

procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
var
   c : TColor;
   s : TTextStyle;
begin
   if StringGrid1.Cells[3,Arow]='Eingang' then
      c:=clYellow
   else
      if StringGrid1.Cells[3,Arow]='In Bearbeitung' then
         c:=clFuchsia
      else
         if StringGrid1.Cells[3,Arow]='Einheit ausgerückt' then
            c:=clRed;
   if gdSelected in AState then
      c:=clSkyBlue;
   StringGrid1.Canvas.FillRect(aRect);
   StringGrid1.Canvas.Font.Color:=clBlack;
   FillChar(s,SizeOf(s),#0);
   s.Layout:=tlCenter;
   StringGrid1.Canvas.TextRect(aRect,aRect.Left, aRect.Top, StringGrid1.Cells[ACol, ARow],s);
end;
Die Verwendung von TextRect stellt sicher, daß der Text nicht über aRect hinaus dargestellt wird, es könnten sonst die Zellgrenzen des Grids überschritten werden, was nicht shön aussieht.
Die Stringvergleiche sind eventuell problematisch, da die Strings auch wirklich gleich sein müssen, ein Leerzeichen zuviel irgendwo und schon gehts schief. Überprüfe ob in StringGrid1.Cells[3,aRow] auch wirklich "Einheit ausgerückt" steht und nicht etwa sowas wie "Einheit ausgerückt "

aldi
Beiträge: 59
Registriert: Sa 26. Apr 2014, 14:03

Re: StringGrid Zeilen einfärben

Beitrag von aldi »

Yogi72108,

auch wenn ich nervig bin, es funktioniert leider nicht! Eine Fehlermeldung bekomme ich auch nicht ? :cry:

aldi
Beiträge: 59
Registriert: Sa 26. Apr 2014, 14:03

Re: StringGrid Zeilen einfärben

Beitrag von aldi »

Yogi72108,

die Schrift ändert sich ?? siehe "sofort ausführen MIN"
Dateianhänge
GridSchrift.png

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: StringGrid Zeilen einfärben

Beitrag von theo »

Hallooo Aldi. Du lesen mit?

Hatte oben auch noch eine einfachere Lösung gepostet. Ist die nix für dich?

aldi
Beiträge: 59
Registriert: Sa 26. Apr 2014, 14:03

Re: StringGrid Zeilen einfärben

Beitrag von aldi »

Hallo Theo,
erstmal vielen Dank, aber ich suche was anderes!

Möchte im StringGrid unterschiedliche Zeilen einfärben, dieses ist aber von bestimmten
Voraussetzungen abhängig!

aldi
Beiträge: 59
Registriert: Sa 26. Apr 2014, 14:03

Re: StringGrid Zeilen einfärben

Beitrag von aldi »

So in diese Richtung :lol:
Dateianhänge
aktuell.png

Antworten