Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.11.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
Александр_2012   (2013-02-04 16:18) [0]

Доброго дня.
Задача: есть компонент PageControl, на нескольких страницах которого расположены компоненты DBEdit. Программа проверяет логику заполнения (зависимости между различными полями БД) и выводит сообщения в Memo обо всех несоответствиях. Есть StringList куда прописываются наименования полей, в которых допущена ошибка в логике заполнения. Это всё работает. Хотелось бы при двойном щелчке на сообщении в Memo чтобы производился поиск по всем страницам PageControl компонентов DBEdit, которые относятся к полям неправильно заполненным (с нарушением логики заполнения) и чтобы эти компоненты были подсвечены, например цветом шрифта, чтобы пользователь сразу мог определить где сделана ошибка. Не могу сообразить как это сделать, но уверен, что вполне возможно.


 
Cobalt ©   (2013-02-04 16:32) [1]

TMemo.SelText тебе в руки
или SelStart


 
Александр_2012   (2013-02-04 16:46) [2]

В БД есть таблица, состоящая из двух полей: в одном SQL-запрос, которым проверяется логика заполнения, в другом сообщение, которое будет выдано в случае ошибки. Проблема в том, что компонентов DBEdit много и они просто пронумерованы в соответствии с принятой формой отчетности. Поэтому оператор получив сообщение типа "данный товар не может иметь указанный артикул" вынужден брать бумажный вариант формы и искать какому полям (DBEdit) соответствует данное сообщение, что неудобно. У меня по двойному щелчку по строке сообщения в Memo в StringList из SQL-запроса (см. выше) прописываются имена всех проверяемых полей в данном запросе. Т.е. имена полей где допущены ошибки заполнения у меня уже есть. Надо найти и подсветить компоненты DBEdit, которые связаны с данными полями.


 
Inovet ©   (2013-02-04 16:55) [3]

Проверка на уровне ДатаСет? В нём можно посмотреть, что там подключено к полям для редактирования.


 
Александр_2012   (2013-02-04 17:01) [4]


> Inovet ©   (04.02.13 16:55) [3]
>
> Проверка на уровне ДатаСет? В нём можно посмотреть, что
> там подключено к полям для редактирования.

Не понял. Например, у меня поле TOVAR связано с компонентом DBEdit25. Я получаю информацию, что ошибочно заполнено поле TOVAR, значит мне надо найти на какой странице находится DBEdit25 и подсветить его. Разве DataSet об этом знает?


 
sniknik ©   (2013-02-04 17:17) [5]

procedure TForm1.DBEdit1Change(Sender: TObject);
begin
 with TDBEdit(Sender) do
   if Field.AsInteger in [6..16]
     then Color:= clRed
     else Color:= clWindow;
end;


 
Плохиш ©   (2013-02-04 17:20) [6]

TDBEdit.Field - поле в запросе к которому подключён элемент редактирования.
TDBEdit.DataSource - источник данных для элемента редактирования.


 
Игорь Шевченко ©   (2013-02-04 17:25) [7]


> Разве DataSet об этом знает?


TField.FocusControl ?


 
Александр_2012   (2013-02-04 17:32) [8]


> procedure TForm1.DBEdit1Change(Sender: TObject);
> begin
>  with TDBEdit(Sender) do
>    if Field.AsInteger in [6..16]
>      then Color:= clRed
>      else Color:= clWindow;
> end;
>


Ммм. Я, наверное, не понял кода. Или не поняли меня. Проверка на допустимость диапазонов значений для каждого поля БД у меня есть и работает. Есть также проверка, реализуемая SQL-запросами, о допустимых значениях одного поля, если другое приняло определённое значение. Реализовывать в виде фильтров это сложно или вообще невозможно, т.к. зависимости реально могут быть и между двумя и трем и более полями БД.
Мне нужно программным путём найти компонент (или компоненты) типа DBEdit, к которому (или к к которым) привязано поле БД, заполненное неправильно. Мне кажется, что здесь скорее подходит что-то типа FindComponent, но как это реализовать пока не понимаю.


 
Игорь Шевченко ©   (2013-02-04 18:03) [9]


