Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как отучить от автодобавления записи [D6, IB6.x]


lejik ©   (2002-07-25 13:05:00) 

Доброе время суток!
Проблемка такая, Есть таблица в InterBase при движении по ней с помощью DBGrid когда при нахождении на последней записи нажимаю "Стрелка вниз" и она переходит на несуществующую запись. Есть ли какое нибудь свойство или надо перехватывать нажатие клавиш. Заранее спасибо.


Lusha   (2002-07-31 09:04:00) [1]

>lejik © (30.07.02 20:02)
Ну не совсем так. Рассказываю популярнее.
Издеваешься, да? :)

Ну, и кто Вам, любезный, мешает написать нечто подобное (смотри Lusha © (30.07.02 10:28)) для обработки клавиши Enter... Я уже практически все разжевал.... Вам осталось только в рот положить... :(


lejik   (2002-07-30 20:02:00) [2]

> Lusha
Ну не совсем так. Рассказываю популярнее. В DBGridEh есть свойство Использовать Enter как Tab. То есть при нажвтии Enter выделение ячейки перемещается в следующий столбец или в следующую строку. Когда курсор находится на последней записи в базе данных нажатие Enter приводит к тому что курсор перемещается к следующей (не существующей) записи. После нажатия Enter стоит обработчик модификации данных. Используется InterBase один из столбцов Not Null, триггер BeforeInsert не срабатывает, и вся прога счастливо вываливается с ошибкой "Двнные домена не могут быть Null"


Lusha   (2002-07-30 10:28:00) [3]

>lejik © (27.07.02 22:45)
То есть как я понимаю вся проблема в обработке клавиши TAB при добавлении? Так там лекарство то же - метод NEXT...

Например вот таким образом...


procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);

procedure DoNext;
begin
TDBGrid(Sender).DataSource.DataSet.Next;
Key := 0;
end;

begin
if Key = VK_DOWN then DoNext;
if Key = VK_TAB then
begin
if ssAlt in Shift then Exit;
if ssShift in Shift then Exit;
with TDBGrid(Sender) do
if SelectedIndex = Columns.Count - 1 then
begin
DoNext;
if not DataSource.DataSet.Eof then Key := VK_HOME;
end;
...

end;





Vlad1   (2002-07-28 15:34:00) [4]



if (key=VK_DOWN)and(DataSet1.State in [dsInsert]) then key:=#0
Правда, не проверял...


lejik   (2002-07-27 22:45:00) [5]

Большое спасибо за участие! Конечно KEY_DOWN обрабатывать можно как предлагал(а) Lusha, я поначалу так и делал, а потом поставил себе DBGridEh и установил в нем свойство Использовать Enter как Tab, так что мно прихобится две клавиши обрабатывать, получается неудобно. Пробовал обрабатывать AfterScroll но он и при открытии срабатывает. Ума не приложу...


Lusha   (2002-07-27 16:45:00) [6]

>KSergey © (27.07.02 15:07)

автодобавление - есть добавление автомобилем. Разве я не прав?
И несло его долго... Более 20-ти часов к ряду... :)
За сим, с уважением...

Lusha


KSergey   (2002-07-27 15:07:00) [7]

>Lusha © (27.07.02 13:23)
>Внимательно перечитываем вопрос...
>Как отучить от автодобавления записи
>Автодобавление не означает вообще добавление... А какое именно >добавление его не устраивает, он, автора вопроса, описал >достаточно однозначно...

Безусловно, все однозначно: автодобавление - есть добавление автомобилем. Разве я не прав?

[И да простят меня модераторы и автор вопроса за флейм]


Lusha   (2002-07-27 13:23:00) [8]

>KSergey © (27.07.02 11:30)
Любезный KSergey!
Внимательно перечитать означает не только прочитать, но и осмыслить прочитанное... :)

Внимательно перечитываем вопрос...
Как отучить от автодобавлениязаписи

Автодобавление не означает вообще добавление... А какое именно добавление его не устраивает, он, автора вопроса, описал достаточно однозначно...

