есть код
Код:
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;
Почему так происходит? рассмотрю любые идеи.