созданеи формы

  • Автор темы Elvis
  • Дата начала
Статус
Закрыто для дальнейших ответов.
E

Elvis

Пожскажите плиз в чём разница между этимим двумя примерами

Код:
function ShowForm : Integer; stdcall;
var
   Form : TDLLForm;
begin
   Form := TDLLForm.Create(Application);
   Result := Form.ShowModal;
   Form.Free;
end;

и
Код:
Application.CreateForm(TDLLForm,DLLForm);
DLLForm.ShowModal;

и нафига нужен этот Form.Free
 
B

Barmutik

В указанном Вами примере разницы ни в чём...

А вот Form.Release нужен очень даже .. для того что бы после работы с формой отдестроить её... Вообще понятие освобождения объекта после работы с ним Вам знакомо ?

И как указано в хелпе вызывать надо Release, а не Free...
 
E

Elvis

<!--QuoteBegin-Barmutik+8:09:2005, 14:12 -->
<span class="vbquote">(Barmutik @ 8:09:2005, 14:12 )</span><!--QuoteEBegin-->Вообще понятие освобождения объекта после работы с ним Вам знакомо ?
[snapback]24610" rel="nofollow" target="_blank[/snapback]​
[/quote]

Ещё как знакомо просто я не правильено поставил вопрос. Ситуация какая я создаю формы вторым методом в одной процедуре и все освобождаю в другой
Код:
procedure MailRegCC.CreateAllForms();
begin
formSetupDB := TformSetupDB.Create(Application);
DM := TDM.Create(Application);
RegIncommingForm := TRegIncommingForm.Create(Application);
ManualRegForm := TManualRegForm.Create(Application);
ChoseEmployeeForm := TChoseEmployeeForm.Create(Application);
ParserForm := TParserForm.Create(Application);
LogicForm := TLogicForm.Create(Application);
SearchForm := TSearchForm.Create(Application);
ResultsIncomming := TResultsIncomming.Create(Application);
OutGoingResultsForm := TOutGoingResultsForm.Create(Application);
AllResultsForm := TAllResultsForm.Create(Application);
EditRecordForm := TEditRecordForm.Create(Application);
MessageBody := TMessageBody.Create(Application);
end;

Но все эти переменные обьявленны в юнитах самих этих форм. Это что-то может напартачить? Вся эта радость зашита в СОМ ДЛЛ и при вызове процедуры создания форм ДЛЛ матерится на то что
Violation Access at address at ... in module "Project1.dll". Ошибка выскакивает 5 раз подряд и в ней указывается один и тот же адрес. Мне подсказали что я в неправильной последовательности создаю формы, но я вроде проверил всё с последовательностью нормально.
 
B

Barmutik

Если у Вас формы не зависят одна от другой то порядок их создания по большом счёту не должен никоим образом влиять на функциональность программы.

Пара вопросов:

1. Зачем создавать все формы сразу?
2. Не совсем понятно насчёт создания формы в ДЛЛ и причём тут КОМ ?
 
E

Elvis

<!--QuoteBegin-Barmutik+9:09:2005, 08:14 -->
<span class="vbquote">(Barmutik @ 9:09:2005, 08:14 )</span><!--QuoteEBegin-->Если у Вас формы не зависят одна от другой то порядок их создания по большом счёту не должен никоим образом влиять на функциональность программы.

Пара вопросов:

1. Зачем создавать все формы сразу?
2. Не совсем понятно насчёт создания формы в ДЛЛ и причём тут КОМ ?
[snapback]24637" rel="nofollow" target="_blank[/snapback]​
[/quote]
1. Зависимость в большинстве определяется через функции (чтение параметров с форм на другой форме, вызов функций юнита и тд). Создавать их все сразу хотелось бы потомучто не хочется теперь редактировать весь код проекта и определять где её создавать и где очищать. В начале создал всё а в конце освободил.

2. так как вызывающее приложение на С шарпе ДЛЛ у меня зарегистрированна в системе как СОМ ОБЬЕКТ для большего удобства в интеграции
 
E

Elvis

Фишка в том что если я создаю формы первым методом то всё работает нормально и только при закрытии вызывающего приложения он остаётся в процессах и не закрывается (Оутлук у меня адд ин для ОЛ вызываеи функции ДЛЛ выдаёт ошибку при закрытии и предлагает отправить баг репорт) в этом случае ошибку вызывает вызывающее приложение а не длл а при втором способе создания форм длл матерится уже при создании но приложение выгружается из процессов.
 
E

Elvis

прогнал ошибку ясно что вызывает дл-ина
 
B

Barmutik

Может соглашения о передаче параметров неверно стоит у Вас ?

У меня проблем с вызовом не возникало ...

А ансчёт создавать всё сразу .. плохой подход .. память ведь она не резиновая ...
 
?

????

<!--QuoteBegin-Elvis+9:09:2005, 10:04 -->
<span class="vbquote">(Elvis @ 9:09:2005, 10:04 )</span><!--QuoteEBegin-->1. Зависимость в большинстве определяется через функции (чтение параметров с форм на другой форме, вызов функций юнита и тд). Создавать их все сразу хотелось бы потомучто не хочется теперь редактировать весь код проекта и определять где её создавать и где очищать. В начале создал всё а в конце освободил.
[snapback]24640" rel="nofollow" target="_blank[/snapback]​
[/quote]
Если в конструкторе или OnCreate формы вызывается метод ещё не созданной формы - AV. Аналогичная ситуация при закрытии. В любом случае надо проследить зависимости. А лучше переписать нормально. Или на худой конец с использованием Singleton и создавать формы перед каждым обращением к методу или свойству формы.
 
