Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  12:08[Войти] | [Зарегистрироваться]
Ответ на вопрос № 50195

15-03-2007 08:19
Помогите пожалуйста, не могу сообразить в какое событие это запихнуть.

if DBEdit4.focused then
ADOTable1.FieldByName('числовое поле').AsInteger := 0;

то есть нужно чтобы если DBEdit получил фокус, то ЧИСЛОВОМУ ПОЛЮ полю автоматически должно присвоиться зночение 0 (перед тем как что-то в него вводить. Вот. Надо чтоб всё это происходило само при создании или активизации (не знаю как правильно) формы. Беда вобще с этими числовыми полями....

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

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 14:40 | Сообщение от автора вопроса
Ребятки понял в чём дело! Вот эта строчка

ADOTable1.FieldByName('числовое поле').AsInteger := 0;

должна производится только перед первым Post созранением, а иначе ошибка вылетает

15-03-2007 13:55 | Комментарий к предыдущим ответам
Form2.ADOTable1.Append;
Form2.ADOTable1.FieldByName('числовое поле1').AsInteger := 0;
Form2.ADOTable1.FieldByName('числовое поле2').AsInteger := 0;
Form2.Visible := True;


Возможный вариант:

Form2.ADOTable1.Append;
Form2.ADOTable1.FieldByName('числовое поле1').AsInteger := 0;
Form2.ADOTable1.FieldByName('числовое поле2').AsInteger := 0;
if Form2.ShowModal = mrOk then
  Form2.ADOTable1.Post
else
  rm2.ADOTable1.Cancel;


15-03-2007 13:45
>>> Form2.Visible := True;

Я вам настоятельно рекомендую в таких случаях использовать ShowModal

P.S. Сдается мне, что одной из причин ваших изысканий является то, что ваша вторая форма не модальая.

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

15-03-2007 13:23
Читайте справку к TADOTable и самое главное к его событиям - все что вы задумали у вас получится. Начните с BeforePost

15-03-2007 12:52 | Сообщение от автора вопроса
Ну так вот, господа, всё, что вы предложили НЕ РАБОТАЕТ!!!
Вот, попробую рассказать, что я замыслил.
Имеется две формы. На первой форме есть кнопочка.
Вот её код (т.е. то что будет если её нажать):

Form2.ADOTable1.Append;
Form2.ADOTable1.FieldByName('числовое поле1').AsInteger := 0;
Form2.ADOTable1.FieldByName('числовое поле2').AsInteger := 0;
Form2.Visible := 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;

В принципе если в той кнопочке на первой форме если прописать вот эти вот строчечки:

Form2.ADOTable1.Append;
Form2.ADOTable1.FieldByName('числовое поле1').AsInteger := 0;
Form2.ADOTable1.FieldByName('числовое поле2').AsInteger := 0;
Form2.Visible := True;

то всё идёт гладко и с текстом и с числами, но енть одно НО
Если нажать на эту кнопочку на первой формочке, то даже если я решу ничего не вводить в базу данных со второй формы (а ввод данных осущ. тока при её активации) а просто вызову и закрою, то в базу данных всё равно добавятся несчастные два нуля.
Вот я и хочу, чтобы вот эти вот две строчечки

Form2.ADOTable1.FieldByName('числовое поле1').AsInteger := 0;
Form2.ADOTable1.FieldByName('числовое поле2').AsInteger := 0;

выполнялись тогда когда допустим если я сохраню изменения в одном из ДБЭдитов например в первом. Чтоб БД не засорялась пустыми строками...
Надеюсь вы меня поняли...

15-03-2007 10:01 | Комментарий к предыдущим ответам
а если пользователь не будет работать с этим эдитом? Т.е. мышкой пощелкает по другим полям, а в этом значение его устраивает. Обычно такие вещи вешают либо на свойства поля (default), либо на события датасета - удобнее.

15-03-2007 09:20
Сабир Сафаров:
то есть нужно чтобы если DBEdit получил фокус, то ЧИСЛОВОМУ ПОЛЮ полю автоматически должно присвоиться зночение 0 (перед тем как что-то в него вводить.
Если DBEdit имеет TabOrder=0, то событие onEnter само произойдет при создании формы, если нет, то тогда, когда произойдет процетированное мной, т.е. когда DBEdit получит фокус. Ну и код будет соотвественно немного другой...

ADOTable1.Edit;
ADOTable1.FieldByName('числовое поле').AsInteger := 0;
ADOTable1.Post;


В общем этот диалог бессмысленен, без соответствующих комментариев автора :-)

15-03-2007 08:41 | Комментарий к предыдущим ответам
Fox:
Надо чтоб всё это происходило само при создании или активизации (не знаю как правильно) формы

15-03-2007 08:29
TDBEdit.OnEnter

15-03-2007 08:29
не в ту сторону копаете. См. события вашего Датасета, а ваши эдиты лишь отображают данные. AfterInsert, AfterOpen ...

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Однажды, в студеную зимнюю пору я из лесу вышел, был сильный ЧТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования