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

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

Проблема при вводе данных ! Поделитесь экспириенсом [D6, Paradox]


MsGuns ©   (2002-09-06 12:55:00) 

При редактировании/добавлении датасетов юзерам очень удобно переносить в текущую запись содержимое этого же поля из передыдущей (верхней в гриде). Пример

Запись Поле 1 Поле2
---------------------------------------------------------------
n-1 6.09.02 Процессор Celeron 800 Mh
> n 6.09.02 Процессор Celeron 900 Mh

Ясно, что вводить наименование процессора каждый раз утомительно, очеь удобно по Short-Cut`у или кнопке сначала копировать из поля сверху, а потом просто слегка откорректровать.
Но как это сделать, не вызывая события постирования, особенно для датасетов с ключами ?
Я эту проблему решил, но по моему мнению коряво:
1. Для режима Edit при <ключевые поля>.ReadOnly := true:
- Post обновляемой записи.
- ds.Prior
- newval (Variant) := <текущее поле>.Value
- ds.Next
- <текущее поле>.Value := newval (Variant)
Недостаток: метод Cancel не "срабатывает" в полном объеме, да и "лазание" по датасету мне не нравится. (особенно если учесть, что не для всех БД это возможно
2. Для режима Insert
- В обработчике BeforeInsert создается маасив вариантов по числу видимых полей ds и туда в цикле "закачаваются" содержимое всех полей тек.записи.
- Insert срабатывает не "перед", а "после" текущей записи
- при нажатии фишки "Копи" определяется индекс текущего поля в списке видимых полей ds, по этому индексу в массиве вариантов ищется значение и присваивается полю новой записи
Недостатки: вставка "после", время (на медленных компах тормозит заметно для глаза), громоздкость и некрасивость метода.

РезюмеИнтуиция мне посказывает, что это можно сделать проще, причем значительно ! Но вот до сих пор не сообразил :-(
Думаю, что многим из вас приходилось решать подобную задачку. Буду весьма признателен всем, кто поделится опытом.


Val   (2002-09-06 14:52:00) [1]

>MsGuns © (06.09.02 14:29)
Если можно, дайте сампл работающего проекта.
о как, вы ли это, Сергей???
хорошо, в понедельник попытаюсь раскопать у себя, где-то такая штуковина была.


MsGuns   (2002-09-06 14:29:00) [2]

>Val
Идея с чекбоксом принимается как вариант. Что-то в этом, наверное, есть. Надо попробовать, что скажут юзера ?
Если можно, дайте сампл работающего проекта.


Val   (2002-09-06 14:03:00) [3]

1.массив вариантов - зачем, если вы знаете структуру таблицы? Не расточительно ли?
2. чекбокс включает/выключает режим клонирования записи, ведь не всегда юзеру он нужен? Про то что вам нужно конкретное поле не понял, но исправить несложно - будет даже красивее - при включенном режиме клонирования показываете пользователю чеклистбокс, в котором он уже сам отмечает, какие поля ему нужно клонировать. алгоритм остается прежним, только анализируете выбор юзера и переносите значения отмеченных полей.


Mike Kouzmine   (2002-09-06 13:59:00) [4]

при AfterInsert пост не вызывается, поэтому есть время отредактировать и самому запостить. А идея с CheckBoxом самая правильное.
>Не совсем понял. Переносить надо не автоматически ВСЕ поля, а по команде Юзера и одно конкретное поле (текущее)
Так и переноси то что надо в AfterInsert.


MsGuns   (2002-09-06 13:57:00) [5]

Mike Kouzmine (06.09.02 13:53)
>Я делаю стандартно - Ctrl-C Ctrl-V. Только перед вставкой >нажимать надо F2

Не проходит априори, т.к. для этого самого Ctrl+C надо переместиться в пред.запись, тут-то и возникает та самая проблема (POST).


MsGuns   (2002-09-06 13:54:00) [6]

>Val © (06.09.02 13:26)
Спасибо за ответ, но..
>создаем record c аналогами полей НД.
Ну а я создаю массив. Не вижу существенной разницы. Более того,
создание (динамическое) TRecord несколько громозче по тексту.
>if cbClone.Checked then перенос из record в активную запись.
Не совсем понял. Переносить надо не автоматически ВСЕ поля, а по команде Юзера и одно конкретное поле (текущее)
И совсем не понятно, зачем тут чекбокс.

А самое, главное, не решена проблема избежания постирования в Edit-режиме.

Но за совет благодарен !>)


Mike Kouzmine   (2002-09-06 13:53:00) [7]

Я делаю стандартно - Ctrl-C Ctrl-V. Только перед вставкой нажимать надо F2


Val   (2002-09-06 13:26:00) [8]

как вариант:
создаем record c аналогами полей НД. чекбокс cbClone.
в BeforeInsert:
if cbClone.Checked then перенос значений из активной записи в record;
в AfterInsert:
if cbClone.Checked then перенос из record в активную запись.


Наверх

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