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

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

как найти и подсветить компоненты


Страницы:   1 2 3

Александр_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-запросов...

Ты проясни-таки этот момент.


Страницы:   1 2 3

Наверх

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