Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Stringgrid zeilen färben (https://www.delphipraxis.net/175827-stringgrid-zeilen-faerben.html)

koernel 22. Jul 2013 15:20

Stringgrid zeilen färben
 
Hallo liebe Wissende,

in einem Stringgrid färbe ich jede 2te Zeile um es übersichtlicher zu machen.
Deshalb muss ich allerdings auch markierte Zeilen andersfarbig gestalten weil sonst die bereits gefärbten Zeilen sich in markiertem Zustand nicht von den anderen abheben.

Problem 1 : Hierbei entsteht bereits das Problem dass die erste Spalte nicht mitgefärbt wird.

Problem 2: Durch ein doppelklick auf eine Zeile öffnet sich ein Detailfenster. Da man durch scrollen usw. irgendwann nicht mehr weiss zu welcher Zeile die Details gehören möchte ich diese Zeile bis zum nächsten Doppelklick auch farblich hervorheben.
Ich hab schon sovieles gelesen und einiges versucht aber nichts führt zu dem gewünschten ergebnis...

Hier der Code im OnDrawCell Ereignis:
Delphi-Quellcode:
procedure TfrmMain.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
if not Odd(ARow) and not (gdFixed in State) then
    with StringGrid1 do
    begin
      Canvas.Brush.Color := TColor($D9D9C0);
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
    end;

    if (state = [gdSelected]) then
    with Stringgrid1 do
    begin
      Canvas.Brush.Color := TColor($FFCC99);
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);

    end;
end;

mkinzler 22. Jul 2013 16:13

AW: Stringgrid zeilen färben
 
-Statt StringGrid1 würde ich (Sender as TStringGrid) nehmen.
-ich würde auf with verzichten

Delphi-Quellcode:
procedure TfrmMain.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
    gr: TStringGrid;
begin
  gr := (Sender as TStringGrid);
  if not Odd(ARow) and not (gdFixed in State) then
  begin
      gr.Canvas.Brush.Color := TColor($D9D9C0);
      gr.Canvas.FillRect(Rect);
      gr.Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
  end;

    if (state = [gdSelected]) then
    begin
      gr.Canvas.Brush.Color := TColor($FFCC99);
      gr.Canvas.FillRect(Rect);
      gr. Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);
    end;
end;
Ich vermute mal, dass die 1. Spalte fixiert ist.

Volker Z. 22. Jul 2013 23:29

AW: Stringgrid zeilen färben
 
Hallo,

ich weiß jetzt nicht, ob ich Dein Anliegen richtig verstanden habe, aber Du kannst mal versuchen ob Dir folgendes weiterhilft:
Delphi-Quellcode:
type
  TfrmMain = class(TForm)
  private
    FCurrentRow : Integer;
    procedure WMDetailClose (var Msg : TMessage); message WM_DETAILCLOSE;
  end;

procedure TfrmMain.WMDetailClose(var Msg: TMessage);
begin
  FCurrentRow := -1;
  StringGrid1.Invalidate
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  // Deine Initialisierungen
  FCurrentRow := -1
end;

procedure TfrmMain.StringGrid1DblClick(Sender: TObject);
begin
  // Deine Aktionen
  FCurrentRow := StringGrid1.Row;
  StringGrid1.Invalidate
end;

procedure TfrmMain.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  c : TColor;
begin
  if ARow = FCurrentRow then
    c := TColor ($FFCC99)
  else
    if not ((gdFixed in State) or Odd (ARow)) then
      c := TColor ($D9D9C0)
    else
      Exit;

  Stringgrid1.Canvas.Brush.Color := c;
  Stringgrid1.Canvas.FillRect (Rect);
  Stringgrid1.Canvas.TextOut (Rect.Left + 2, Rect.Top + 2, Stringgrid1.Cells [ACol, ARow])
end;
Und dann noch beim Schließen des Detailfensters
Delphi-Quellcode:
FCurrentRow := -1
setzen (ich nehme mal an, Dein Formular hört auf frmDetail)
Delphi-Quellcode:
const
  WM_DETAILCLOSE = WM_USER + 1;

type
  TfrmDetail = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    // Deine Deklarationen
  end;

procedure TfrmDetail.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  SendMessage (Application.MainFormHandle, WM_DETAILCLOSE, 0, 0)
end;
Gruß

ConnorMcLeod 23. Jul 2013 06:31

AW: Stringgrid zeilen färben
 
