![]() |
Re: nochmals StringGridDrawcell
Ich kenne das JediGrid zwar auch net, aber folgendes sollte auch damit funktionieren. Sonst teste mal einfach mit nem Standard Grid
Delphi-Quellcode:
evtl. musst Du noch ACol, ARow in Col, Row umbenennen. DefaultDrwaing auf True
procedure TForm1.SG1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); const tFormat = DT_SINGLELINE or DT_CENTER or DT_VCENTER; var tText: String; begin with (Sender as TStringGrid) do begin tText:= Trim(Cells[ACol, ARow]); // Text der Zelle if (gdFixed in State) then begin // feste Zelle? Canvas.Brush.Color:= clBtnFace; // HintergrundFarbe end else if (gdSelected in State) then begin // markierte Zelle Canvas.Brush.Color:= clHighlight; Canvas.Font.Color:= clBlack; end else begin // normale Zelle Canvas.Brush.Color:= clWindow; if tText = '2' then Canvas.Brush.Color:= clgreen; // ... // ... end; // <> (gdFixed in State) Canvas.FillRect(Rect); // Hintergrund zeichnen DrawText(Canvas.Handle, PChar(tText), Length(tText), Rect, tFormat); // Textausgabe end; // with end; LG Mario |
Re: nochmals StringGridDrawcell
Hallo Hobby-Programmierer,
Ich habe deine Methode ausprobiert und komme auch mit Delphi Standard SG zum Selben Ergebnis 4spaltige Wiederholung der Zelle 1,1 und keine Farbe Ich werde es weiter Probieren Vielen Dank. |
Re: nochmals StringGridDrawcell
Zitat:
Zitat:
Ansonsten verwendest du mit with (sender asstringgrid) do ... cells[col,row] nicht die beiden Übergebenen col und row sondern sg1.col und sg1.row = die aktuell selektierte Zelle. Damit steht dann auch immer das gleiche in allen Zellen drin. Gruß Frank |
Re: nochmals StringGridDrawcell
Liste der Anhänge anzeigen (Anzahl: 1)
siehe Anhang
[edit] Das evtl. umbenennen von ACol, ARow bezog sich auf das JediGrid. |
Re: nochmals StringGridDrawcell
Hallo Keldorn, Hallo Hobby-Programmierer,
Endlich Farbe im Grid :drunken: Aber ich verdeutliche mal mein Problem Cell[2,0] = FixedRow Cell[2,1] = 1 Ausgangswert Cell[2,2] = 2 Vergleich mit Cell 2,1 ==> Zelle 2,2 Farbe Grün Cell[2,3] = 3 Vergleich mit Cell 2,2 ==> Zelle 2,3 Farbe Grün Cell[2,4] = 2 Vergleich mit Cell 2,3 ==> Zelle 2,4 Farbe Rot !!! Cell[2,5] = 3 Vergleich mit Cell 2,4 ==> Zelle 2,5 Farbe Grün !! In der Rechnen Prozedur habe ich das versucht anzudeuten Der Code ist nicht vollständig und fehlerhaft die Logik dahinter meiner Ansicht nach dennoch richtig. 1. wandle String in extended um (weil Kommazahlen vorhanden) 2. Vergleiche extended Zahlen 3. weise Farbe zu und färbe Grid Ich hoffe auf eure weitere Hilfe. Gruß Frank |
Re: nochmals StringGridDrawcell
Hallo,
das Ereignis OnDrawCell wird automatisch ausgelöst, wenn eine Zelle neu gezeichnet werden muss, wobei das Ereignis für jede Zelle einzeln ausgelöst wird. Schreibst Du Code für die Behandlung des OnDrawCell-Ereignisses musst Du das immer beachten. Die Parameter ACol und ARow liefern Dir die aktuell zu zeichnende Adresse, im Parameter Rect sind die Koordinaten der Zelle enthalten. Möchtest Du nun auf Grund von Zellinhalten einfärben ist die Bedingung relativ zur aktuell zu zeichnende Zelle zu stellen. Wenn ich Dein Beispiel richtig interpretiere soll eine Zelle rot eingefärbt werden, wenn der Inhalt größer als der in der darüberliegenden Zelle ist. ARow = 0 -> erste Zeile ist fixed. ARow = 1 -> zweite(erste Wertzeile) Zeile muss nicht beachtet werden. ARow >= 2 -> dritte Zeile und weitere vergleichen mit Zelle oberhalb Daraus ergib sich folgender grober Ansatz:
Delphi-Quellcode:
if ARow >= 2 then
if StrToFloat(Grid.Cells[ACol,ARow]) > StrToFloat(Grid.Cells[ACol,ARow -1]) then begin //Farbe setzen //Zelle zeichnen //Text ausgeben end; |
Re: nochmals StringGridDrawcell
Machs dir einfach und übersichtlich, erstelle für jede Aufgabe eine eigene Funktion.
Delphi-Quellcode:
function CalcCellColor(AGrid: TStringGrid; ACol, AROw: Integer): TColor;
var d1, d2: Double; begin Result := AGrid.Color; if ARow > 1 then begin try d1 := StrToFloat(AGrid.Cells[ACol, AROw - 1]); d2 := StrToFloat(AGrid.Cells[ACol, AROw]); if d1 < d2 then Result := clGreen else if d1 > d2 then Result := clRed; except end; end; end; // normale Zelle Canvas.Brush.Color:= CalcCellColor(Sender as TStringGrid, ACol, ARow); |
Re: nochmals StringGridDrawcell
Hallo,
Lannes hat Recht. Du hast das DrawCell nicht verstanden. Unter Windows rufst nicht du ein DrawCell auf, sondern Windows, du reagierst nur drauf ! Fang mal mit einem einfachen Bsp. an. Erzeuge durch Doppelklick auf das Ereignis OnDrawCell eine Methode GridXDrawCell (macht Delphi). Dort rufst du dein SGDrawCell (?) auf. Heiko |
Re: nochmals StringGridDrawcell
vielleicht so
Delphi-Quellcode:
if ARow > 1 then begin
if StrToFloatDef(Cells[ACol, ARow], 0.0) > StrToFloatDef(Cells[ACol, ARow - 1], 0.0) then Canvas.Brush.Color:= clgreen else Canvas.Brush.Color:= clred; end; |
Re: nochmals StringGridDrawcell
Hallo Helfer,
@ Lannes und hoika Ich würde es ja auch gerne selber schreiben, wenn ich davon genug wüßte. vielleicht könnt ihr mir ein umfangreiches Tutorial empfehlen in dem Stringgrid gut beschrieben wird. Ich hab den Tip von Blub eingebaut und bekomme jetzt ab der Zelle(2,3) die erste FarbZeile geliefert. Warum die ganze Zeile farbig wird... Ich muß mich wohl mit abfinden. Warum Zeile 1 ohne Farbe ist ist klar. Bei Zeile 2 sieht das schon anders aus?? Ansonsten bedanke ich mich für die schnelle Hilfe. Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:05 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