> Мне кажется, что здесь скорее подходит что-то типа FindComponent,
>  но как это реализовать пока не понимаю.


RTFS: DBCtrls.pas, FocusControl


 
sniknik ©   (2013-02-04 18:14) [10]

> Я, наверное, не понял кода.
а ты еще немного "повтыкай на код".

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

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


 
sniknik ©   (2013-02-04 18:18) [11]

другое условие, для понимания...
procedure TForm1.DBEdit25Change(Sender: TObject);
begin
 with TDBEdit(Sender) do
   if Field.FieldName = "TOVAR"
     then Color:= clRed
     else Color:= clWindow;
end;


 
Inovet ©   (2013-02-04 19:57) [12]

> [8] Александр_2012   (04.02.13 17:32)
> о допустимых значениях одного поля, если другое приняло
> определённое значение.
...
> Мне нужно программным путём найти компонент (или компоненты)
> типа DBEdit


procedure TForm1.DataSet1BeforePost(DataSet: TDataSet);
begin
 if (DataSet1Field1.AsInteger = 1) and (DataSet1Field2.AsString <> "a") then
 begin
   DBEdit1.Color:= clRed;
   DBEdit2.Color:= clRed;
 end
 else
 begin
   DBEdit1.Color:= clWindow;
   DBEdit2.Color:= clWindow;
 end;
end;

Или, как ты хочешь, в цикле

for i = 0 to ControlsCount - 1 do

проверяй принадлежность Controls[i] к TDBEdit потом проверяй подключен ли он к нужному полю и меняй цвет. Но зачем так сложно, если контролы и так тебе и так известны?


 
Dennis I. Komarov ©   (2013-02-04 22:24) [13]

Храни массив ссылок на объекты, номер однозначно соответствует строке из Мемо... (а лучше TListView)


 
KilkennyCat ©   (2013-02-04 23:48) [14]


> Поэтому оператор получив сообщение типа "данный товар не
> может иметь указанный артикул" вынужден брать бумажный вариант
> формы и искать какому полям (DBEdit) соответствует данное
> сообщение


странная логика. напоминает некоторые вебформы, которые заполняешь, заполняешь, потом код, потом еще, а потом сообщает что в самом начале неправильно.
не лучше ли проверять сразу?

ну а так -  пример Sniknika


 
Германн ©   (2013-02-05 01:58) [15]


> Программа проверяет логику заполнения (зависимости между
> различными полями БД) и выводит сообщения в Memo обо всех
> несоответствиях. Есть StringList куда прописываются наименования
> полей, в которых допущена ошибка в логике заполнения. Это
> всё работает. Хотелось бы при двойном щелчке на сообщении
> в Memo

Memo надо заменить на что-нибудь более подходящее. Желательно такое, где каждое сообщение было бы отдельной строкой. TListBox, TListView etc.
А дополнительный StringList куда прописываются, имхо вообще лишний.


 
Александр_2012   (2013-02-06 12:50) [16]

Доброго дня.

Конструкция DM.DataQ.FieldByName(masst.Strings[0]).FocusControl,
которую посоветовал Игорь Шевченко, работает, но у меня в masst находится список полей, где возможны ошибки заполнения, а данная конструкция обращается к одному полю (я специально указал Strings[0]), причём фокус я на нём получаю, а вот как его подсветить и, опять же фокус будет передан только в том случае, если PageControl открыт на нужной странице, т.е. где расположен нужный DBEdit.

В качестве пробы я создал простой проект состоящий из PageControl с двумя страницами, на которые набросал несколько DBEdit, компоненты Odac. кнопку и написал такой код

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i:=1 to OraQuery1.FieldCount do
 if TDBEdit(FindComponent(‘DBEdit’+IntToStr(i))).DataField=’TOVAR’ then
    TDBEdit(FindComponent(‘DBEdit’+IntToStr(i))).Color:=clRed;
end;

Работает на ура. Нужный DBEdit подсвечивается на какой бы странице он не находился. Но в свою программу вставить его не удаётся, т.к. в ней компоненты Odac находятся на DataModule, Memo, куда выводятся сообщения об ошибках на отдельной форме (InForm), DBEditы находятся на основной (mainForm) форме.
Memo заполняется так:

