2013-03-21 4 views
-1

Я написал код, который окрашивает отдельные ячейки в моем stringgrid, в моем приложении delphi, в соответствии со списком данных.StringGrid Cells Delphi

Теперь мне нужно написать код в событии OnDblClick на моем stringgrid, который выводит, окрашена ли клетка или нет, а затем продолжается в соответствии с найденным результатом. Например:

DOUBLE CLICK CELL 
IS CELL COLOURED 
    YES > PROCEED A 
    NO > PROCEED B 
+3

Вы должны запросить базовые данные (список перечисленных вами данных) по выбранным координатам ячейки для этого условия. – TLama

+0

«цвет» ваших ячеек в событии рисования или у вас есть базовая структура раскраски? – jachguate

+0

@TLama Я мог бы использовать данные в моем списке, чтобы узнать, занята ли ячейка, но это похоже на долгую проблему. @jachguate Я окрашиваю ячейки с использованием свойства 'Rect'. Я только что попытался использовать 'if StringGrid.Canvas.Pixels [ACol, ARow] <> $ 00FFFFFF then' и, похоже, работает, но только некоторое время. Я не уверен, что заставляет его вести себя непредсказуемо. – Babah254

ответ

1

магазин цвет в то время вы рисуете его в предопределенной TStringGrid.Objects собственности. Когда вам нужно его восстановить, вы можете вернуть его из координат Column и . Вот тривиальный пример, который хранит либо clWhite, либо clBlack в ячейке Objects для ячейки, основываясь на том, является ли это столбцом с нечетными номерами и просто отображает сохраненное значение в виде строки, когда ячейка выбрана. Это должно заставить вас начать.

procedure TForm1.FormCreate(Sender: TObject); 
var 
    r, c: Integer; 
const 
    ColorSel: array[Boolean] of TColor = (clWhite, clBlack); 
begin 
    StringGrid1.RowCount := 10; 
    StringGrid1.ColCount := 6; 
    for c := 1 to StringGrid1.ColCount - 1 do 
    for r := 1 to StringGrid1.RowCount - 1 do 
    begin 
     StringGrid1.Cells[c, r] := Format('C: %d R: %d', [c, r]); 
     StringGrid1.Objects[c, r] := TObject(ColorSel[Odd(c)]); 
    end; 
end; 

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; 
    var CanSelect: Boolean); 
begin 
    ShowMessage(ColorToString(TColor(StringGrid1.Objects[ACol, ARow]))); 
end; 

Вы можете использовать это в OnMouseUp случае легко обнаружить, что цвет в клетке. Удалите StringGrid1SelectCell (с помощью инспектора объектов, просто удалите значение для события) и добавить это как OnMouseUp событие для сетки вместо:

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
var 
    Col, Row: Integer; 
begin 
    StringGrid1.MouseToCell(X, Y, Col, Row); 
    if (Col > -1) and (Row > -1) then 
    ShowMessage(ColorToString(TColor(StringGrid1.Objects[Col, Row]))); 
end; 

Handling двойного щелчка мышью становится очень легко (благодаря @TLama для большой помощь):

procedure TForm1.StringGrid1DblClick(Sender: TObject); 
var 
    IsDefaultColor: Boolean; 
    CurrCellColor: TColor; 
    CurrCol, CurrRow: Integer; 
begin 
    // Save typing by grabbing the currently selected cell col/row 
    CurrCol := StringGrid1.Col; 
    CurrRow := StringGrid1.Row; 

    // Get the stored color for the selected cell 
    CurrCellColor := TColor(StringGrid1.Objects[CurrCol, CurrRow]); 

    // See if it's been painted a different color than the default 
    IsDefaultColor := (CurrCellColor = StringGrid1.Color); 

    if not IsDefaultColor then 
    HandleDifferentColorCell 
    else 
    HandleNormalColorCell; 
end; 

Обратите внимание, что если вы выбираете не изменить цвет для ячейки, вы все равно должны назначить по умолчанию цвет ячейки в Objects[Column, Row], так что есть что-то значимое там во избежание неправильного обращения при извлечении значения.

+0

@TLama: Я знаю это. :-) Я подумал, что я оставлю что-то для OP, чтобы поработать. ;-) Я мог бы упомянуть «Mouse.CursorPos» попутно, я думаю, поскольку «OnDblClick» не содержит координат. Спасибо вам тоже.:-) –

+0

@TLama: (В моем голосе Гомера Симпсона) «До!» Ты прав. Ваша мысль гораздо проще. Я просто подумал об этом. Повторное редактирование и удаление моих последних комментариев перед этим. Благодарю. :-) –

+0

@TLama: Исправлен обработчик OnDblClick с надлежащим кредитом, предоставленным вам. :-) Еще раз спасибо. –

Смежные вопросы