Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   StringGrid Zeile einfärben (https://www.delphipraxis.net/183285-stringgrid-zeile-einfaerben.html)

strom 28. Dez 2014 11:08

StringGrid Zeile einfärben
 
Hallo,

was ist hier falsch am Code? :shock:
leider bekomme ich auch keine Fehlermeldung ?

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
   c : TColor;
begin
   if StringGrid1.Cells[3,Arow]='1' then
      c:=clYellow
   else
      if StringGrid1.Cells[3,Arow]='2' then
         c:=clFuchsia
      else
         if StringGrid1.Cells[3,Arow]='3' then
            c:=clRed;
   if gdSelected in State then
      c:=clred;
   StringGrid1.Canvas.FillRect(Rect);
   StringGrid1.Canvas.Font.Color:=clBlack;
   StringGrid1.Canvas.TextRect(Rect,Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow]);
end;

Bjoerk 28. Dez 2014 11:14

AW: StringGrid Zeile einfärben
 
Welchen Wert hat c wenn keine der Bedingungen erfüllt ist? Und wo wird c verwendet?

himitsu 28. Dez 2014 11:16

AW: StringGrid Zeile einfärben
 
Leider bekommen wir auch keine Beschreibung was passiert, bzw. was nicht passiert und was eigentlich passieren sollte.

Zitat:

leider bekomme ich auch keine Fehlermeldung ?
Doch, das bekommst du!

Zitat:

was ist hier falsch am Code?
DU hast vergessen auf deinen Compiler zu hören und somit die beiden Fehler nicht beachtet.
  • c ist nicht initialisiert
  • c wird nicht verwendet

strom 28. Dez 2014 12:32

AW: StringGrid Zeile einfärben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für Eure Hilfe :)

Es geht jetzt!!

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   if StringGrid1.Cells[3,Arow]='1' then begin
    StringGrid1.Canvas.Brush.Color := clYellow;
    StringGrid1.Canvas.Font.Color := clblack;

  end else
      if StringGrid1.Cells[3,Arow]='2' then
       StringGrid1.Canvas.Brush.Color := clred;
       StringGrid1.Canvas.Font.Color := clblack;
   if gdSelected in State then
        StringGrid1.Canvas.Brush.Color := clred;
        StringGrid1.Canvas.Font.Color := clblack;
   StringGrid1.Canvas.FillRect(Rect);
   StringGrid1.Canvas.Font.Color:=clBlack;
   StringGrid1.Canvas.TextRect(Rect,Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow]);
end;
Noch eine Zusatzfrage, (siehe Bild) wieso wird die erste Spalte mit eingefärbt? Beim selektieren nicht!

Sir Rufo 28. Dez 2014 12:42

AW: StringGrid Zeile einfärben
 
Weil die festen Spalten niemals den Status
Delphi-Quellcode:
gdSelected
haben?

Und wenn du den Code richtig formatierst, dann sieht man auch etwas klarer:
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell( Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState );
begin
  if StringGrid1.Cells[3, ARow] = '1'
  then
    begin
      StringGrid1.Canvas.Brush.Color := clYellow;
      StringGrid1.Canvas.Font.Color := clblack;

    end
  else if StringGrid1.Cells[3, ARow] = '2'
  then
    StringGrid1.Canvas.Brush.Color := clred;
  StringGrid1.Canvas.Font.Color := clblack;
  if gdSelected in State
  then
    StringGrid1.Canvas.Brush.Color := clred;
  StringGrid1.Canvas.Font.Color := clblack;
  StringGrid1.Canvas.FillRect( Rect );
  StringGrid1.Canvas.Font.Color := clblack;
  StringGrid1.Canvas.TextRect( Rect, Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow] );
end;
Du setzt an drei Stellen immer
Delphi-Quellcode:
StringGrid1.Canvas.Font.Color := clblack;
. Wozu das?

Das macht exakt das Gleiche:
Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell( Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState );
begin
  StringGrid1.Canvas.Font.Color := clblack;

  if StringGrid1.Cells[3, ARow] = '1'
  then
    begin
      StringGrid1.Canvas.Brush.Color := clYellow;
    end
  else if StringGrid1.Cells[3, ARow] = '2'
  then
    StringGrid1.Canvas.Brush.Color := clred;
  if gdSelected in State
  then
    StringGrid1.Canvas.Brush.Color := clred;
  StringGrid1.Canvas.FillRect( Rect );
  StringGrid1.Canvas.TextRect( Rect, Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow] );
