![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема при вводе данных ! Поделитесь экспириенсом [D6, Paradox]
MsGuns © (2002-09-06 12:55:00)При редактировании/добавлении датасетов юзерам очень удобно переносить в текущую запись содержимое этого же поля из передыдущей (верхней в гриде). Пример
Запись Поле 1 Поле2
---------------------------------------------------------------
n-1 6.09.02 Процессор Celeron 800 Mh
> n6.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 в активную запись.