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...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 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