Текущий архив: 2006.02.05;
Скачать: CL | DM;
Вниз
Как добавить запись в DBGrid? Найти похожие ветки
← →
JazY (2005-12-03 17:02) [0]Мне нужно записывать текст в одном поле DBGrid, если в другом поле появился определенный текст. К примеру, я забил в поле "Товар", текст "ТоварА", тут же автоматически в DBGrid, но в поле "Завод" должен появиться текст "Завод 1". Как отловить появления текста в ячейке, я наверное, понял:
В OnDrawColumnCell я пишуif (Column.FieldName = "Товар") then
if (Column.Field.Asstring = "ТоварА") then begin
Но вот как добавить текст в той же строке, но в другое поле никак не разберусь, т.к только начал работать с БД. Подскажите исходник, а? Заранее спасибо.
← →
JazY (2005-12-04 20:01) [1]Ответ нашел. Тему можно закрывать.
← →
JazY (2005-12-05 00:56) [2]Я, наверное, несколько преувеличил, что задача решена. Вот использую такой код:
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. Мне кажется, что это неправильно. Первоначально это событие использовалось для выделения ячеек определенным цветом, но отлавливать появления новых значений (для чего собственно и создавался выше указанный код) необходимо видимо в другом событии? Как вы считаете в каком событие нужно отлавливать появление определенного текста и как изменится тогда код?
← →
Плохиш © (2005-12-05 01:09) [3]TDataSource.OnDataChange
← →
JazY (2005-12-05 03:04) [4]Попробовал в этом событие. Вот какой код использую:
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 03:29) [5]>К примеру, я забил в поле "Товар", текст "ТоварА", тут же автоматически в DBGrid, но в поле "Завод" должен появиться текст "Завод 1".
А почему "Завод 1"? Это что "пятничная загадка"? "ЗаводА" было бы логичнее :)
>Подскажите исходник, а? Заранее спасибо.
Похоже, ты создаещь нечто уникальное, так что исходники только у тебя :)
← →
ЮЮ © (2005-12-05 03:42) [6]>Как лечить? Что делать?
Понять, что единожды вызвавшись, этот обработчик будет вызываться непрерывно, ибо после
adotable1.Edit;
adotable1.FieldByName("Готовность").AsString:="ok";
состояние грида никак не изменилось, а набор данных был опять изменен, что вновь приведет к вызову этого обработчика.
← →
JazY (2005-12-05 15:53) [7]
> состояние грида никак не изменилось, а набор данных был
> опять изменен, что вновь приведет к вызову этого обработчика.
>
Етить колотить! Вот оно как! Люди! Объясните ламеру от Делфи, как же изменить состояние грида? Как сделать чтобы не зацикливалось? Мне действительно очень важно выполнить указанную задачу!
← →
Anatoly Podgoretsky © (2005-12-05 16:02) [8]Какое состояние грида надо изменить?
← →
Sergey13 © (2005-12-05 16:03) [9]2 [7] JazY (05.12.05 15:53)
Ты не с того конца вообще к задаче подошел. В гриде нет данных, они там только отображаются. И работать с гридом в данном случае - это все равно что причесывать зеркало.
>Мне действительно очень важно выполнить указанную задачу!
Тогда читать книжки надо. По другому никак, ИМХО.
← →
ANB © (2005-12-05 16:07) [10]
> ЮЮ © (05.12.05 03:42) [6]
Ключевое слово - Calculated.
← →
JazY (2005-12-05 16:37) [11]Хорошо. Начнем с начала.
Вот такой код:
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;
Насколько я понял, в результате выполнения такого кода произойдет зацикливание.... А это не есть хорошо. Как быть? Половина кода работает как надо!
Т.е:
if (dbgrid1.Columns.Items[dbgrid1.SelectedIndex].FieldName = "Производство") then
if (dbgrid1.Columns.Items[dbgrid1.SelectedIndex].Field.AsString="*") then begin
Вот этот код помогает отлавить появление звездочки в столбце ""производcтво"". Далее необходимо в этой же строке, но в другое поле ("Готовность") добавить запись ""ok"". Вот и все. Как отлавить появление нужного текста, я кажется понял, но как после этого отлавливания добавить запись не разберусь. Вот в этом и прошу помочь.
← →
ANB © (2005-12-05 16:44) [12]
> JazY (05.12.05 16:37) [11]
Может уточним термин "добавить запись" ?
← →
JazY (2005-12-05 16:55) [13]
> Может уточним термин "добавить запись" ?
Чтобы в ячейке текст появился. Т.е есть строка, и в этой строке в определенном поле появляется "*" тут же в той же строке, но в другом поле появляется "ок". Иными словами, просто нужно добавить текст в определенную ячейку уже имеющейся строки.
← →
ANB © (2005-12-05 17:01) [14]
> JazY (05.12.05 16:55) [13]
См. вычисляемые поля. Это попроще будет.
← →
JazY (2005-12-05 17:08) [15]
> См. вычисляемые поля. Это попроще будет.
Может без них можно обойтись?
← →
Плохиш © (2005-12-05 17:23) [16]
> JazY (05.12.05 16:37) [11]
> Хорошо. Начнем с начала.
> Вот такой код:
> procedure TForm1.DataSource1DataChange(Sender: TObject;
> Field: TField);
Вот здесь сказоно изменение какого поля вызвало данное событие, это поле и проверяй.
Перед вызовом Edit надо проверить, а не находится ли набор данных уже в состоянии редактирования или вставки записи.
← →
JazY (2005-12-05 17:37) [17]
> а не находится ли набор данных уже в состоянии редактирования
Т.е если находится, то тогда режим редактирования не включаем, а сразу adotable1.FieldByName("Готовность").AsString:="ok";
Правильно я понял?
← →
Плохиш © (2005-12-05 17:39) [18]Да
← →
JazY (2005-12-05 20:46) [19]А как определить, что набор данных уже в состояние редактирования. Понимаю, что уже задолбал со своими вопрос, но задачу мне надо решить как можно быстрее, поэтому и надоедаю. Подскажите, а?
← →
Virgo_Style © (2005-12-05 21:44) [20]JazY (05.12.05 20:46) [19]
if ADOQuery1.State = dsEdit...
← →
Плохиш © (2005-12-05 22:14) [21]
> JazY (05.12.05 20:46) [19]
> А как определить, что набор данных уже в состояние редактирования.
> Понимаю, что уже задолбал со своими вопрос, но задачу мне
> надо решить как можно быстрее, поэтому и надоедаю. Подскажите,
> а?
Читай справку, там всё написано
← →
JazY (2005-12-05 23:29) [22]Все. Не понимаю чего происходит:
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
if adotable1.State=dsEdit then begin
adotable1.FieldByName("Готовность").AsString:="ok";
end
else begin
adotable1.Edit;
adotable1.FieldByName("Готовность").AsString:="ok";
end;
end;
end;
Не работает... и все тут.
Накрылась идея автоматизировать нашу контору... представителя малого бизнеса. :) Чего делать не знаю.
← →
Плохиш © (2005-12-06 00:19) [23]
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
if Field <> nil then
if (Field.FieldName = "Производство") and (Field.AsString = "*") then
begin
if not (adotable1.state in [dsEdit, dsInsert]) then adotable1.edit;
adotable1.FieldByName("Готовность").AsString := "ok";
end;
end;
← →
JazY (2005-12-06 01:07) [24]2 Плохиш
Большое спасибо! Я не знаю смогу ли я в будущем создавать такие элегантные решения, но по крайней мере буду стремиться. Еще раз спасибо, что указали решение задачи.
← →
msguns © (2005-12-06 09:40) [25]Неверно использование события OnDataChange в этом контексте из-за [6].
Если надо перед записью изменений в БД присвоить значения некоторым полям, разумнее использовать событие BeforePost, которое происходит ОДИН РАЗ НЕПОСРЕДСТВЕННО ПЕРЕД ЗАПИСЬЮ В БД, а не после изменения любого поля записи НД.
← →
msguns © (2005-12-06 09:43) [26]То, что написано в [23] может иметь смысл в одном единственном случае - если необходимо визуализировать дополнительно заполненное поле непосредственно СРАЗУ после изменения юзером основного, но ДО записи в БД.
Сам Плохиш так, как советует, вряд ли делает ;))
← →
JazY (2005-12-06 15:28) [27]
> если необходимо визуализировать дополнительно заполненное
> поле непосредственно СРАЗУ после изменения юзером основного,
> но ДО записи в БД.
Вот как раз это и нужно.
← →
Плохиш © (2005-12-06 15:47) [28]
> Сам Плохиш так, как советует, вряд ли делает ;))
У меня как-то такой необходимости не возникало ;-)
Страницы: 1 вся ветка
Текущий архив: 2006.02.05;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.01 c