E

Elvis

Когда всё запускаю в ехе (те же самые формы только компилю не в длл а в ехе) то всё работает нормально
 
B

Barmutik

Разбирайтесь по шагам .. создавайте одну форму .. логируйте действия ..

Так а в чём проблема под дебагом ДЛЛ запустить посмотреть на чём слетает ?
 
P

Poseidon

<!--QuoteBegin-Elvis+9:09:2005, 08:50 -->
<span class="vbquote">(Elvis @ 9:09:2005, 08:50 )</span><!--QuoteEBegin-->Это что-то может напартачить? Вся эта радость зашита в СОМ ДЛЛ
[snapback]24636" rel="nofollow" target="_blank[/snapback]​
[/quote] А мне вот интересно, откуда у вас в ДЛЛ взялся Application? Вы что, подключили модуль Forms к ДЛЛ? В таком случая я никак, кроме как "бред" вашу программу назвать не могу. Как она вообще работает? Из всего вышеизложенного у меня появилось огромное желание посоветовать вам переписать весь код. Поверьте, это займет гораздо менше времени, чем отлов ошибок.
 
B

Barmutik

Хммм.. а в чём проблема то собственно с созданием форм внутри ДЛЛ ?

Это нормальная и общепринятая практика.. если это бред по Вашему мнению, то тогда посоветуйте как иметь возможность показать форму из библиотеки ?

P.S. Для: Poseidon Про договор на ты я помню .. но в общественном обсуждении как-то не могу :D
 
P

Poseidon

Бред - это не создание формы в ДЛЛ. Бред - это то, как это реализованно (судя по обрывкам исходника).

Значит для начала обьясню вот что: <!--QuoteBegin-Elvis+8:09:2005, 13:01 -->
<span class="vbquote">(Elvis @ 8:09:2005, 13:01 )</span><!--QuoteEBegin-->Пожскажите плиз в чём разница между этимим двумя примерами
[snapback]24609" rel="nofollow" target="_blank[/snapback]​
[/quote]
По сути, Application.CreateForm делает следующее:
>
XXX:= TXXX.Create(Application);
if <главная форма не существует> then <XXX становится главной формой>.
>
В реале действие одинаковое, если главная форма в наличии.


Теперь о реализации:
Лично мне не понятно, зачем создавать все формы стразу? Ведь может получится так, что какие-то формы вообще не будут показаны за сеанс работы с программой. И не следует забывать, что вместе с формой, создаются и контроллы на ней. ИМХО нужно создавать форму при необходимости, а вот освобождать ее следует при завершении работы программмы (почему? читай ниже). И отговорка "не хочется теперь редактировать весь код проекта " звучит не убедительно.

Далее: Учитывая, что используется XXX:= TXXX.Create(Application), какая форма в вашем приложении считается главной? Или в вашем приложении нет главной формы :D ?

И еще: Главное, что нужно помнить при разработке DLL - вы не должны допускать ситуацию, при которой любое исключение осталось бы неперехваченным. В теле экспортируемых функций "заверните" все в блоки try..except.

И напоследок: Любые ресурсы, которые вы явно создаете при открытии DLL, должны освобождаться в обработчике FormClose. Мне кажется, что при вызове DLL (и использовании ее для распределения ресурсов) они не полностью освобождается до тех пор, пока вызывающее приложение не будет закрыто, а при вторичном вызове DLL не перегружается (это мои наблюдения, но, похоже, они верны). По всей видимости, ресурсы, освобожденные в первый раз, во время второго вызова не пересоздаются. У меня была масса проблем до тех пор, пока в коде я не определил "нужное место" для освобождения ресурсов. Но после того, как я переместил освобождение ресурсов в обработчик события FormClose, ошибки исчезли.
Кроме того,как уже было замечано, для освобождения ресурсов вы должны вместо метода Close или Free использовать метод Release.

Исходя из вышесказанного следует, что лучше переписать код сейчас, чем потом ловить ошибки и исправляя их потратить кучу времени и сил и в итоге переписать проект.


<!--QuoteBegin-Barmutik+13:09:2005, 09:20 -->
<span class="vbquote">(Barmutik @ 13:09:2005, 09:20 )</span><!--QuoteEBegin-->Poseidon Про договор на ты я помню .. но в общественном обсуждении как-то не могу
[snapback]24745" rel="nofollow" target="_blank[/snapback]​
[/quote]Да ладно тебе. Ведь не на приеме у президента... :D
 
E

Elvis

Разобрался уже.
На счёт бреда не знаю я в Делфи не рвач.
И код левый понимаю не я писал мне ЕХЕ дали (проект) сказали сделать СОМ я же не буду втыкать в тот сранный код и искать где форму создавать и где её освобождать надо. Там есть формы которые вообще не отображаются но компоненты на них используются, так что извените я не мать Тереза чтобы думать об ефективном использовании памяти чужих РС, какой код дали так и переделал.
З.Ы. Кстати СОМ работает и на память уже не матерится.
 
P

Poseidon

<!--QuoteBegin-Elvis+20:09:2005, 16:00 -->
<span class="vbquote">(Elvis @ 20:09:2005, 16:00 )</span><!--QuoteEBegin-->есть формы которые вообще не отображаются но компоненты на них используются
[snapback]24988" rel="nofollow" target="_blank[/snapback]​
[/quote]А не проще в таком случае компонент создать динамически?
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!