|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Проблема с рекурсией
есть код
Код:
function CheckRed(Src:TComponent;CheckResult:Boolean):Boolean; var x:Integer; procedure Chk; procedure HC; begin //создаём TBaloonHint _HintCreate(TControl(Src.Components[x]),'Заполните все поля отмеченые красным','Заголовок'); end; begin if Src.Components[x] is TLabel then begin Result:=Result and (TLabel(Src.Components[x]).Font.Color<>clRed); if TLabel(Src.Components[x]).Font.Color=clRed then HC; end else if Src.Components[x] is TStaticText then begin Result:=Result and (TStaticText(Src.Components[x]).Font.Color<>clRed); if TStaticText(Src.Components[x]).Font.Color=clRed then HC; end else if Src.Components[x] is TRadioButton then begin Result:=Result and (TRadioButton(Src.Components[x]).Font.Color<>clRed); if TRadioButton(Src.Components[x]).Font.Color=clRed then HC; end else if Src.Components[x] is TSpeedButton then begin Result:=Result and (TSpeedButton(Src.Components[x]).Font.Color<>clRed); if TSpeedButton(Src.Components[x]).Font.Color=clRed then HC; end else if Src.Components[x] is TDBLookupComboboxEh then begin if TDBLookupComboboxEh(Src.Components[x]).EmptyDataInfo.Font.Color=clRed then begin Result:=Result and not VarIsNull(TDBLookupComboboxEh(Src.Components[x]).KeyValue); if VarIsNull(TDBLookupComboboxEh(Src.Components[x]).KeyValue) then HC; end; end else if Src.Components[x] is TDBEditEh then begin if TDBEditEh(Src.Components[x]).EmptyDataInfo.Font.Color=clRed then begin Result:=Result and (TDBEditEh(Src.Components[x]).Text<>''); if TDBEditEh(Src.Components[x]).Text='' then HC; end; end else if Src.Components[x] is TDBNumberEditEh then begin if TDBNumberEditEh(Src.Components[x]).EmptyDataInfo.Font.Color=clRed then begin Result:=Result and (TDBNumberEditEh(Src.Components[x]).Text<>''); if TDBNumberEditEh(Src.Components[x]).Text='' then HC; end; end; end; begin Result:=CheckResult; for x:=0 to Src.ComponentCount-1 do begin Result:=Result and CheckRed(Src.Components[x],Result); Chk; end; end; Это рекурсия которая проходит по компонентам на форме и если хоть один компонент из нужных не удовлетворяет условию(например красным шрифтом написан) на выходе False, короче проверка на правильность заполнения полей. передаю в неё MDI Child форму Проблема в том что иногда эта процедура начинает откровенно глючить, показывает мне на TSpeedButton который находиться на другой форме и визуально не подходит под условие проверки(ну т.е. шрифт на нём чёрный а определяется как красный) притом показывает на кнопку которая находиться совсем на другой главной форме MDI-контейнер и иногда в пошаговом проходе просто теряет контроль над экзешником ну т.е. экзешник висит, F7 не работает компонентов на форме не много около 60 на другой форме где чуть больше компонентов проходит нормально один раз всё проходит нормально а в следующий начинает глючить вызов Код:
function TEditForm.Save:Boolean; begin Result:=True; if GetExistChanges then begin Result:=Result and CheckRed(Self,Result); if Assigned(FOnCheckValid) then FOnCheckValid(Self,Result); if Result then DoSave else Result:=False end; end; Почему так происходит? рассмотрю любые идеи. Код сырец Последний раз редактировалось Lost_Fish, 18.10.2012 в 09:33. |