procedure TDM.DataQBeforePost(DataSet: TDataSet);
var
flgerr: boolean;
begin
flgerr:=False;
InForm.Memo1.Clear;
with DM.LUS do //здесь находятся запросы и сообщения, для проверки логики заполнения
 begin
 Close;
 SQL.Clear;
 SQL.Add("select lus, mess from fulllus");
 Open;
 end;
while not DM.LUS.Eof do
 begin
 with DM.Help1 do
   begin
   Close;
   SQL.Clear;
   SQL.Add("select pole1, pole2, pole3 from edds.v_k99");
   SQL.Add("where id="+DM.DataQ.FieldByName("id").AsString);
   SQL.Add(" and "+DM.LUS.FieldByName("lus").AsString);
   try
   Open;
   except
ShowMessage("Ошибка"+#13+SQL.Text+#13+#13+"ЛУС"+#13+DM.LUS.FieldByName("mess").AsString);
   exit;
   end; //try
   end; //with
 if DM.Help1.RecordCount>0 then
   begin
   flgerr:=True;
   InForm.Memo1.Lines.Add("*** "+DM.LUS.FieldByName("mess").AsString+" ***");
   InForm.Memo1.Lines.Add("");
   end;
 DM.LUS.Next;
 end;
InForm.Show;
if flgerr then Abort;
end;

procedure TInForm.Memo1DblClick(Sender: TObject);
var
st, buf: string;
i,j: integer;
masst: TStringList;
masnpol: TStringList;
begin
masst:=TStringList.Create;
masnpol:=TStringList.Create;
with DM.LUS do
 begin
 Close;
 SQL.Clear;
 SQL.Add("select * from tavary");
 SQL.Add("where 2<1");
 Open;
 end;
for i:=0 to DM.LUS.FieldCount-1 do
 masnpol.Add(DM.LUS.Fields[i].FieldName);
st:=Memo1.Lines[Memo1.CaretPos.Y];
Delete(st,1,4); // удаляю лишние символы в начале и в конце сообщения
Delete(st,Length(st)-3,4);
with DM.LUS do
 begin
 Close;
 SQL.Clear;
 SQL.Add("select lus from fulllus");
 SQL.Add("where mess="""+st+"""");
 Open;
 end;
st:=DM.LUS.FieldByName("lus").AsString;
for i:=0 to length(st) do
 if st[i] in ["(",")","=",">","<"] then
   st[i]:=" ";
repeat
st:=Trim(st);
if st<>"" then
 begin
 if Pos(" ", st)>0 then
   begin
   buf:=UpperCase(Copy(st, 1, Pos(" ", st)-1));
   delete(st,1,Pos(" ", st)-1);
   end
 else
   begin
   buf:=st;
   st:="";
   end;
 if (masnpol.IndexOf(buf)<>-1) and (masst.IndexOf(buf)=-1) then
   masst.Add(buf);
 end;
until st="";
for i:=0 to masst.Count-1 do
 for j:=1 to 247 do // у меня 247 полей привязанных к DBEdit
// вот как это изменить???, чтобы работало
 if TDBEdit(FindComponent(‘DBEdit’+IntToStr(j))).DataField=masst[i] then
    TDBEdit(FindComponent(‘DBEdit’+IntToStr(j))).Color:=clRed;
// и как программно определить сколько DBEdit-ов использовано в программе вместо того чтобы жестко задавать 247?

masst.Free;
masnpol.Free;
end;

Планировалось, что двойной щелчок на строке Memo1 подсветит все связанные между собой поля по одной ошибке заполнения, двойные щелчки по следующим строкам соответственно подсветит все связанные между собой поля по другим ошибкам заполнения.


 
Александр_2021   (2013-02-06 22:46) [17]


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


Привёл код и тишина...


 
anonimus   (2013-02-07 09:00) [18]


> Привёл код и тишина...

у людей (в т.ч. программистов) есть свои дела

FindComponent F1

> Indicates whether a given component is owned by the
> component.

Искать надо там где они есть(на нужной форме)!
See Also Components[]

> Lists all components owned by the component.


>  for j:=1 to 247 do // у меня 247 полей привязанных к DBEdit

А если нумерация будет сбита? (добавили 5-ый , потом удалили 2-ой).

> // и как программно определить сколько DBEdit-ов использовано
> в программе вместо того чтобы жестко задавать 247?


See Also Сomponents

> Indicates the number of components owned by the component.
>

>


 
Кщд   (2013-02-07 09:58) [19]

>Александр_2021   (06.02.13 22:46) [17]
ОФОМС или страховая?


 
sniknik ©   (2013-02-07 10:42) [20]

>> Привёл код и тишина...
> у людей (в т.ч. программистов) есть свои дела
мало того, программисты тоже люди... со своими "бзиками".

например мне пофигу теперь на этот код, когда я уже привел пример лучший (ИМХО)... по логике, не по "копипастовскому" признаку.
и ожидаю его развития, а не продолжения от автора "бодания запертых ворот". ну вот нафига? когда есть открытые. хочешь назначать со стороны? да без проблем сделай массив/набор из порядковых номеров или названий полей "неправильных" назначь "со стороны" а проверяй  вхождение в самом компоненте (инициировать событие онченж элементарно, например просто вызвав функцию поиска чтобы найти текущую же запись). элементарно. никакого поиска... оно и не терялось чтобы искать.
вот показал бы его раньше, сказал что с ним не так (сейчас и этого нет) можно было бы обсудить, или можно было бы обсудить почему "мой" метод автору не подходит, причина, если она адекватная. а также почему свой вариант автору кажется более правильным тоже можно было поговорить. а так, нет, не охота.


 
Александр_2012   (2013-02-07 12:06) [21]


> Кщд   (07.02.13 09:58) [19]
> >Александр_2021   (06.02.13 22:46) [17]
> ОФОМС или страховая?
> <Цитата>


Не относимся ни к тем ни к другим. И там пользуются обычно программами, написанными профессиональными программистами.


 
Александр_2012   (2013-02-07 14:27) [22]


> sniknik ©   (04.02.13 18:18) [11]
> другое условие, для понимания...
procedure TForm1.DBEdit25Change(Sender:
>  TObject);begin  with TDBEdit(Sender) do    if Field.FieldName
> = "TOVAR"      then Color:= clRed      else Color:= clWindow;
> end;


Уважаемый sniknik ©. Вы пишите, что предложили заведомо лучшее решение. Я действительно хочу его понять...
Событие OnChange будет происходить при каждом изменении значения вводимого в DBEdit, т.е., если мне надо ввести 12345, событие произойдёт 5 раз. На OnChange возможно ввести проверку на допустимость вводимого значения кодификатору, но разумно ли это? Сделав проверку на OnExit, можно обойтись однократной проверкой и, если надо, выдать сообщение об ошибке и вернуть фокус ввода. Так сделано у меня. Затем, если в кодификаторе есть, например значение 12 и пользователь начинает его вводить, то на вводе 1 получит сообщение об ошибке (на OnChange). Хорошо ли это? Проверять на допустимость заполнения конкретным значением одного поля, при условии, что другое поле получило определённое значение на OnChange вообще бессмысленно, а если одно из полей ещё не заполнено? Добавить проверку на ноль или null? А ведь, как я уже писал, зависимости могут быть не только между двумя полями, но и пятью и десятью. Я думаю, что в этом случае наиболее простое решение осуществлять проверку с помощью SQL-запросов на BeforePost, что и сделано у меня. Все сообщения об ошибках выводятся на отдельную форму в Memo. Задача у меня полностью работает. Хотелось просто облегчить жизнь пользователей, чтобы щёлкнув дважды на сообщении об ошибке они получили на основной форме подсвеченные DBEdit ы, которые к этой ошибке относятся, чтобы пользователь мог посмотреть не его ли это ошибка (вбил не то или не туда). И ещё, данные в БД вводятся с бумажных носителей и тот, кто их заполнял тоже человек и мог ошибиться, поэтому даже ошибочная информация сохраняется, а предоставивший бумажный носитель предупреждается о необходимости исправления, т.к. оператор просто вводит и не может знать, что реально должно быть заведено.


> например мне пофигу теперь на этот код, когда я уже привел
> пример лучший (ИМХО)... по логике


Если Вам будет несложно, то объясните свою логику.


 
sniknik ©   (2013-02-07 15:27) [23]

> при каждом изменении значения вводимого в DBEdit
и что? экономишь компьютерные тики? нет проблем сделать 2...2000 раз, если это не тормозит (не в тиках, а чтобы на глаз заметно) процесс (а в случае ручного ввода основной "тормоз" перед монитором, даже если комп из прошлого века...)

> то на вводе 1 получит сообщение об ошибке (на OnChange). Хорошо ли это?
у меня нет сообщения, у меня если неправильно меняется фон.

> зависимости могут быть не только между двумя полями, но и пятью и десятью.
так это же замечательно, меняешь одно и сразу видишь сломанную "цепочку" от этих действий.

> поэтому даже ошибочная информация сохраняется
проверка это не сохранение, про него речи пока не было, ничто не мешает и в "моем" варианте сохранить не взирая на "глючноввод".

> то объясните свою логику.
проверять и отображать результат проверки сразу, не откладывая в "Memo" (нет Memo можно оставить, и даже продолжать писать туда на выходе из компонент, как "хистори" пойдет)


 
Александр_2012   (2013-02-07 15:47) [24]


> > зависимости могут быть не только между двумя полями, но
> и пятью и десятью.
> так это же замечательно, меняешь одно и сразу видишь сломанную
> "цепочку" от этих действий.


Что ж... Звучит неплохо. У меня порядка 60 вариантов проверок зависимостей между полями в виде SQL-запросов. Т.е. при каждом нажатии (при вводе данных) будут прогоняться эти 60 запросов? И потом, я к сожалению, не очень представляю принципы работы компонентов, но обращаться SQL-запросом к БД, если не отрабатывается Post мне кажется бессмысленным, т.к. в БД находятся старые данные или ещё пустые данные - как тут проверить? (или я ошибаюсь?)


 
Inovet ©   (2013-02-07 15:49) [25]

> [22] Александр_2012   (07.02.13 14:27)
> выдать сообщение об ошибке и вернуть фокус ввода

Так можно в клинч войти.

> [22] Александр_2012   (07.02.13 14:27)
> осуществлять проверку с помощью SQL-запросов на BeforePost,

Так вся информация для проверки есть же в контролах. Или уже нет и часть сохранена в БД?


 
KilkennyCat ©   (2013-02-07 16:06) [26]


> Событие OnChange будет происходить при каждом изменении
> значения вводимого в DBEdit, т.е., если мне надо ввести
> 12345, событие произойдёт 5 раз


оно в любом случае происходит, даже если ты в обработчике ничего не напишешь.


 
sniknik ©   (2013-02-07 16:17) [27]

> Так вся информация для проверки есть же в контролах.
она должна  быть в контрролах, иначе что то не так в "консерватории", оно получается либо частями пишется, либо зависит от ранее введенного. ... ну, это вообще то можно представить/может быть но, вот прямо тут, такой случай? из какого поста это можно прочитать?

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


 
sniknik ©   (2013-02-07 16:20) [28]

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


 
Александр_2012   (2013-02-07 16:22) [29]


> KilkennyCat ©   (07.02.13 16:06) [26]
>
> > Событие OnChange будет происходить при каждом изменении
>
> > значения вводимого в DBEdit, т.е., если мне надо ввести
>
> > 12345, событие произойдёт 5 раз
>
>
> оно в любом случае происходит, даже если ты в обработчике
> ничего не напишешь.


Это я понимаю, но если при каждом нажатии будет выполняться порядка 60 SQL-запросов... У меня проверка происходит один раз на BeforePost и то комп задумывается примерно на 0,5 секунды. В базе есть поля 10-значные - это что ж ввод поля будет затягиваться на 50-60 секунд?


 
Inovet ©   (2013-02-07 16:26) [30]

> [29] Александр_2012   (07.02.13 16:22)
> но если при каждом нажатии будет выполняться порядка 60
> SQL-запросов...

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


 
sniknik ©   (2013-02-07 16:27) [31]

> выполняться порядка 60 SQL-запросов...
зачем? что за проверки должны быть чтобы требовалось аж 60 запросов??? почему введенное вообще зависит от сохраненного в базе?


 
Александр_2012   (2013-02-07 16:49) [32]

как пояснить? если только выдать сюда все выполняющиеся запросы?


> зачем? что за проверки должны быть чтобы требовалось аж
> 60 запросов??? почему введенное вообще зависит от сохраненного
> в базе?


Именно этими запросами и проверяются зависимости типа если поле 1 содержит 2, то поле 2 может содержать 5 или 7, а поле 4 только 8, при этом поле 1 в другом запросе может проверяться по отношению к другим полям. Не я это придумал. Спустили приказ с логическими условиями свыше. Хотя... по логике всё правильно.
От сохранённого в базе никак не зависит, но обратиться с запросом к DBEdit.Text бессмысленно. Запросы работают только с таблицей БД. Хотя я не спорю, может чего и не понимаю, но во всяком случае, если изменить значение в каком-нибудь DBEdit на заведомо отсудствующее в таблице и не сохраняя его попытаться выдать запрос на данное значение , то получим в ответ ноль строк(пока не отработаем Post). А писать интерпритатор строк, чтобы анализировать какие-нибудь строки проверок из внешнего файла типа if pole1>pole2 and pole2<> pole3. Это ещё страшнее.


 
KilkennyCat ©   (2013-02-07 16:50) [33]

если все так строго, почему сначала одни запросом не получить все правила, а потом проверять на соответствие?


 
Александр_2012   (2013-02-07 16:52) [34]

PS 60 проверок - это на различные соотношения между порядка 250 полями


 
sniknik ©   (2013-02-07 17:22) [35]

> 60 проверок - это на различные соотношения между порядка 250 полями
т.е. практически ничто... (серьезно, несколько миллисекунд на запрос). тем более данные можно проверять не 1 раз, а скачать при старте и сколько бы не было вводов использовать. все одно на целостность и другие правила баз вам похоже "чихать" (то что ты описываешь, раз зависит, нужно проверять сервером, написать процедуру на вставку и там, в транзакции... а то у тебя момент смены условий не отслеживается. - вот ввел, сделал запрос, проверка ок, т.е. можно записывать, а в этот момент в базе условия меняются...).


 
Anatoly Podgoretsky ©   (2013-02-07 17:43) [36]


> sniknik ©   (07.02.13 15:27) [23]

Птичку жалко, тики


 
Inovet ©   (2013-02-07 21:25) [37]

> [32] Александр_2012   (07.02.13 16:49)
> как пояснить? если только выдать сюда все выполняющиеся
> запросы?

Зачем сохраняешь, а потом из базы уже проверяешь. Чем не устраивает проверка непосредственно при заполнении? Напиши функцию с 60-ю проверками сочетаний значений, только что введённых пользователем или прочитанных из базы, и подсвечивай в ней, хоть в OnAfterScroll, хоть в OnBeforePost, хоть в OnChange, а лучше во всех трёх. На сервере уже проверяй запросами, как и советуют.


 
Алексндр_2012   (2013-02-08 09:41) [38]

Доброго дня. Спасибо за участие буду искать решение дальше, уж очень хочется доделать.

Проверка у меня идет на BeforePost. При этом данные уже внесены в таблицу, но окончательное сохранение можно прервать отдав команду Abort.

// вот как это изменить???, чтобы работало
if TDBEdit(FindComponent(‘DBEdit’+IntToStr(j))).DataField=masst[i] then TDBEdit(FindComponent(‘DBEdit’+IntToStr(j))).Color:=clRed;

Если подскажите как изменить чтобы работало из одной формы по отношению к другой будет замечательно (DBEdit находятся на одной форме, а Memo к событию OnDblClick которого хочу привязать эти две строки.


 
Алексндр_2012   (2013-02-08 09:59) [39]

на другой форме.

Зачем сохраняешь, а потом из базы уже проверяешь. Чем не устраивает проверка непосредственно при заполнении? Напиши функцию с 60-ю проверками сочетаний значений, только что введённых пользователем или прочитанных из базы, и подсвечивай в ней, хоть в OnAfterScroll, хоть в OnBeforePost, хоть в OnChange, а лучше во всех трёх.

Т.к. в перспективе условия проверок или количество их могут измениться, то мне будет достаточно ввести в таблицу новые условия и они будут проверены, а если написать функцию, то ее придется переписывать, а задачу перекомпилировать, что вряд-ли удобно (если я правильно понял ваше предложение).


 
sniknik ©   (2013-02-08 10:25) [40]

> работало из одной формы по отношению к другой
указанием этой формы - Form25.FindComponent если ты об этом, а то сомнения берут... размышляешь о интегралах, а спрашиваешь как арифметическая операция работает.

> то ее придется переписывать, а задачу перекомпилировать, что вряд-ли удобно (если я правильно понял ваше предложение).
нда...ааа, сколько я подробного слышал, с каким жаром доказывали... "без компиляции", "удобно", "минимум для исправлений" и т.д. в итоге написание с "разрывом логики" (часть в программе, часть в базе) всегда приводило к правкам "и там и там".
либо в программе, либо в базе. если в базе то переноси всю проверку туда (триггер/процедура) из программы просто сохраняй, и обрабатывай эксепт. для подсветки придется процедуру проверки добавлять. туда же в базу. подсвечивать по результатам ее выполнения.


 
Алексндр_2012   (2013-02-08 11:53) [41]

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 12:32) [42]

http://delphimaster.net/view/15-1360134224/


 
sniknik ©   (2013-02-08 12:35) [43]

более конкретизировано
http://www.gunsmoker.ru/2009/05/access-violation.html
Если ZZZ мало, то у вас идёт обращение по ссылке равной nil


 
sniknik ©   (2013-02-08 12:36) [44]

проверки на "найденость" компонента нет.


 
Inovet ©   (2013-02-08 13:37) [45]

Вообще ненадёжно привязываться к номеру едита. Назови ты их по другому, или просто что измени и всё. Я же предлагал - ищи по полю, ссылка на поле есть в едите. Т.е. у тебя есть список имён полей, ему сопоставляешь соответсвующие едиты при переборе всех контролов.


 
Inovet ©   (2013-02-08 14:01) [46]

> [38] Алексндр_2012   (08.02.13 09:41)
> При этом данные уже внесены в таблицу, но окончательное
> сохранение можно прервать отдав команду Abort.

Не внесены они в таблицу.

И по поводу перекомпиляции. Наиболее вероятно, что изменится сначала сама форма, а потом уже и условия её проверки. Так что переделывать и перекомпилировать всё равно придётся.

А проверку желательно иметь на и сервере, на клиенте уже по желанию, мало ли откуда на сервер попадут данные, кроме твоей программы.


 
Александр_2021   (2013-02-10 22:19) [47]


> Inovet ©   (08.02.13 13:37) [45]
>
> Вообще ненадёжно привязываться к номеру едита. Назови ты
> их по другому, или просто что измени и всё. Я же предлагал
> - ищи по полю, ссылка на поле есть в едите. Т.е. у тебя
> есть список имён полей, ему сопоставляешь соответсвующие
> едиты при переборе всех контролов.
>

Согласен, плохо привязываться к номеру DBEdit. Но что-то совсем запутался. DBEdit, конечно знает к какому полю он привязан, а вот наоборот. Как сопоставить поля DBEdit-ам?


 
Игорь Шевченко ©   (2013-02-10 22:45) [48]


> Как сопоставить поля DBEdit-ам?


[7],[9]


 
Александр_2012   (2013-02-11 12:03) [49]

Всё, всем спасибо. Сделал. Может и не совсем грамотно, но работает.

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;

Может кому и пригодится.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.11.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.71 MB
Время: 0.004 c
15-1369487360
О-Сознание
2013-05-25 17:09
2013.11.10
Плавно преобразовать один цвет в другой.


15-1366604147
Sergey Masloff
2013-04-22 08:15
2013.11.10
куда пойти учиться


15-1369285624
"Добрый Сок"
2013-05-23 09:07
2013.11.10
Это С? Что это делает?


2-1360264863
alumium
2013-02-07 23:21
2013.11.10
Надежное удаление с последующим форматированием


6-1269943391
ZeTToG350
2010-03-30 14:03
2013.11.10
Вопрос по IdMappedPortTCP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский