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

Вниз

Странно работает TOpenDialog ..   Найти похожие ветки 

 
Drowsy   (2009-09-29 04:28) [0]

Есть несколько форм MainF, F1, F2.
На F2 помещён OpenDialog.
Из MainF вызывается F1.ShowModal;
Из F1 вызывается F2.ShowModal;
После выполнения OpenDialog.Execute c экрана исчезают все окна, кроме
F2. После закытия F2 появляется F1, после закрытия F1 появляется MainF.
Почему такое?


 
Германн ©   (2009-09-29 04:57) [1]


> Почему такое?
>

А х.з.
У меня нет "MainF, F1, F2"
У меня не "на F2 помещён OpenDialog".
У меня...
Да что там ещё говорить?
У меня вообще ничего нет из того, что приведено в сабже!
Но одно знаю точно. У тебя ошибка в программе.


 
Юрий Зотов ©   (2009-09-29 06:11) [2]

> Drowsy   (29.09.09 04:28)  

Сильно удивился и проверил. Все сделал точно как Вы описали. Ничего никуда не исчезает. D7, XP.

Вывод напрашивается - где-то что-то перемудрено.


 
Drowsy   (2009-09-29 06:16) [3]

Конечно ошибка.
На формах наворочено много компонентов типа TPanel, TPaintBox, TSpeedButton....
Некоторые создаются динамически.
Пробовал размещать Dialog на разные формы, но при вызове из формы F2,
результат тот же - все формы, кроме F2, исчезают с экрана.
Все коды здесь привести просто невозможно.
В каком направлении хоть искать еррор, может есть какие - то предположения?


 
Drowsy   (2009-09-29 06:18) [4]


> Сильно удивился и проверил. Все сделал точно как Вы описали.
>  Ничего никуда не исчезает. D7, XP.

Я тоже пробовал с "пустыми" формами - всё нормально и красиво...


 
Drowsy   (2009-09-29 06:25) [5]

На F2 висит пэйнтбокс, графика на который выводится функциями из библиотеки DLL. Может это быть причиной?


 
Юрий Зотов ©   (2009-09-29 06:33) [6]

> Drowsy   (29.09.09 06:16) [3]

Воспроизвел Вашу ситуацию искусственно:


procedure TMainF.FormDblClick(Sender: TObject);
begin
 F1 := TF1.Create(nil);
 try
   F1.ShowModal
 finally
   F1.Free
 end
end;

procedure TF1.FormDblClick(Sender: TObject);
begin
 F2 := TF2.Create(nil);
 try
   F2.ShowModal
 finally
   F2.Free
 end
end;

procedure TF2.FormDblClick(Sender: TObject);
begin
 OpenDialog.Execute
end;

procedure TF2.OpenDialogShow(Sender: TObject);
begin
 F1.Hide;
 MainF.Hide
end;

procedure TF2.OpenDialogClose(Sender: TObject);
begin
 MainF.Show;
 F1.Show
end;


Выводы:

1. Формы TF1 и TF2 - убрать из AutoCreate.
2. Глобальные переменные F1 и F2 - удалить.
3. Проверить код всех обработчиков событий OnShow и OnClose, включая события диалога.


 
Drowsy   (2009-09-29 06:42) [7]


> 1. Формы TF1 и TF2 - убрать из AutoCreate.
> 2. Глобальные переменные F1 и F2 - удалить.


Это  уже делал.


> 3. Проверить код всех обработчиков событий OnShow и OnClose,
>  включая события диалога.

Сейчас буду пробовать.

Есть в этом проекте ещё одна странность, которая, видимо, может быть по-причинам связана с этой : при вызове форм на панели задач выскакивают ярлычки с тайтлами форм.


 
Drowsy   (2009-09-29 06:49) [8]

Некоторые функции из Dll получают параметрами хэндлы пэйнтбоксов из форм моей проги - может тут причина??


 
Юрий Зотов ©   (2009-09-29 06:52) [9]

> Drowsy   (29.09.09 06:42) [7]