Problem 1: if not Odd(ARow) färbt nur Zeilen mit gerader Laufnummer.
Problem 2: Du brauchst mehrere Farben, weil es mehrere Statusvarianten gibt:
- normal even: zB clWindow
- normal odd: zB clInfoBk
- selektiert: clHighlight
- normal even/doppeltgeklickt ...
- normal odd/doppeltgeklickt ...
- selektiert/doppeltgeklickt ...

Welche Zeile doppeltgeklickt wurde, merkst Du Dir in einer extra Variablen, schlimmstenfalls im Tag des Grids, und kannst dann entsprechend verzweigen.
HTH

DeddyH 23. Jul 2013 07:08

AW: Stringgrid zeilen färben
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1222320)
Welche Zeile doppeltgeklickt wurde, merkst Du Dir in einer extra Variablen, schlimmstenfalls im Tag des Grids, und kannst dann entsprechend verzweigen.

Müsste die doppelgeklickte Zeile nicht automatisch der Row-Eigenschaft des Grids entsprechen, oder mache ich einen Denkfehler?

koernel 23. Jul 2013 07:46

AW: Stringgrid zeilen färben
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1222320)
Problem 1: if not Odd(ARow) färbt nur Zeilen mit gerader Laufnummer.

Das ist schon klar... Nur rede ich in diesem Zusammenhang vonn Spalten. Quasi Columns. Das komische daran ist dass die erste Spalte sich erst dann färbt wenn ich irgendwo anders hinklicke... Also nicht in die Tabelle.

Vielen dank für die vielen Antworten ich werde mich mal durcharbeiten und Rückmeldung geben.


Edit: Achja und bei Problem 1 handelt es sich auch nicht um eine fixed column.

koernel 23. Jul 2013 09:53

AW: Stringgrid zeilen färben
 
Häckchen an das Problem 1!!

Ich habe einfach mal

Delphi-Quellcode:
if (state = [gdSelected]) then
durch das hier ersetzt:

Delphi-Quellcode:
 if (gdFixed in State) then

koernel 23. Jul 2013 12:44

AW: Stringgrid zeilen färben
 
Hab es gelöst:
Delphi-Quellcode:
    if ARow = FCurrentRow1 then
    c := TColor ($00FF00)
  else
    if not ((gdFixed in State) or Odd (ARow)) then
      c := TColor ($D9D9C0)
        else
        c := clwhite;


  Stringgrid1.Canvas.Brush.Color := c;
  Stringgrid1.Canvas.FillRect (Rect);
  Stringgrid1.Canvas.TextOut (Rect.Left + 2, Rect.Top + 2, Stringgrid1.Cells [ACol, ARow]);

  if (gdSelected in state) then
    with Stringgrid1 do
    begin
      Canvas.Brush.Color := TColor($FFCC99);
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);

    end;
Fcurrentrow muss man eben so setzen wie mans braucht...
Volkers Ansatz stimmte nicht ganz weil da auch beim scrollen nur jede zweite Zeile markiert wurde. Aber damit konnte ich was anfangen!

Vielen dank euch allen.
Bei den Temperaturen gestern hab ich einen Denkanstoß gebraucht!

ConnorMcLeod 23. Jul 2013 13:15

AW: Stringgrid zeilen färben
 
Zitat:

Zitat von DeddyH (Beitrag 1222322)
Zitat:

Zitat von ConnorMcLeod (Beitrag 1222320)
Welche Zeile doppeltgeklickt wurde, merkst Du Dir in einer extra Variablen, schlimmstenfalls im Tag des Grids, und kannst dann entsprechend verzweigen.

Müsste die doppelgeklickte Zeile nicht automatisch der Row-Eigenschaft des Grids entsprechen, oder mache ich einen Denkfehler?

Mir ging es darum, sich zu merken, wo das Doppelklickfenster aufgeht. Man kann IIUC danach einfach weiterklicken und das Doppelklickfenster soll immer noch der damals doppelt geklickten Zeile/Spalte entsprechen...

DieFliege 6. Jul 2024 09:37

AW: Stringgrid zeilen färben
 
Hallo Zusammen :-)

Leider bin ich mal wieder etwas begriffsstutzig oder zu naiv um mein Vorhaben umzusetzen:

Also, ich habe ein StringGrid gefüllt mit Daten. Nun möchte ich alle Zeilen in dem StringGrid farbig machen, die einen bestimmten Wert ("x") in einer Spalte haben. Dazu habe ich erst mal was einfaches gebastelt: Form, StringGrid und Button.