end;

vagtler 28. Dez 2014 12:57

AW: StringGrid Zeile einfärben
 
Oder noch kürzer:

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell( Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState );
begin
  StringGrid1.Canvas.Font.Color := clblack;

  if (gdSelected in State) or (StringGrid1.Cells[3, ARow] = '2') then
    StringGrid1.Canvas.Brush.Color := clRed
  else if StringGrid1.Cells[3, ARow] = '1' then
    StringGrid1.Canvas.Brush.Color := clYellow;

  StringGrid1.Canvas.FillRect( Rect );
  StringGrid1.Canvas.TextRect( Rect, Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow] );
end;

strom 28. Dez 2014 14:11

AW: StringGrid Zeile einfärben
 
Vielen Dank für die erfolgreiche Hilfe hier im Forum! 8-)

Wenn ich jetzt noch ein Icon aus einer ImageList hinzufügen möchte,
muss ich was beachten?

Dieses hier funktioniert leider nicht!

Delphi-Quellcode:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  var
  X, Y: Integer;
begin
 StringGrid1.Canvas.Font.Color := clblack;

  if StringGrid1.Cells[3, ARow] = '1'
  then
    begin
      StringGrid1.Canvas.Brush.Color := clYellow;
      ImageList1.Draw(StringGrid1.Canvas, X, Y, 0, true); // Was ist hier falsch? 
    end
  else if StringGrid1.Cells[3, ARow] = '2'
  then
    StringGrid1.Canvas.Brush.Color := clgray;
  if gdSelected in State
  then
    StringGrid1.Canvas.Brush.Color := clred;
  StringGrid1.Canvas.FillRect( Rect );
  StringGrid1.Canvas.TextRect( Rect, Rect.Left, Rect.Top, StringGrid1.Cells[ACol, ARow] );
end;

Aviator 28. Dez 2014 14:15

AW: StringGrid Zeile einfärben
 
Wie sind denn die Werte von X und Y? Du deklarierst zwar die Variablen, weißt diesen aber keine Werte zu. Somit sind die undefiniert und können irgendwo in einem negativen Bereich liegen. Auch hier hast du die Compiler Meldung nicht beachtet. Der schreibt nämlich genau das hin.

Weise also den beiden Variablen einen Wert zu und schon müsste das funktionieren.

Hier vielleicht noch ein Tipp. Delphi-Referenz durchsuchenMouse.CursorPos, Delphi-Referenz durchsuchenScreenToClient oder Delphi-Referenz durchsuchenClientToScreen könnten hier fürs erste helfen. Du könntest als X und Y Werte die passenden Rect.Top und Rect.Left Werte übernehmen.

himitsu 28. Dez 2014 15:07

AW: StringGrid Zeile einfärben
 
Zitat:

Zitat von strom (Beitrag 1284854)
// Was ist hier falsch?

Zitat:

Zitat von Aviator (Beitrag 1284855)
Wie sind denn die Werte von X und Y? Du deklarierst zwar die Variablen, weißt diesen aber keine Werte zu. ...

Ich kann mich nur noch einmal wiederholen und hoffen der TE hört endlich mal auf das, was ihm jemand sagt und beachtet es auch.
Zitat:

Zitat von himitsu (Beitrag 1284845)
Zitat:

was ist hier falsch am Code?
DU hast vergessen auf deinen Compiler zu hören und somit die beiden Fehler nicht beachtet.
  • c ist nicht initialisiert
  • c wird nicht verwendet


strom 28. Dez 2014 16:21

AW: StringGrid Zeile einfärben
 
hallo,

dieses funktioniert leider auch nicht!

Delphi-Quellcode:
var
  X, Y: Integer;
begin
  if StringGrid1.Cells[3, ARow] = '1'
   then
    begin
      StringGrid1.Canvas.Brush.Color := clYellow;  
    X := Rect.Left;
    Y := Rect.Top;
    ImageList1.Draw(StringGrid1.Canvas, X, Y, 0, true); { 0 = erstes Image in ImageList }
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:16 Uhr.
Seite 1 von 3  1 23      

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