|
|
|
Как удалить все формы из DLL?
|
|||
|---|---|---|---|
|
#18+
Мне нужно удалить все формы из DLL. Если просто делаю: for (int i = 0; i < Application->ComponentCount; i++) { if (dynamic_cast<TForm *>(Application->Components ) != NULL) delete Application->Components; } Удаляется только за 1 раз 1 форма. Значит, что-то не так. Такое ощущение, что для каждой формы свой Application. Библиотеки загружаются не динамично, а статично. Поэтому никакойзагрузки/выгрузки ручной нет. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2004, 23:58 |
|
||
|
Как удалить все формы из DLL?
|
|||
|---|---|---|---|
|
#18+
На билдере не пишу, но сразу видно iCount =Application->ComponentCount for (int i = 0; i < iCount; i++) ... Ибо, если, к примеру, 2 формы в модуле, то после первого удаления Application->ComponentCount будет 1. и Application->ComponentCount<1 даст false; второе, что кидается в глаза: переменная цикла никак не используется в цикле(по идее, идёт перечисление компонент, тогда проверка каждой компонетны должна быть по индексу (правда, индекс должен быть обратный) но это тут нет). Ну да это фигня, такое бывает. А вот что такое Application->Components? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2004, 10:14 |
|
||
|
Как удалить все формы из DLL?
|
|||
|---|---|---|---|
|
#18+
авторудалить все формы из DLL Application->Components Что-то я не понял как в DLL появился обьект Application? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2004, 10:47 |
|
||
|
Как удалить все формы из DLL?
|
|||
|---|---|---|---|
|
#18+
сей достойный объект можно передать... и даже нужно это делать... правда автор об этом не обмолвился но Я ОЧЕНЬ НАДЕЮСЬ ЧТО ОН ЭТО СДЕЛАЛ... И абсолютно верно подметил уважаемый CEMb ... Не верный цикл... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2004, 09:35 |
|
||
|
Как удалить все формы из DLL?
|
|||
|---|---|---|---|
|
#18+
да и последнее.... довольно кривой метод удаления... я бы всеж воспользовался более стандартно... вызовом деструктора... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2004, 09:35 |
|
||
|
Как удалить все формы из DLL?
|
|||
|---|---|---|---|
|
#18+
и самое последнее... у вас скорее всего возникнут проблемы с памятью... особенно если создана форма в приложении а убиваете в dll или наоборот... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2004, 09:36 |
|
||
|
Как удалить все формы из DLL?
|
|||
|---|---|---|---|
|
#18+
to Клювик Действительно написано все очень криво. Во первых, как было уже сказано цикл должен быть обратный (i--). Во вторых, для сравнения с NULL вовсе не обязательно делать dynamic_cast поскольку это всего лишь указатель и сравнивать с NULL можно и без преобразования. Кстати после delete нужно присваивать ему NULL. Потому что если этого не сделать, то повторная проверка "!= NULL" с таким указателем пройдет положительно. В третьих, не понятно что ты хочешь сделать. Если ты хочешь удалить те формы, которые создавались в DLL, то в Application->Components они не содержаться(если их самому туда не "запихнуть"). Если хочешь из DLL удалить формы приложения, то это как минимум странный подход, и, как сказал StarWind, возникнут проблемы с памятью. to StarWind StarWindсей достойный объект можно передать... и даже нужно это делать... Что-то я не понял зачем он там нужен? Объясни пожалуйста. Я всегда прекрасно обходился без него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2004, 09:55 |
|
||
|
Как удалить все формы из DLL?
|
|||
|---|---|---|---|
|
#18+
CauchyЕсли ты хочешь удалить те формы, которые создавались в DLL, то в Application->Components они не содержаться(если их самому туда не "запихнуть"). Хорошо, а где они содержатся? Код получился кривым в частности потому, что скрипт, обрабатывающий сообщение, i в квадратных скобках принял за тэг, после которого нужно писать все италиком. На самом деле там конечно есть все это. У меня все получилось следующим образом: TApplication * App = NULL; //--------------------------------------------------------------------------- #pragma package(smart_init) void ShowFrm(char * conn, TApplication * a, int user) { if (!App) { App = Application; Application = a; } // frm_Det = new Tfrm_Det(Application); if (!dm_Acc) dm_Acc = new Tdm_Acc(Application); Acc_frm = new TAcc_frm(Application); Acc_frm->Show(); } int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { if((reason == DLL_PROCESS_DETACH) && (App)) Application = App; return 1; } //--------------------------------------------------------------------------- void CloseAll() { TAcc_frm * tmp; int n = Application->ComponentCount; for (int y = 0; y < n; y++) { string s = Application->Components[y]->Name.c_str(); if (tmp = dynamic_cast<TAcc_frm *>(Application->Components[y]) ) {delete tmp; // tmp->Close(); y--;n--;} } if (dm_Acc) { if (dm_Acc->conn_Acc->Connected) dm_Acc->conn_Acc->Close(); } } Как верно заметил предыдущий оратор, утечка памяти есть. Откуда тогда их удалять??? Пришлось заменить i на y, а то бред получался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2004, 01:09 |
|
||
|
Как удалить все формы из DLL?
|
|||
|---|---|---|---|
|
#18+
КлювикКод получился кривым в частности потому, что скрипт, обрабатывающий сообщение, i в квадратных скобках принял за тэг, после которого нужно писать все италиком. Вообще-то кроме кнопочки QUOTE на странице для нового сообщения есть еще и кнопка SRC как раз именно для кода. Тогда получится все как надо. Клювикint n = Application->ComponentCount; for (int y = 0; y < n; y++) { ........ y--;n--;} Было уже два раза сказано, что цикл ДОЛЖЕН быть обратный: Код: plaintext 1. 2. 3. 4. 5. Тогда извраты с "y--;n--;" будут не нужны. КлювикХорошо, а где они содержатся? Можно создать свой массив указателей и удалить их в цикле, можно их просто по очереди перечислить и удалить. А вот насчет Application в DLL я надеюсь StarWind нам разъяснит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2004, 09:40 |
|
||
|
Как удалить все формы из DLL?
|
|||
|---|---|---|---|
|
#18+
Теперь буду знать, как коды представлять, сэнькс. Насчет обратного цикла, да, можно и так, но по сути, без разницы, как именно делать. Потому что загвоздка не в этом, а в том, как удалить формы. Если я удаляю их так, как написано в моем коде, то Application содержит уйму форм из главного екзешника, но здесь они все NULL, а также формы DLL, которые и благополучно удаляются. Однако очистки памяти по-настоящему нет. Кстати, посоветуйте, как лучше (с помощью чего) следить за расходованием памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2004, 14:44 |
|
||
|
Как удалить все формы из DLL?
|
|||
|---|---|---|---|
|
#18+
Есть одна полезная програмка MemProof Работает с Дельфи и Билдером. Часто (но не всегда :( ) показывает то место в коде, где была выделена память. Я в DLL формы создавал и удалял так: Код: plaintext 1. 2. 3. 4. 5. 6. А у тебя создается Код: plaintext Т. е. владельцем формы является Application и удалять из DLL проблематично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2004, 16:13 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=458&tid=2035407]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 374ms |

| 0 / 0 |