Вызов Append НД при нажатии стрелки вниз на последней записи есть свойство обработчика клавиатуры TDBGrid... И "лечить" его нужно соответственно, не изменяя функциональность других компонент... Именно поэтому ответ Алексей Петров © (25.07.02 13:25)я считаю некорректным...

Правилен данный метод еще и потому, что если перехватить только кнопки - этого мало.
С чего Вы взяли, что этого мало?

Я найду еще 280 способов добавить таки запись.
И тут Остапа понесло... :)


KSergey   (2002-07-27 11:30:00) [9]

>Lusha © (26.07.02 08:53)
>Proton © (26.07.02 04:54)
>Внимательно перечитайте вопрос, рассудительный Вы наш... :)

Ну я перечитал - ничего про необходимость добавлять записи (равно как и редактировать) там нету, умнющий вы наш. Так что вариант Алексей Петров © (25.07.02 13:25)самый правильный, и вот почему: он как раз по нужному месту написан. Ну а наворочить туда всякие флажки когда нельзя, а когда все-таки можно - это уже автору предлпгпется сделать самому, т.к. предполагается у него наличие соображения. И еще этот ответ правилен по фтоме для форума: кратко и самую суть.
Правилен данный метод еще и потому, что если перехватить только кнопки - этого мало. Я найду еще 280 способов добавить таки запись.


Lusha   (2002-07-26 08:53:00) [10]

>Proton © (26.07.02 04:54)
Внимательно перечитайте вопрос, рассудительный Вы наш... :)


Proton   (2002-07-26 04:54:00) [11]


> а за тем
> editflag := true;
> tablex.edit;
> editflag := false;

надо делать при добавлении при нажатии кнопки добавить (или плюсика в db_navigator"e)
вообщем если нужен пример будет пиши на мыло - поделюсь


> Lusha © (25.07.02 13:30)
> >Алексей Петров © (25.07.02 13:25)
> МАлАдЕц... И вообще похерим возможность добавления записи
> в этот НД... :)

может автору вопроса только просмотр нужен


Proton   (2002-07-26 04:49:00) [12]

autoedit := false;
у datasource
но и редактирование (автоматическое)
отключится
думаю подход
> Алексей Петров © (25.07.02 13:25)
наиболее походящий
что то вроде
if not editflag then abort;

а за тем
editflag := true;
tablex.edit;
editflag := false;


DmitriyT   (2002-07-25 20:10:00) [13]

в DBGrid.Options включи в True что-то вроде ReadOnly (не помню точное название, но там есть), а добавление, редактирование и т.п. делай в другой модально появляющейся форме.


Lusha   (2002-07-25 14:14:00) [14]

>Aram © (25.07.02 14:07)
Вот так гораздо проще.... И никаких ЕСЛИ... :)

if Key = VK_DOWN then
begin
TDBGrid(Sender).DataSource.DataSet.Next;
Key := 0;
end;


Aram   (2002-07-25 14:07:00) [15]

Да, Johnmen прав. Тогда последнее условие можно переписать так:

If ((Key = VK_DOWN) and (Table1.RecNo = Table1.RecordCount)) then Key:= 0;

если конечно Table1.RecNo - работает корректно в IB.


Johnmen   (2002-07-25 13:51:00) [16]

>Aram © (25.07.02 13:41)

Второй if неверен...На последней записи Eof<>True...



Aram   (2002-07-25 13:41:00) [17]

Попробуй так:
надо сделать перехват собятия нажатия клавиатуры на Grid-e OnKeyDown

If Key = VK_INSERT then Key = #0; // это для того чтобы при
// insert не добавлялась запись.
If Key = VK_DOWN and Table1.Eof = True then Key = #0;


Lusha   (2002-07-25 13:30:00) [18]

>Алексей Петров © (25.07.02 13:25)
МАлАдЕц... И вообще похерим возможность добавления записи в этот НД... :)


Алексей Петров   (2002-07-25 13:25:00) [19]

Таблица с помощью DataSet-а некого в DBGrid отображается ведь?

Вот в том DataSet сделай обработчик BeforeInsert с кодом

begin
Abort;
end;


Lusha   (2002-07-25 13:16:00) [20]

Последнее, разумеется... :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо