![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как добавить запись в DBGrid? [D7]
JazY © (2005-12-03 17:02:00)Мне нужно записывать текст в одном поле DBGrid, если в другом поле появился определенный текст. К примеру, я забил в поле "Товар", текст "ТоварА", тут же автоматически в DBGrid, но в поле "Завод" должен появиться текст "Завод 1". Как отловить появления текста в ячейке, я наверное, понял:
В OnDrawColumnCell я пишу
if (Column.FieldName = 'Товар') then
if (Column.Field.Asstring = 'ТоварА') then begin
Но вот как добавить текст в той же строке, но в другое поле никак не разберусь, т.к только начал работать с БД. Подскажите исходник, а? Заранее спасибо.
Anatoly Podgoretsky (2005-12-05 16:02:00) [21]Какое состояние грида надо изменить?
JazY (2005-12-05 15:53:00) [22]
> состояние грида никак не изменилось, а набор данных был
> опять изменен, что вновь приведет к вызову этого обработчика.
>
Етить колотить! Вот оно как! Люди! Объясните ламеру от Делфи, как же изменить состояние грида? Как сделать чтобы не зацикливалось? Мне действительно очень важно выполнить указанную задачу!
ЮЮ (2005-12-05 03:42:00) [23]>Как лечить? Что делать?
Понять, что единожды вызвавшись, этот обработчик будет вызываться непрерывно, ибо после
adotable1.Edit;
adotable1.FieldByName('Готовность').AsString:='ok';
состояние грида никак не изменилось, а набор данных был опять изменен, что вновь приведет к вызову этого обработчика.
ЮЮ (2005-12-05 03:29:00) [24]>К примеру, я забил в поле "Товар", текст "ТоварА", тут же автоматически в DBGrid, но в поле "Завод" должен появиться текст "Завод 1".
А почему "Завод 1"? Это что "пятничная загадка"? "ЗаводА" было бы логичнее :)
>Подскажите исходник, а? Заранее спасибо.
Похоже, ты создаещь нечто уникальное, так что исходники только у тебя :)
JazY (2005-12-05 03:04:00) [25]Попробовал в этом событие. Вот какой код использую:
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
if (dbgrid1.Columns.Items[dbgrid1.SelectedIndex].FieldName = 'Ïðоизводство') then
if (dbgrid1.Columns.Items[dbgrid1.SelectedIndex].Field.AsString='*') then begin
adotable1.Edit;
adotable1.FieldByName('Готовность').AsString:='ok';
end;
Выдает ошибку типа "Stack overflow". Точно не скажу, поскольку в результате все напрочь виснет, а если запускать программу, то при выполнение этого кода вообще все напрочь виснет. Как лечить? Что делать?
Еще раз оговорюсь, что цель поймать появление определенного текста в столбце "Производство" и затем в той же строке, но в другом поле (Готовность) указать текст "ок"!
Плохиш (2005-12-05 01:09:00) [26]TDataSource.OnDataChange
JazY (2005-12-05 00:56:00) [27]Я, наверное, несколько преувеличил, что задача решена. Вот использую такой код:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
holdColor: TColor;
begin
if (Column.FieldName = 'Производство') then
if (Column.Field.Asstring = '*') then begin
adotable1.Edit;
adotable1.FieldByName('Готовность').AsString:='ok';
end;
Но проблема в том, что это событие происходит на событие DrawColumnCell. Мне кажется, что это неправильно. Первоначально это событие использовалось для выделения ячеек определенным цветом, но отлавливать появления новых значений (для чего собственно и создавался выше указанный код) необходимо видимо в другом событии? Как вы считаете в каком событие нужно отлавливать появление определенного текста и как изменится тогда код?
JazY (2005-12-04 20:01:00) [28]Ответ нашел. Тему можно закрывать.