Dies ist mein Code:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Rect   : TRect;

begin
  //--
  if StringGrid1.Cells[2,2] = 'x' then
    begin
      StringGrid1.Canvas.Brush.Color := clRed;
      StringGrid1.Canvas.FillRect(Rect);
      StringGrid1.Canvas.TextOut(Rect.Left, Rect.Top, StringGrid1.Cells[2, 2]);
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //--
  StringGrid1.Cells[2,2] := 'x';
end;
Hier gebe ich zum Testen die Zelle vor, wo sich der gesuchte Wert befindet, später will ich das mit einer Schleife zeilenweise durchlaufen lassen.

Wo ist mein Fehler?

LG Fliege

dummzeuch 6. Jul 2024 10:19

AW: Stringgrid zeilen färben
 
Das Du vorhast, geht nur mit OwnerDrawing. Sonst wird das, was Du zeichnest beim nächsten Redraw automatisch wieder übermalt.

Und dazu gibt es in den vorigen Antworten diverse Beispiele.

himitsu 6. Jul 2024 10:24

AW: Stringgrid zeilen färben
 
und OnDrawCell

DieFliege 6. Jul 2024 10:56

AW: Stringgrid zeilen färben
 
... ok, Danke euch beiden. Da ich bereits ein StringGrid habe und nutze, mein Gedanke sich aber wohl nicht "einfach" umsetzen lässt, wurde der Gedanke an "bunte Zeilen" verworfen.

Danke schön & schönes Wochenende :-)

jaenicke 6. Jul 2024 11:33

AW: Stringgrid zeilen färben
 
Zitat:

Zitat von DieFliege (Beitrag 1538630)
... ok, Danke euch beiden. Da ich bereits ein StringGrid habe und nutze, mein Gedanke sich aber wohl nicht "einfach" umsetzen lässt, wurde der Gedanke an "bunte Zeilen" verworfen.

Das ist sogar sehr einfach. Du musst es nur halt machen wie beschrieben...

Du musst darauf reagieren, dass der Inhalt neu gezeichnet werden muss. Deshalb bringt es nichts, wenn du es nur einmalig per Buttonklick zeichnest. Stell DefaultDrawing auf False, dann kannst du im OnDrawCell z.B. das machen:
Delphi-Quellcode:
procedure TForm.StringGridDrawCell(Sender: TObject; ACol, ARow: LongInt; Rect: TRect; State: TGridDrawState);
var
  Grid: TStringGrid;
begin
  Grid := Sender as TStringGrid;
  if gdFixed in State then
  begin
    Grid.Canvas.Brush.Color := clInactiveCaption;
    Grid.Canvas.Font.Color := clBlack;
  end
  else
  if gdSelected in State then
  begin
    Grid.Canvas.Brush.Color := clHighlight;
    Grid.Canvas.Font.Color := clHighlightText;
  end
  else
  begin
    if Grid.Cells[ACol, ARow] = 'x' then
      Grid.Canvas.Brush.Color := clRed
    else
      Grid.Canvas.Brush.Color := clWindow;
    Grid.Canvas.Font.Color := clWindowText;
  end;
  Grid.Canvas.FillRect(Rect);
  Grid.Canvas.TextOut(Rect.Left + 3, Rect.Top + 3, Grid.Cells[ACol, ARow]);
end;

DieFliege 6. Jul 2024 12:34

AW: Stringgrid zeilen färben
 
Hallo Sebastian,

vielen Dank, nun habe ich es verstanden, was ihr gemeint habt.

Jetzt versuche ich nicht nur eine Zelle zu färben, sondern die ganze Zeile - Das sollte ich aber hinbekommen, wenn ich den Code komplett kapiert habe ;-)

Vielen Dank noch mal

LG DieFliege

TUhr 6. Jul 2024 15:43

AW: Stringgrid zeilen färben
 
Hallo,

Du mußt Deinen Code bei OnDrawCell des Grid's unterbringen.

MfG

himitsu 6. Jul 2024 16:38

AW: Stringgrid zeilen färben
 
Zitat:

Delphi-Quellcode:
if gdSelected in State

Bei der einzelnen Zellen/Spalten, könnte man noch überlegen die Reihenfolge zu ändern.
Bei der ganzen Zeile wäre es aber ungünstig, wenn sie komplett andersfarbig wird und die blaue Selektion vollständig überdeckt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz