![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потеря модальности [D7, WinXP]
Kurtevich © (2004-11-19 21:23:00)Открываю окно вызовом ShowModal(), в этом окне в свою очередь есть кнопки, которые открывают другие окна, тоже ShowModal(). При этом когда такое окно закрывается, то первое окно уже не модально - то есть можно спокойно переходить в другие окна приложения. Самое интересное, что это действует не со всеми - одно окно после открытия-закрытия оставляет модальность первого, в то время как два других - нет. С чем это может быть связано?
Kurtevich (2004-11-25 22:02:00) [1]А, все, извините - нашел!
Дело в этой самой FWait, а точнее в ее Show(). Если без этого, то все как надо. :)) Собственно здесь это был единственный реальный вариант...
Всем спасибо за участие. :))
Kurtevich (2004-11-25 21:37:00) [2]:((( Ниче не помагает, я в шоке.
переменные-указатели на экземпляры модальных форм догичнее поместить как локальные пересенные этих методов. Нет никакого смысла в глобальности этих переменных.
Насчет этого согласен, из-за этих глобальных переменных бывают проблемы, но так оно уже повелось... Впадлу переделывать... И ксати в данном случае локальность тоже не помагает...
Вот кусочек функции, в которой трабла, потому что когда я ее комментирую все пучком... Я поубирал неинтересные места где работа только с таблицами. Вдруг найдете здесь чего-нить?
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, когда в качестве значения по умолчанию передавалась строка, начинающаяся с пробела, то все вылетало! :)) Именно из-за пробела. Я был в шоке.
ASoft (2004-11-24 04:59:00) [3]Попробовал только что насоздавать кучу модальных форм, в т.ч.одна из которых, создана в дизайне. Модальность сохраняется везде нормально. Метод создания: (пример)
Application.CreateForm(TForm2, form2);
Form2.ShowModal;
form2.Free;
Но это при том, что в модальных формах ничего не происходит. Попробуй проверить STEP'ом все что происходит в модальной форме после ShowModal, возможно, (у меня бывало) при какой-то, неопределяемой ошибке, выполняется Finally (Form2.Free), но модальная форма остается видимой, только ее модальность теряется.
ЮЮ (2004-11-24 02:57:00) [4]>Что касается EnableWindow() - не знаю, может она где-то и вызывается... в глубинах VCL...
попробуй создавать модальнык формы с параметрои nil, дабы не извещать owner-а при уничтожении
З.Ы. переменные-указатели на экземпляры модальных форм догичнее поместить как локальные пересенные этих методов. Нет никакого смысла в глобальности этих переменных.
Piter (2004-11-23 23:26:00) [5]Kurtevich © (23.11.04 20:08) [6]
проект большой? Можешь кинуть исходник на piter007 ~ newmail.ru и четко по пунктам объяснить что надо делать, чтобы получить такую-то проблему.
Вполне вероятно отвечу здесь.
Kurtevich (2004-11-23 20:08:00) [6]Не-а... Та же фигня... :(
cae (2004-11-23 16:15:00) [7]Попробуй создавать окна так :
FEPriceDet := TFEPriceDet.Create(Application);
Kurtevich (2004-11-23 15:58:00) [8]Ну эт... так че... никаких идей? :(
Kurtevich (2004-11-22 20:18:00) [9]Что касается 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;
Такое... Если понадобятся коды классов этих форм - в следующий раз возможно... Но надеюсь уже здесь вы найдете массу ошибок... Очень надеюсь.
ламер (2004-11-21 15:28:00) [10]наверняка, где-то выполняется EnableWindow().
KilkennyCat (2004-11-20 15:59:00) [11]с ошибкой...
код в студию