![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как найти и подсветить компоненты
Александр_2012 © (2013-02-04 16:18:00)Доброго дня.
Задача: есть компонент PageControl, на нескольких страницах которого расположены компоненты DBEdit. Программа проверяет логику заполнения (зависимости между различными полями БД) и выводит сообщения в Memo обо всех несоответствиях. Есть StringList куда прописываются наименования полей, в которых допущена ошибка в логике заполнения. Это всё работает. Хотелось бы при двойном щелчке на сообщении в Memo чтобы производился поиск по всем страницам PageControl компонентов DBEdit, которые относятся к полям неправильно заполненным (с нарушением логики заполнения) и чтобы эти компоненты были подсвечены, например цветом шрифта, чтобы пользователь сразу мог определить где сделана ошибка. Не могу сообразить как это сделать, но уверен, что вполне возможно.
Александр_2012 (2013-02-11 12:03:00) [1]Всё, всем спасибо. Сделал. Может и не совсем грамотно, но работает.
for j:=0 to masst.Count-1 do
begin
for i:=0 to MainFormKart.ComponentCount-1 do
begin
Temp:=MainFormKart.Components[i];
if (Temp is TDBEdit) and ((Temp as TDBEdit).DataField=masst[j]) then
(Temp as TDBEdit).Color:=clFuchsia;
end;
end;
Может кому и пригодится.
Игорь Шевченко (2013-02-10 22:45:00) [2]
> Как сопоставить поля DBEdit-ам?
[7],[9]
Александр_2021 (2013-02-10 22:19:00) [3]
> Inovet © (08.02.13 13:37) [45]
>
> Вообще ненадёжно привязываться к номеру едита. Назови ты
> их по другому, или просто что измени и всё. Я же предлагал
> - ищи по полю, ссылка на поле есть в едите. Т.е. у тебя
> есть список имён полей, ему сопоставляешь соответсвующие
> едиты при переборе всех контролов.
>
Согласен, плохо привязываться к номеру DBEdit. Но что-то совсем запутался. DBEdit, конечно знает к какому полю он привязан, а вот наоборот. Как сопоставить поля DBEdit-ам?
Inovet (2013-02-08 14:01:00) [4]> [38] Алексндр_2012 (08.02.13 09:41)
> При этом данные уже внесены в таблицу, но окончательное
> сохранение можно прервать отдав команду Abort.
Не внесены они в таблицу.
И по поводу перекомпиляции. Наиболее вероятно, что изменится сначала сама форма, а потом уже и условия её проверки. Так что переделывать и перекомпилировать всё равно придётся.
А проверку желательно иметь на и сервере, на клиенте уже по желанию, мало ли откуда на сервер попадут данные, кроме твоей программы.
Inovet (2013-02-08 13:37:00) [5]Вообще ненадёжно привязываться к номеру едита. Назови ты их по другому, или просто что измени и всё. Я же предлагал - ищи по полю, ссылка на поле есть в едите. Т.е. у тебя есть список имён полей, ему сопоставляешь соответсвующие едиты при переборе всех контролов.
sniknik (2013-02-08 12:36:00) [6]проверки на "найденость" компонента нет.
sniknik (2013-02-08 12:35:00) [7]более конкретизировано
http://www.gunsmoker.ru/2009/05/access-violation.html
Если ZZZ мало, то у вас идёт обращение по ссылке равной nil
sniknik (2013-02-08 12:32:00) [8]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1360134224&n=3
Алексндр_2012 (2013-02-08 11:53:00) [9]Form25.FindComponent
До этого я додумался, но при компиляции получаю сообщение Undeclared identifire 'TDBEdit' . Добавил библиотеку DBCrls компиляция проходит, но когда программа доходит до выполнения
for I:=0 to masst.Count-1 do
For j:=1 to 247 do
if TDBEdit(Main.FindComponent(‘DBEdit’+IntToStr(j))).DataField=masst[i] then TDBEdit(Main.FindComponent(‘DBEdit’+IntToStr(j))).Color:=clRed;
То программа вылетает с сообщением Project raised excption class EAccessViolation withmessage 'Access violation at address 004B7038 ln module progr.exe. Read of address 00000240'. Process stopped.
Но вот где ошибка...
sniknik (2013-02-08 10:25:00) [10]> работало из одной формы по отношению к другой
указанием этой формы - Form25.FindComponent если ты об этом, а то сомнения берут... размышляешь о интегралах, а спрашиваешь как арифметическая операция работает.
> то ее придется переписывать, а задачу перекомпилировать, что вряд-ли удобно (если я правильно понял ваше предложение).
нда...ааа, сколько я подробного слышал, с каким жаром доказывали... "без компиляции", "удобно", "минимум для исправлений" и т.д. в итоге написание с "разрывом логики" (часть в программе, часть в базе) всегда приводило к правкам "и там и там".
либо в программе, либо в базе. если в базе то переноси всю проверку туда (триггер/процедура) из программы просто сохраняй, и обрабатывай эксепт. для подсветки придется процедуру проверки добавлять. туда же в базу. подсвечивать по результатам ее выполнения.
Алексндр_2012 (2013-02-08 09:59:00) [11]на другой форме.
Зачем сохраняешь, а потом из базы уже проверяешь. Чем не устраивает проверка непосредственно при заполнении? Напиши функцию с 60-ю проверками сочетаний значений, только что введённых пользователем или прочитанных из базы, и подсвечивай в ней, хоть в OnAfterScroll, хоть в OnBeforePost, хоть в OnChange, а лучше во всех трёх.
Т.к. в перспективе условия проверок или количество их могут измениться, то мне будет достаточно ввести в таблицу новые условия и они будут проверены, а если написать функцию, то ее придется переписывать, а задачу перекомпилировать, что вряд-ли удобно (если я правильно понял ваше предложение).
Алексндр_2012 (2013-02-08 09:41:00) [12]Доброго дня. Спасибо за участие буду искать решение дальше, уж очень хочется доделать.
Проверка у меня идет на BeforePost. При этом данные уже внесены в таблицу, но окончательное сохранение можно прервать отдав команду Abort.
// вот как это изменить???, чтобы работало
if TDBEdit(FindComponent(‘DBEdit’+IntToStr(j))).DataField=masst[i] then TDBEdit(FindComponent(‘DBEdit’+IntToStr(j))).Color:=clRed;
Если подскажите как изменить чтобы работало из одной формы по отношению к другой будет замечательно (DBEdit находятся на одной форме, а Memo к событию OnDblClick которого хочу привязать эти две строки.
Inovet (2013-02-07 21:25:00) [13]> [32] Александр_2012 (07.02.13 16:49)
> как пояснить? если только выдать сюда все выполняющиеся
> запросы?
Зачем сохраняешь, а потом из базы уже проверяешь. Чем не устраивает проверка непосредственно при заполнении? Напиши функцию с 60-ю проверками сочетаний значений, только что введённых пользователем или прочитанных из базы, и подсвечивай в ней, хоть в OnAfterScroll, хоть в OnBeforePost, хоть в OnChange, а лучше во всех трёх. На сервере уже проверяй запросами, как и советуют.
Anatoly Podgoretsky (2013-02-07 17:43:00) [14]
> sniknik © (07.02.13 15:27) [23]
Птичку жалко, тики
sniknik (2013-02-07 17:22:00) [15]> 60 проверок - это на различные соотношения между порядка 250 полями
т.е. практически ничто... (серьезно, несколько миллисекунд на запрос). тем более данные можно проверять не 1 раз, а скачать при старте и сколько бы не было вводов использовать. все одно на целостность и другие правила баз вам похоже "чихать" (то что ты описываешь, раз зависит, нужно проверять сервером, написать процедуру на вставку и там, в транзакции... а то у тебя момент смены условий не отслеживается. - вот ввел, сделал запрос, проверка ок, т.е. можно записывать, а в этот момент в базе условия меняются...).
Александр_2012 (2013-02-07 16:52:00) [16]PS 60 проверок - это на различные соотношения между порядка 250 полями
KilkennyCat (2013-02-07 16:50:00) [17]если все так строго, почему сначала одни запросом не получить все правила, а потом проверять на соответствие?
Александр_2012 (2013-02-07 16:49:00) [18]как пояснить? если только выдать сюда все выполняющиеся запросы?
> зачем? что за проверки должны быть чтобы требовалось аж
> 60 запросов??? почему введенное вообще зависит от сохраненного
> в базе?
Именно этими запросами и проверяются зависимости типа если поле 1 содержит 2, то поле 2 может содержать 5 или 7, а поле 4 только 8, при этом поле 1 в другом запросе может проверяться по отношению к другим полям. Не я это придумал. Спустили приказ с логическими условиями свыше. Хотя... по логике всё правильно.
От сохранённого в базе никак не зависит, но обратиться с запросом к DBEdit.Text бессмысленно. Запросы работают только с таблицей БД. Хотя я не спорю, может чего и не понимаю, но во всяком случае, если изменить значение в каком-нибудь DBEdit на заведомо отсудствующее в таблице и не сохраняя его попытаться выдать запрос на данное значение , то получим в ответ ноль строк(пока не отработаем Post). А писать интерпритатор строк, чтобы анализировать какие-нибудь строки проверок из внешнего файла типа if pole1>pole2 and pole2<> pole3. Это ещё страшнее.
sniknik (2013-02-07 16:27:00) [19]> выполняться порядка 60 SQL-запросов...
зачем? что за проверки должны быть чтобы требовалось аж 60 запросов??? почему введенное вообще зависит от сохраненного в базе?
Inovet (2013-02-07 16:26:00) [20]> [29] Александр_2012 (07.02.13 16:22)
> но если при каждом нажатии будет выполняться порядка 60
> SQL-запросов...
Ты проясни-таки этот момент.