Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх









Память: 0.61 MB
Время: 0.061 c
4-1098938185
carmen
2004-10-28 08:36
2004.12.12
Как изменить значение TEdit в чужой программе и нажать кнопку в


1-1101468469
sten
2004-11-26 14:27
2004.12.12
вставка картинок в текст


3-1100425443
Алексей Петухов
2004-11-14 12:44
2004.12.12
DBase и русский язык


3-1099469147
Sergy Ivanec
2004-11-03 11:05
2004.12.12
Interbase, проблема с большим числом записей


1-1101428089
Rand
2004-11-26 03:14
2004.12.12
DrawGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский