Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.12;
Скачать: CL | DM;

Вниз

Потеря модальности   Найти похожие ветки 

 
Kurtevich ©   (2004-11-19 21:23) [0]

Открываю окно вызовом ShowModal(), в этом окне в свою очередь есть кнопки, которые открывают другие окна, тоже ShowModal(). При этом когда такое окно закрывается, то первое окно уже не модально - то есть можно спокойно переходить в другие окна приложения. Самое интересное, что это действует не со всеми - одно окно после открытия-закрытия оставляет модальность первого, в то время как два других - нет. С чем это может быть связано?


 
KilkennyCat ©   (2004-11-20 15:59) [1]

с ошибкой...
код в студию


 
ламер ©   (2004-11-21 15:28) [2]

наверняка, где-то выполняется EnableWindow().


 
Kurtevich ©   (2004-11-22 20:18) [3]

Что касается EnableWindow() - не знаю, может она где-то и вызывается... в глубинах VCL... но не в том тексте, что передо мной... я не настолько умный, чтоб пользоваться функциями WinAPI. А по-поводу кода в студию - эт запросто! ;)

1. Это тот случай, где все в порядке:
procedure TFSearch.PriceDetailToolButtonClick(Sender: TObject);
begin
if fenPriceDetSelect = ciNotSelect then exit;

FEPriceDet := TFEPriceDet.Create(self);
try
 FDM.PriceDetailTable.MasterFields := cFldPresenceID;
 FDM.PriceDetailTable.MasterSource := FRDM.RPresenceDataSource;

 FEPriceDet.Caption := FEPriceDet.Caption + " - " + FRDM.RPresenceTableManufacName.AsString
                     + " " + FRDM.RPresenceTableName.AsString;

 FEPriceDet.ShowModal();
 fbPriceSelected := ( FEPriceDet.FormResult = mrOk );

 fsPriceDetID          := FEPriceDet.PriceDetID;
 fsPriceDetCLI_ID      := FEPriceDet.PriceDetCLI_ID;
 fsPriceDetCliName     := FEPriceDet.PriceDetCliName;
 fcPriceDetNatOutPrice := FEPriceDet.PriceDetNatOutPrice;
 fcPriceDetNatInPrice  := FEPriceDet.PriceDetNatInPrice;  
finally
 FDM.PriceDetailTable.MasterSource := NIL;
 FDM.PriceDetailTable.MasterFields := "";

 FEPriceDet.Free();
end;

if fbPriceSelected then Choice();
end;


2. Здесь все херооооово:
procedure TFSearch.AddFindToolButtonClick(Sender: TObject);
var vbPresen: boolean;
begin
FAddSearch := TFAddSearch.Create(self);
try
 vbPresen := true;
 if ActiveControl = DBGrid then
  begin
   if NOT FRDM.ARPresenceTable.Empty then
    FAddSearch.Search_NRM_NAME := FRDM.RPresenceTable_NRM_NAME.AsString
   else vbPresen := false;
  end
 else if ActiveControl = AnalogDBGrid then
  begin
   if NOT FRDM.ARAnalogTable.Empty then
    FAddSearch.Search_NRM_NAME := FRDM.RAnalogTable_NRM_NAME.AsString
   else vbPresen := false;
  end
 else if ActiveControl = FindComboBox then
  FAddSearch.Search_NRM_NAME := StrToKey(FindComboBox.Text, FRDM.Authorized);

 if vbPresen then
  begin
   FAddSearch.Seek();
   FAddSearch.ShowModal();
  end;
finally
 FAddSearch.Free();
end;
end;


3. И еще один нездоровый глюк:
procedure TFSearch.DistFindToolButtonClick(Sender: TObject);
begin
if ( FRDM.ARPresenceTable.Empty ) then exit;

FDistSearch := TFDistSearch.Create(self);
try
 if FDistSearch.NumPos > 0 then FDistSearch.ShowModal();
finally
 FDistSearch.Free();
end;
end;


Такое... Если понадобятся коды классов этих форм - в следующий раз возможно... Но надеюсь уже здесь вы найдете массу ошибок... Очень надеюсь.


 
Kurtevich ©   (2004-11-23 15:58) [4]

