AGB  ·  Datenschutz  ·  Impressum  







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

Stringgrid zeilen färben

Ein Thema von koernel · begonnen am 22. Jul 2013 · letzter Beitrag vom 23. Jul 2013
Antwort Antwort
koernel

Registriert seit: 1. Apr 2010
4 Beiträge
 
#1

Stringgrid zeilen färben

  Alt 22. Jul 2013, 15:20
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;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: Stringgrid zeilen färben

  Alt 22. Jul 2013, 16:13
-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.
Markus Kinzler
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#3

AW: Stringgrid zeilen färben

  Alt 22. Jul 2013, 23:29
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 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ß
Volker Zeller
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Stringgrid zeilen färben

  Alt 23. Jul 2013, 06:31
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
Nr.1 Delphi-Tool: [F7]

Geändert von ConnorMcLeod (23. Jul 2013 um 06:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Stringgrid zeilen färben

  Alt 23. Jul 2013, 07:08
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
koernel

Registriert seit: 1. Apr 2010
4 Beiträge
 
#6

AW: Stringgrid zeilen färben

  Alt 23. Jul 2013, 07:46
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.
  Mit Zitat antworten Zitat
koernel

Registriert seit: 1. Apr 2010
4 Beiträge
 
#7

AW: Stringgrid zeilen färben

  Alt 23. Jul 2013, 09:53
Häckchen an das Problem 1!!

Ich habe einfach mal

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

 if (gdFixed in State) then
  Mit Zitat antworten Zitat
koernel

Registriert seit: 1. Apr 2010
4 Beiträge
 
#8

AW: Stringgrid zeilen färben

  Alt 23. Jul 2013, 12:44
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!
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Stringgrid zeilen färben

  Alt 23. Jul 2013, 13:15
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...
Nr.1 Delphi-Tool: [F7]
  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 02:38 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