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

Вниз

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

Наверх





Память: 0.53 MB
Время: 0.007 c
9-1183546787
Жидкое стекло
2007-07-04 14:59
2009.11.22
Эффект горячего воздуха


1-1225376991
harisma
2008-10-30 17:29
2009.11.22
Цепочка наследований и регистрация классов


11-1204721952
Сашик
2008-03-05 15:59
2009.11.22
Активный Control


3-1229512363
Оптимайзер
2008-12-17 14:12
2009.11.22
Оптимизация запроса к DB2


15-1253623487
Rex
2009-09-22 16:44
2009.11.22
Help me. SQL2000.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский