![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DBGrid - не отрисовывать запись по условию в вычисляемом поле [D6, dBase, FoxPro]
alex_1234 © (2005-11-29 10:58:00)К сожалению нельзя фильтровать по вычисляемым полям....
А хочется....
Придумал попробовать сделать следующий финт ушами:
в событии DBGrid1DrawColumnCell проверять условие, и если надо, то просто не отрисовывать текущую запись. Примерно так (оно не работает):
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if ((Query1FAKTOSTATOK.AsInteger=0) and (CheckBox1.Checked)) then Exit;//ВСЕ РАВНО, ГАД, ОТРИСОВЫВАЕТ!!!!
IF Query1FAKTOSTATOK.AsInteger=0 then
Begin
// TDBGrid(Sender).Canvas.Brush.Color:=clGreen;
TDBGrid(Sender).Canvas.Font.Color:=clRed;
End;
// если строка была выделена, оставляем "подсвеченные" цвета
IF gdSelected IN State
Then Begin
TDBGrid(Sender).Canvas.Brush.Color:= clHighLight;
TDBGrid(Sender).Canvas.Font.Color := clHighLightText;
End;
// А теперь пусть он рисует сам !
TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
Кусок кода взят из статейки "Разноцветный грид".....
Query1FAKTOSTATOK - вычисляемое поле по данным другого запроса.
CheckBox1 - галка "Показывать только >0"
В чем собака порылась?
Виталий Панасенко (2005-11-29 12:39:00) [1]Да, ларчик то просто открывался..:-)))
evvcom (2005-11-29 12:13:00) [2]УР-РА!!!! :-)
Sergey13 (2005-11-29 12:11:00) [3]2 [4] alex_1234 © (29.11.05 12:09)
Сообщи это моему начальнику. А то он не в курсе. 8-)
alex_1234 (2005-11-29 12:09:00) [4]Вы ГЕНИЙ!!!
ОНО ЗАРАБОТАЛО!!!
Sergey13 (2005-11-29 12:02:00) [5]А что мешает выполнить код (адаптированный конечно) из TForm1.Query1CalcFields в TForm1.Query1FilterRecord?
alex_1234 (2005-11-29 11:57:00) [6]Не выходит каменный цветок...
На момент события
procedure TForm1.Query1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept:=DataSet.FieldByName('FAKTOSTATOK').AsInteger>0;
end;
DataSet.FieldByName('FAKTOSTATOK').AsInteger ВСЕГДАравно нулю...
Поля я считаю следующим макаром:
procedure TForm1.Query1CalcFields(DataSet: TDataSet);
begin
//вычисление полей
if Query2.Locate('cardarticu',Query1ARTICUL.AsString,[loCaseInsensitive]) then
Query1PRODZASMENU.AsInteger:=Query2kol.AsInteger
else
Query1PRODZASMENU.AsInteger:=0;
Query1FAKTOSTATOK.AsInteger:=Query1ADDNUM1.AsInteger-Query1PRODZASMENU.AsInteger;
end;
Sergey13 (2005-11-29 11:00:00) [7]OnFilterRecord попробуй.