Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.10.2012, 09:15
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию Проблема с рекурсией

есть код
Код:
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.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter