Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.236.100.210] |
|
Сообщ.
#1
,
|
|
|
Приветствую!
Очень глупый запрос помощи, понимаю, но что-то не смог я нагуглить решения. В основном везде цвета ячеек StringGrid красятся по каким-то условиям. В моем же случае мне надо красить пустые ячейки второго столбца (кроме первой строки) в тот цвет, что будет выбран в TColorDialog, т.е у каждой ячейки второго столбца должен быть свой цвет в зависимости от сделанного выбора в палитре. При этом по умолчанию цвет в этих ячейках должен быть черным. Я пробовал вот так: // цвет ячейки по умолчанию procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if (ACol = 1) and (ARow > 0) then begin StringGrid1.Canvas.Brush.Color := clBlack; StringGrid1.Canvas.FillRect(Rect); end; end; // закрашивание ячейки по выбранному цвету из палитры procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin if (ACol = 1) and (ARow > 0) then begin if ColorDialog1.Execute then begin StringGrid1.Canvas.Brush.Color := ColorDialog1.Color; StringGrid1.Canvas.FillRect(StringGrid1.CellRect(ACol, ARow)); end; end; StringGrid1.Repaint; end; Также пробовал вот так (находил где-то пример), но тоже не робит: type TCellData = class(TObject) private FStateYes: Boolean; FForeground: TColor; FBackground: TColor; public property StateYes: Boolean read FStateYes write FStateYes; property Foreground: TColor read FForeground write FForeground; property Background: TColor read FBackground write FBackground; end; // закрашивание ячейки по выбранному цвету из палитры procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); var CellData: TCellData; begin if (ACol = 1) and (ARow > 0) then begin if ColorDialog1.Execute then begin CellData := TCellData.Create; CellData.Foreground := ColorDialog1.Color; CellData.Background := ColorDialog1.Color; StringGrid1.Objects[ACol, ARow] := CellData; end; end; StringGrid1.Repaint; end; Вроде банальнейшая задача, а завис Подскажите, пожалуйста, где туплю... Спасибо! |
Сообщ.
#2
,
|
|
|
CellData не зря сохраняется в примере.
Ты, выходит, в StringGrid1SelectCell установил цвета, а потом в StringGrid1DrawCell их обратно перебил. Сделай так: type TCellData = class(TObject) private FStateYes: Boolean; FForeground: TColor; FBackground: TColor; public property StateYes: Boolean read FStateYes write FStateYes; property Foreground: TColor read FForeground write FForeground; property Background: TColor read FBackground write FBackground; end; var DefaultData: TCellData; procedure TForm1.Create(); begin DefaultData = TCellData.Create; DefaultData.Background = clBlack; end; procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var CellData: TCellData; begin if (ACol = 1) and (ARow > 0) then begin CellData := StringGrid1.Objects[ACol, ARow]; if CellData = nil CellData := DefaultData; StringGrid1.Canvas.Brush.Color := CellData.Background; StringGrid1.Canvas.FillRect(Rect); end; end; procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); var CellData: TCellData; begin if (ACol = 1) and (ARow > 0) then begin if ColorDialog1.Execute then begin CellData := TCellData.Create; CellData.Background := ColorDialog1.Color; StringGrid1.Objects[ACol, ARow] := CellData; end; end; StringGrid1.Repaint; end; P.S. Писал сразу сюда. Мог где ошибиться. |
Сообщ.
#3
,
|
|
|
Не забудь в StringGrid1SelectCell проверять старый Object, и если он есть - просто обновлять. А то утечка памяти будет!
|