Форум: "Начинающим";
Текущий архив: 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