![]() |
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; |
AW: Stringgrid zeilen färben
-Statt StringGrid1 würde ich (Sender as TStringGrid) nehmen.
-ich würde auf with verzichten
Delphi-Quellcode:
Ich vermute mal, dass die 1. Spalte fixiert ist.
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; |
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:
Und dann noch beim Schließen des Detailfensters
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;
Delphi-Quellcode:
setzen (ich nehme mal an, Dein Formular hört auf frmDetail)
FCurrentRow := -1
Delphi-Quellcode:
Gruß
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; |
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 |
AW: Stringgrid zeilen färben
Zitat:
|
AW: Stringgrid zeilen färben
Zitat:
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. |
AW: Stringgrid zeilen färben
Häckchen an das Problem 1!!
Ich habe einfach mal
Delphi-Quellcode:
durch das hier ersetzt:
if (state = [gdSelected]) then
Delphi-Quellcode:
if (gdFixed in State) then
|
AW: Stringgrid zeilen färben
Hab es gelöst:
Delphi-Quellcode:
Fcurrentrow muss man eben so setzen wie mans braucht...
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; 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! |
AW: Stringgrid zeilen färben
Zitat:
|
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:
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.
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; Wo ist mein Fehler? LG Fliege |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 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