У меня есть StringGrid как на рисунке http://smages.com/ Мне надо раскрасить строки в зависимости от значения в поле 8. Если значение положительное, то зеленым цветом. Если значение отрицательное, то красным цветом. Как это сделать? Только, пожалуйста объясните как начинающему.
Я пробовал вот такие функции:
| Код | procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); Var StringGrid: TStringGrid; Can: TCanvas; begin StringGrid := Sender as TStringGrid; Can := StringGrid.Canvas; Can.Font := StringGrid.Font; if (ARow >= StringGrid.FixedRows) and (ACol >= StringGrid.FixedCols) then Can.Brush.Color := StringGrid.Color else Can.Brush.Color := StringGrid.FixedColor; //============== if ((ACol = 1) and (ARow = 1)) or ((ACol = 3) and (ARow = 1)) or ((ACol = 2) and (ARow = 2)) or ((ACol = 3) and (ARow = 3)) or ((ACol = 1) and (ARow = 3)) then Can.Brush.Color := clRed; //============== if (gdSelected in State) then begin Can.Font.Color := clHighlightText; Can.Brush.Color := clHighlight; end; Can.FillRect(Rect); Can.TextOut(Rect.Left+2,Rect.Top+2, StringGrid.Cells[ACol, ARow]); end;
|
И такую:
| Код | procedure TForm1.StringGrid1DrawCell(Sender:TObject; ACol, ARow:Integer; Rect:TRect; State: TGridDrawState); Const //сдесь определяем Ваш цвет. Так же можно использовать //цвета по умолчанию. clPaleGreen = TColor($CCFFCC); clPaleRed = TColor($CCCCFF); begin //Если ячейка получает фокус, то нам надо закрасить её другими цветами if (gdFocused in State) then begin StringGrid1.Canvas.Brush.Color := clBlack; StringGrid1.Canvas.Font.Color := clWhite; end else //Если же ячейка теряет фокус, то закрашиваем её красным и зелёным if ACol = 2 //Вторая колонка будет зелёной , другие - ячейки красными then StringGrid1.Canvas.Brush.color := clPaleGreen else StringGrid1.canvas.brush.Color := clPaleRed; //Теперь закрасим ячейки, но только, если ячейка не Title- Row/Column //Естевственно это завит от того, есть у Вас title-Row/Columns или нет. If (ACol > 0) and (ARow>0) then begin //Закрашиваем бэкграунд StringGrid1.canvas.fillRect(Rect); //Закрашиваем текст (Text). Также здесь можно добавить выравнивание и т.д.. StringGrid1.canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]); end; end;
|
Но они вообще ничего не раскрашивают. Когда пытаюсь в StringGrid в DefaultDrawing поставить False, таблица вообще выводится пустая.
Вот полный код моей программы:
| Код | unit Main;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, DB, IBCustomDataSet, IBQuery, IBDatabase, Grids, DateUtils, DBLogDlg;
type TForm1 = class(TForm) PageControl1: TPageControl; TabSheet1: TTabSheet; TabSheet2: TTabSheet; StringGrid1: TStringGrid; IBDatabase1: TIBDatabase; IBTransaction1: TIBTransaction; IBQuery1: TIBQuery; DateTimePicker2: TDateTimePicker; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; procedure FormActivate(Sender: TObject); procedure DateTimePicker2Change(Sender: TObject); procedure SVOD(); procedure StringGrid1DrawCell(Sender:TObject; ACol, ARow:Integer; Rect:TRect; State: TGridDrawState); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; previous_date : TDateTime; // Дата уменьшенная на 7 дней от даты заданной в DateTimePicker2 start_week_date : TDateTime; // Первый день в предыдущей неделе end_week_date : TDateTime; // Последний день в предыдущей неделе
implementation
{$R *.dfm} { procedure TForm1.StringGrid1DrawCell(Sender:TObject; ACol, ARow:Integer; Rect:TRect; State: TGridDrawState); Const //сдесь определяем Ваш цвет. Так же можно использовать //цвета по умолчанию. clPaleGreen = TColor($CCFFCC); clPaleRed = TColor($CCCCFF); begin //Если ячейка получает фокус, то нам надо закрасить её другими цветами if (gdFocused in State) then begin StringGrid1.Canvas.Brush.Color := clBlack; StringGrid1.Canvas.Font.Color := clWhite; end else //Если же ячейка теряет фокус, то закрашиваем её красным и зелёным if ACol = 2 //Вторая колонка будет зелёной , другие - ячейки красными then StringGrid1.Canvas.Brush.color := clPaleGreen else StringGrid1.canvas.brush.Color := clPaleRed; //Теперь закрасим ячейки, но только, если ячейка не Title- Row/Column //Естевственно это завит от того, есть у Вас title-Row/Columns или нет. If (ACol > 0) and (ARow>0) then begin //Закрашиваем бэкграунд StringGrid1.canvas.fillRect(Rect); //Закрашиваем текст (Text). Также здесь можно добавить выравнивание и т.д.. StringGrid1.canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]); end; end;}
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); Var StringGrid: TStringGrid; Can: TCanvas; begin StringGrid := Sender as TStringGrid; Can := StringGrid.Canvas; Can.Font := StringGrid.Font; if (ARow >= StringGrid.FixedRows) and (ACol >= StringGrid.FixedCols) then Can.Brush.Color := StringGrid.Color else Can.Brush.Color := StringGrid.FixedColor; //============== if ((ACol = 1) and (ARow = 1)) or ((ACol = 3) and (ARow = 1)) or ((ACol = 2) and (ARow = 2)) or ((ACol = 3) and (ARow = 3)) or ((ACol = 1) and (ARow = 3)) then Can.Brush.Color := clRed; //============== if (gdSelected in State) then begin Can.Font.Color := clHighlightText; Can.Brush.Color := clHighlight; end; Can.FillRect(Rect); Can.TextOut(Rect.Left+2,Rect.Top+2, StringGrid.Cells[ACol, ARow]); end;
procedure TForm1.SVOD(); var i : Integer; begin previous_date := DateTimePicker2.Date - 7; // Вычислили дату предыдущей недели start_week_date := previous_date; // Промежуточное значение первой даты в неделе end_week_date := previous_date; // Промежуточное значение последне даты в неделе //number_day := DayOfWeek(previous_date); // Вычисляем номер дня недели //number_week := WeekOf(previous_date); // Вычисляем номер недели while DayOfWeek(start_week_date)<> 2 do begin start_week_date := start_week_date - 1; end;
while DayOfWeek(end_week_date)<> 1 do begin end_week_date := end_week_date + 1; end; Label3.Caption := DateToStr(previous_date); // Дата предыдущей недели Label1.Caption := DateToStr(start_week_date); // Первая дата в предыдущей неделе Label2.Caption := DateToStr(end_week_date); // Последняя дата в предыдущей неделе
IBQuery1.Active:=False; IBQuery1.SQL.Clear; IBQuery1.SQL.ADD('SELECT p_pair, p_da_min, p_ti_min, p_op, p_da_max, p_ti_max, p_cl, p_point, p_point_mod'); IBQuery1.SQL.ADD('FROM svod_procedure (:P0, :P1) ORDER BY 9 DESC'); IBQuery1.Params.Items[0].AsString := DateToStr(start_week_date); IBQuery1.Params.Items[1].AsString := DateToStr(end_week_date); IBQuery1.Active:=True; i := 1; while not IBQuery1.Eof do begin StringGrid1.Cells[0,i] := IBQuery1.Fields.Fields[0].Value; StringGrid1.Cells[1,i] := IBQuery1.Fields.Fields[1].Value; StringGrid1.Cells[2,i] := IBQuery1.Fields.Fields[2].Value; StringGrid1.Cells[3,i] := IBQuery1.Fields.Fields[3].Value; StringGrid1.Cells[4,i] := IBQuery1.Fields.Fields[4].Value; StringGrid1.Cells[5,i] := IBQuery1.Fields.Fields[5].Value; StringGrid1.Cells[6,i] := IBQuery1.Fields.Fields[6].Value; StringGrid1.Cells[7,i] := IBQuery1.Fields.Fields[7].Value; StringGrid1.Cells[8,i] := IBQuery1.Fields.Fields[8].Value; IBQuery1.Next(); StringGrid1.RowCount := i+1; i := i+1; end; end;
// При изменении даты в DateTimePicker2 производится перерасчет procedure TForm1.DateTimePicker2Change(Sender: TObject); begin SVOD(); end;
// При запуске программы происходит перерасчет procedure TForm1.FormActivate(Sender: TObject); begin SVOD(); //StringGrid1DrawCell(); end;
end.
|
|