Окнам форм cтавится стиль WS_EX_TOOLWINDOW? Зачем?


 
Юрий Зотов ©   (2009-09-29 06:54) [10]

> Drowsy   (29.09.09 06:49) [8]

> Некоторые функции из Dll

Оба-на! Какая-такая DLL? О самом главном - молчим?


 
Drowsy   (2009-09-29 06:57) [11]

Я стили не менял и, честно говоря, не знал про WS_EX_TOOLWINDOW.....
Просто New Form из меню вызывал.
Сейчас посмотрю, спасибо!


 
Drowsy   (2009-09-29 06:59) [12]

Dll самопальная. Из кодов С++ её "странслировал"


 
Юрий Зотов ©   (2009-09-29 07:04) [13]

> Drowsy   (29.09.09 06:59) [12]

Похоже, дело в DLL. Формы F1 и F2 не в ней ли живут?


 
Drowsy   (2009-09-29 07:17) [14]

Сами формы нет, но хендлы имаджей и пейнт боксов Dll получает параметром дя отрисовки - типа такого:

procedure DrawFigure(TPB : HDC ; Figure : TFigures;
                               x : real;y : real ;const angle : integer =0);
stdcall; external "C_GRAPH_DDL.dll" name
"@DrawFigure$qqspvr8Entitiesddi";

вызываю
DrawEntity(PntBox.Canvas.Handle, Dryers , 0, 0, 0);
DrawEntity(Imag.Canvas.Handle, Dryers , 0, 0, 0);


 
Юрий Зотов ©   (2009-09-29 07:17) [15]

> WS_EX_TOOLWINDOW

WS_EX_APPWINDOW, конечно.


 
Юрий Зотов ©   (2009-09-29 07:20) [16]

stdcall - зачем?


 
Юрий Зотов ©   (2009-09-29 07:22) [17]

TFigures - что это?


 
Drowsy   (2009-09-29 07:50) [18]


> stdcall - зачем?


stdcall в библиотеке указан, я его и здесь воткнул, иначе не работает.


> TFigures - что это?


TFigure - это "аналог" класса библиотеки.

 TFigire = class
 public
   function ReadFigureparams (S : String ): integer; virtual; stdcall; abstract;
 end;

 Figure : TFigure;


 
Юрий Зотов ©   (2009-09-29 08:09) [19]

1. Dll все равно чисто дельфишная, поэтому stdcall можно убрать (и в Exe, и в DLL). Хотя можно и не убирать - главное, чтобы и в Exe, и в DLL было одинаково.

2. Я спрашивал про TFigures, а не TFigure.

3. Параметр метода - строка, надо использовать ShareMem.

4. И самое главное: попробуйте сбилдить (не скомпилировать, а именно сбилдить) и Exe, и Dll с run-time пакетами.


 
Drowsy   (2009-09-29 08:34) [20]


> 2. Я спрашивал про TFigures, а не TFigure.


Это у меня очепятка  класс один - TFigure

> 4. И самое главное: попробуйте сбилдить (не скомпилировать,
>  а именно сбилдить) и Exe, и Dll с run-time пакетами.


У меня Project Options -> runtime packages -> Build with runtime packages опция установлена и в проге и в библиотеке.
Перебилдил всё ещё раз - проблема осталась.


 
Drowsy   (2009-09-29 08:43) [21]

Тут ещё одна странность : прога на дельфи, а иконки всех окон, мало того, что все вываливаются на панель задач, так они ещё и СИШНЫЕ.


 
Drowsy   (2009-09-29 08:44) [22]

.... даже главного окна, которое ещё к библиотеке не обращается.


 
Сергей М. ©   (2009-09-29 09:00) [23]


> даже главного окна, которое ещё к библиотеке не обращается

Обращение к библиотеке, точнее ее загрузка и инициализация, у тебя происходит еще до того как рождается самое первое окно.


 
Drowsy   (2009-09-29 10:33) [24]

