Помогите пожалуйста, не могу сообразить в какое событие это запихнуть.
if DBEdit4.focused then
ADOTable1.FieldByName('числовое поле').AsInteger := 0;
то есть нужно чтобы если DBEdit получил фокус, то ЧИСЛОВОМУ ПОЛЮ полю автоматически должно присвоиться зночение 0 (перед тем как что-то в него вводить. Вот. Надо чтоб всё это происходило само при создании или активизации (не знаю как правильно) формы. Беда вобще с этими числовыми полями....
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
15-03-2007 18:49 | Комментарий к предыдущим ответам
ADOTable1.FieldByName('числовое поле').AsInteger := 0;
должна производится только перед первым Post созранением, а иначе ошибка вылетает
Судя по формулировке, вы не совсем улавливаете некоторые моменты. Поэтому я хотел бы сказать еще несколько слов. После открытия таблица находится в режиме просмотра (Browse). Редактирование записи в таблице происходит по следующей схеме:
1. Перевод таблицы в режим редактирования (Edit, Append)
2. Изменение значений всех нужных полей ( FieldByName('...').As... := ... )
3. Сохранение или отмена изменений (Post, Cancel)
Измененять поля в буфере записи можно только тогда, когда таблица находится в режиме редактирования или вставки. Во всех остальных случаях при попытке изменения значений полей в буфере произойдет ошибка. После Post или Cancel таблица опять переходит в режим просмотра.
Таблица может переводиться в режим редактирования автоматически при попытке редактировать значение поля в элементе управления, если у DataSource, через который подцеплена таблица, выставлен DataSource.AutoEdit := True
Post может выполняться автоматически, если происходит переход к другой записи.
Если заранее не известно, в каком режиме находится таблица, то вместо Post лучше применять CheckBrowseMode (это тот-же Post, только с проверкой, находится ли таблица в режиме редактирования, и если нет, то ничего не делает).
После редактирования таблицы прямо в DBGrid при выходе из окна лучше вызвать CheckBrowseMode, т.к. после редактирования последней записи мог не производиться переход на другую запись и, т.о., таблица могла остаться в режиме редактирования и тогда возможна потеря изменений последней редактировавшейся записи.
15-03-2007 13:29 | Комментарий к предыдущим ответам
>>> Ну так вот, господа, всё, что вы предложили НЕ РАБОТАЕТ!!!
Просто вы так сформулировали вопрос, а народ начал отвечать в лоб, не озаботившись ответом на вопрос "А зачем?"
>>> Вот, попробую рассказать, что я замыслил.
С этого и надо было начинать
Для каждого из DBEdit-ов действует такой код:
procedure TForm2.DBEdit2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key = VK_RETURN then
if ADOTable1.State in dsEditModes then
begin
ADOTable1.Post;
SelectNext (Sender as TWinControl, True, True);
end;
end
Мой разум вообще отказывается воспринимать такой код.
Зачем вам делать Post после заполнения каждого поля?
Сделайте все по нормальному:
Форма, на ней 5 DBEdit'ов, кнопки Ok и Cancel
Заполняете все поля, нажимаете Ok
По Ok делаете свой Post и все, что нужно, по Cancel - отмену.
Если хотите, чтобы Ok нажимался при нажатии Enter в любом месте, назначьте ему Default = True
Ну так вот, господа, всё, что вы предложили НЕ РАБОТАЕТ!!!
Вот, попробую рассказать, что я замыслил.
Имеется две формы. На первой форме есть кнопочка.
Вот её код (т.е. то что будет если её нажать):
Мы её нажимаем и у нас появляется 2-я форма.
В принципе основное, что она содержит это 5 DBEdit-ов, Первые три относятся к текстовым полям БД. А последние два к числовым. Вот с ними то гемор и происходит непонятный.
Для каждого из DBEdit-ов действует такой код:
procedure TForm2.DBEdit2KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key = VK_RETURN then
if ADOTable1.State in dsEditModes then
begin
ADOTable1.Post;
SelectNext (Sender as TWinControl, True, True);
end;
end;
В принципе если в той кнопочке на первой форме если прописать вот эти вот строчечки:
то всё идёт гладко и с текстом и с числами, но енть одно НО
Если нажать на эту кнопочку на первой формочке, то даже если я решу ничего не вводить в базу данных со второй формы (а ввод данных осущ. тока при её активации) а просто вызову и закрою, то в базу данных всё равно добавятся несчастные два нуля.
Вот я и хочу, чтобы вот эти вот две строчечки
выполнялись тогда когда допустим если я сохраню изменения в одном из ДБЭдитов например в первом. Чтоб БД не засорялась пустыми строками...
Надеюсь вы меня поняли...
15-03-2007 10:01 | Комментарий к предыдущим ответам
а если пользователь не будет работать с этим эдитом? Т.е. мышкой пощелкает по другим полям, а в этом значение его устраивает. Обычно такие вещи вешают либо на свойства поля (default), либо на события датасета - удобнее.
Сабир Сафаров:
то есть нужно чтобы если DBEdit получил фокус, то ЧИСЛОВОМУ ПОЛЮ полю автоматически должно присвоиться зночение 0 (перед тем как что-то в него вводить.
Если DBEdit имеет TabOrder=0, то событие onEnter само произойдет при создании формы, если нет, то тогда, когда произойдет процетированное мной, т.е. когда DBEdit получит фокус. Ну и код будет соотвественно немного другой...
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.