Ну эт... так че... никаких идей? :(


 
cae ©   (2004-11-23 16:15) [5]

Попробуй создавать окна так :
FEPriceDet := TFEPriceDet.Create(Application);


 
Kurtevich ©   (2004-11-23 20:08) [6]

Не-а... Та же фигня... :(


 
Piter ©   (2004-11-23 23:26) [7]

Kurtevich ©   (23.11.04 20:08) [6]

проект большой? Можешь кинуть исходник на piter007 ~ newmail.ru и четко по пунктам объяснить что надо делать, чтобы получить такую-то проблему.
Вполне вероятно отвечу здесь.


 
ЮЮ ©   (2004-11-24 02:57) [8]

>Что касается EnableWindow() - не знаю, может она где-то и вызывается... в глубинах VCL...

попробуй создавать модальнык формы с параметрои nil, дабы не извещать owner-а при уничтожении

З.Ы. переменные-указатели на экземпляры модальных форм догичнее поместить как локальные пересенные этих методов. Нет никакого смысла в глобальности этих переменных.


 
ASoft   (2004-11-24 04:59) [9]

Попробовал только что насоздавать кучу модальных форм, в т.ч.одна из которых, создана в дизайне. Модальность сохраняется везде нормально. Метод создания: (пример)
Application.CreateForm(TForm2, form2);
Form2.ShowModal;
form2.Free;
Но это при том, что в модальных формах ничего не происходит. Попробуй проверить STEP"ом все что происходит в модальной форме после ShowModal, возможно, (у меня бывало) при какой-то, неопределяемой ошибке, выполняется Finally (Form2.Free), но модальная форма остается видимой, только ее модальность теряется.


 
Kurtevich ©   (2004-11-25 21:37) [10]

:((( Ниче не помагает, я в шоке.
переменные-указатели на экземпляры модальных форм догичнее поместить как локальные пересенные этих методов. Нет никакого смысла в глобальности этих переменных.
Насчет этого согласен, из-за этих глобальных переменных бывают проблемы, но так оно уже повелось... Впадлу переделывать... И ксати в данном случае локальность тоже не помагает...
Вот кусочек функции, в которой трабла, потому что когда я ее комментирую все пучком... Я поубирал неинтересные места где работа только с таблицами. Вдруг найдете здесь чего-нить?


procedure TFAddSearch.Seek();
var vsStorageAnalogsOldIndName: string;
   vsIndex: string;
   vsANALOG_ID: string;
   vbPosFound: boolean;
begin
FWait := TFWait.Create(self);
FWait.MessageLabel.Caption := "Ïîäîæäèòå, ïîæàëóéñòà! Èäåò ïîèñê ïîçèöèé â áàçå äàííûõ ...";

FWait.Show();
FWait.Update();

vsStorageAnalogsOldIndName := FRDM.StorageAnalogsTable.IndexName;

FRDM.StoragePresenceTable.DisableControls();
FRDM.StoragePresenceTable.AutocalcFields := false;

// FRDM.ARAnalogTable.LiteSave();

try
тут неинтересно
 if (FRDM.StoragePresenceTable_NRM_NAME.AsString = vs_NRM_NAME) then
  begin
   StorAnalogStatusPanel.Color       := clLime;
   StorAnalogStatusShape.Brush.Color := clLime;
   StorAnalogStatusLabel.Font.Color  := clWindowText;
   StorAnalogStatusLabel.Caption     := "Íàéäåíî..."
  end
 else
тут тоже неинтересно
          if FRDM.StoragePresenceTable.GotoKey() then
           begin
            StorAnalogStatusPanel.Color       := clYellow;
            StorAnalogStatusShape.Brush.Color := clYellow;
            StorAnalogStatusLabel.Font.Color  := clBlack;
            StorAnalogStatusLabel.Caption     := "Íàéäåíî ÷åðåç àíàëîã...";
           end;

          break;
         end;

        FRDM.StorageAnalogsTable.Next();
       end;
    end
   else
    begin
     StorAnalogStatusPanel.Color       := clRed;
     StorAnalogStatusShape.Brush.Color := clRed;
     StorAnalogStatusLabel.Font.Color  := clYellow;
     StorAnalogStatusLabel.Caption     := "Ïîçèöèÿ íå íàéäåíà!.."
    end;
  end;

finally
и здесь неинтересно
 FWait.Hide();
 FWait.Free();
end;
end;


Хотя вобще надо начинать комментировать по частям и запускать... Я как-то таким методом засек одну неуловимую ошибку, которая не провлялаяь в дебаге, а состояла в вызове TIniFile.ReadString, когда в качестве значения по умолчанию передавалась строка, начинающаяся с пробела, то все вылетало! :)) Именно из-за пробела. Я был в шоке.


 
Kurtevich ©   (2004-11-25 22:02) [11]

А, все, извините - нашел!
Дело в этой самой FWait, а точнее в ее Show(). Если без этого, то все как надо. :)) Собственно здесь это был единственный реальный вариант...
Всем спасибо за участие. :))



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

Текущий архив: 2004.12.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.044 c
1-1101889207
pomashok
2004-12-01 11:20
2004.12.12
mouse_event


1-1101900521
genies
2004-12-01 14:28
2004.12.12
SOS, Help.


1-1101650361
Bobby Digital
2004-11-28 16:59
2004.12.12
Listbox pt.3


14-1101200631
Nikolay M.
2004-11-23 12:03
2004.12.12
Excel повисает при открытии внешних данных :(


14-1100783094
Digitman
2004-11-18 16:04
2004.12.12
Не едут лыжи к вечеру .. не вижу очевидного .. ткните носом ?