Получается так, что если форма использует библиотеку, то её вызов (Show или ShowModal) как - будто запускает ещё одну программу (процесс)...


 
Сергей М. ©   (2009-09-29 10:36) [25]


> как - будто запускает ещё одну программу (процесс)


Что значит "как будто" ?
Либо запускает либо не запускает - третьего не дано)


 
Drowsy   (2009-09-29 10:48) [26]


> третьего не дано

Не дано - запускает (в Диспетчере задач формы как приложения появляются).
А как это исключить?


 
Сергей М. ©   (2009-09-29 11:04) [27]


> в Диспетчере задач формы как приложения появляются


И что ?
Это же вовсе не говорит о "запуске еще одной программы (процесса)" ..


 
Drowsy   (2009-09-29 11:07) [28]

А о чём это говорит?
Может совет какой дадите?!


 
Drowsy   (2009-09-29 11:58) [29]

Библиотека написана на С++ Builder.
Используется в Дельфи.
Всё, что от неё требуется, это получить строку с названием нестандартного графического файла и Handle канваса.
Она внутри себя расшифровывает файл, и на полученном канвасе отрисовывает.
Почему она при этом корёжит основную прогу (выбрасывает на панель задач иконку формы и OpenDialog после закрытия стирает  активные, видимые формы, кроме вызвавшей этот OpenDialog) ?


 
Юрий Зотов ©   (2009-09-29 12:06) [30]

> Drowsy   (29.09.09 11:58) [29]

Возможно, дело не в DLL. Попробуйте в программе закомментировать все обращения к DLL - проблемы останутся, или исчезнут?


 
Drowsy   (2009-09-29 12:20) [31]

В Dll, к сожалению.
Если исключить из проекта формы, которые обращаются к Dll, то всё в порядке.
А если, например, 5 форм, вызываемых последовательно F1->F2.ShowModal->F3.ShowModal->F4.ShowModal->F5.ShowModal, где 4-ре первые - "чистые", а 5-ая использует Dll, то начинаются эти проблемы (все иконки си-шные и на панели задач и OpenDialog ...).
Пробовал их и динамически создавать -тоже самое.

Я бы, нафиг, отказался от OpenDialog ("листы" бы задействовал), но хоть бы от иконок избавиться....


 
Drowsy   (2009-09-29 12:39) [32]

Может в DLL какие-то опции компиляции нужны особые?


 
Юрий Зотов ©   (2009-09-29 13:16) [33]

Нужен код DLL и формы, которая к ней обращается.


 
Drowsy   (2009-09-29 13:31) [34]

Код DLL - больше десятка юнитов и ещё больше заголовков.
Может по почте?


 
Ухарь   (2009-09-30 09:39) [35]

помнится, раньше было принято в DLL передавать Application и Screen, и там их присваивать в соответствующие глоб. переменные.


 
Сергей М. ©   (2009-09-30 11:37) [36]


> Ухарь   (30.09.09 09:39) [35]


Раньше было принято внимательно читать порсты автора:


> Project Options -> runtime packages -> Build with runtime
> packages опция установлена и в проге и в библиотеке


 
Drowsy   (2009-10-05 13:01) [37]

Ещё фенька : если ошибка возникает вне библиотеки, то если её не обработать в программе, то выбрасывается сообщение об ошибке, в титле которого название библиотеки "C_Graph_DLL" !


 
Drowsy   (2009-10-05 13:48) [38]

... + Watch List во время пошагового выполнения не редактируется.



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

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

Наверх




Память: 0.56 MB
Время: 0.017 c
2-1254990514
Маркабес
2009-10-08 12:28
2009.11.22
where fld <> --- Что это ?


15-1250101749
alvonen
2009-08-12 22:29
2009.11.22
Кодовые страницы символов и Юникод


15-1253437411
ford
2009-09-20 13:03
2009.11.22
регистрация домена


15-1254210806
Лёша
2009-09-29 11:53
2009.11.22
О компресии данных


1-1225292591
Циркуль
2008-10-29 18:03
2009.11.22
Не печатаются изображения на принтере