Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Уйти от Showmodal :) 
V
    Опции темы
Teleport
Дата 22.7.2008, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



Вызвал форму методом ShowModal
Естественно не могу переключиться на главную форму, пока не закрою эту. Возможно ли переключиться на главную форму, не закрывая, вызванную методом ShowModal?

Form1.Show - в моем случае не прокатывает. Так как форму вызываю из dll.


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Rrader
  Дата 23.7.2008, 05:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Попробуй
Код

EnableWindow(Form1.Handle, True);



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Teleport
Дата 23.7.2008, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



вот код библиотеки, из которой я вызываю форму.
Код
library Dop_form1;

uses
  SysUtils,
  Classes, Unit1;

{$R *.res}

begin
 Form1 := TForm1.Create(nil);
  Form1.ShowModal;
 Form1.Free;
end.

либо  Form1.Free; как-то убирать, либо с Form1.ShowModal что-то делать  smile 

Это сообщение отредактировал(а) Teleport - 23.7.2008, 11:21


--------------------
user posted image
user posted image 
PM MAIL   Вверх
pseud
Дата 23.7.2008, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



делай 
Form1.Show
а 
 Form1.Free 
пиши в другой процедурепиши, вызываемой из основного приложения

Это сообщение отредактировал(а) pseud - 23.7.2008, 11:27


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Felan
Дата 23.7.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



А еще лучше создавать форму только в том случае, если она еще не создана, а ври ей делать по событию DLL_PROCESS_DETACH.
Тогда показывать ее через Show можно будет хоть до посинения. smile


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
CodeMonkey
Дата 23.7.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89





--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Teleport
Дата 23.7.2008, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



2 pseud - я только  Form1.Free  убираю, так сразу при вызове этой формы из dll ошибки лезут.  smile 
2 Felan - не совсем понял как это сделать-то  smile 
2 CodeMonkey сейчас  гляну, спасибо...


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Teleport
Дата 23.7.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



2 CodeMonkey  на страничках понял только русские символы...
сложновато понять остальное... 


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Felan
Дата 24.7.2008, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Цитата(Teleport @  23.7.2008,  14:15 Найти цитируемый пост)
2 Felan - не совсем понял как это сделать-то  smile 

Посмотри в DRKB.
У каждой длл есть "события", на которые можно повесить определенный функционал.
В частности DLL_PROCESS_DETACH, DLL_PROCESS_ATTACH и еще два, названия не помню. В хелпе все это найти можно без проблема.

Выглядит в простейшем случае примерно так:
Код

library UnitHeader;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  ShareMem,
  SysUtils,
  Classes,
  Dialogs,
  iaGlobalTypes,
  Windows,
  iaUnitHeaderMenu in 'units\iaUnitHeaderMenu.pas';

{$R *.res}

var
  gMenuItem: IiaFelansExpertsPlugin;

procedure CF_DLLProc(Reason: DWORD);
begin
  case Reason of
    DLL_PROCESS_ATTACH: begin
                          gMenuItem := TiaUnitHeaderMenu.Create( MENU_CAPTION );
                          ShowMessage('UnitHeader process attached');
                        end;
    DLL_PROCESS_DETACH: begin
                          FreeAndNil( gMenuItem );
                          ShowMessage('UnitHeader process detached');
                        end;
  end;
end;

function GetPliginInterface(): IiaFelansExpertsPlugin; stdcall;
begin
  Result := gMenuItem;
  ShowMessage('GetPliginInterface - passed in UnitHeader');
end;

exports
  GetPliginInterface name 'GetPliginInterface';

begin
  if @DllProc = nil then
    begin
      DllProc := @CF_DLLProc;
      CF_DLLProc( DLL_PROCESS_ATTACH);
    end;
end.



--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
morpheyushka
Дата 24.7.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


Профиль
Группа: Участник
Сообщений: 563
Регистрация: 26.2.2008
Где: Киев

Репутация: 3
Всего: 8



Цитата(Teleport @  23.7.2008,  12:15 Найти цитируемый пост)
2 pseud - я только  Form1.Free  убираю, так сразу при вызове этой формы из dll ошибки лезут. 

Попробуй на OnClose повесить метод Free:
Код

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;


Ну а вызывай естественно методом Show


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
Teleport
Дата 25.7.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



да, все получилось smile
Выкладываю исходник, в котором все решено. Может кто поиском на форуме найдет smile

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  dll_Form.rar 6,97 Kb


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Teleport
Дата 25.7.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



всем большое спасибо)))))

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  dll_Form.rar 6,97 Kb


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Akella
Дата 25.7.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Код

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  FreeAndNil(Form1);//так лучше
end;

PM MAIL   Вверх
pseud
Дата 25.7.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Akella @  25.7.2008,  16:11 Найти цитируемый пост)
FreeAndNil(Form1);//так лучше


Akella, что-то мне подсказывает что не стоит. 
ведь мы указали уже 
Код

Action := caFree;

дальше объект уж удалиться


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Teleport
Дата 26.7.2008, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



2 Akella - почему лучше?? Подробней можно?  smile 


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Alexeis
Дата 28.7.2008, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  опасно делать так
Код

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  FreeAndNil(Form1);//так лучше
end;

Дальше по уничтожению могут быть обращения к полям. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Teleport
Дата 28.7.2008, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



хм... спасиб, я попробую твой вариант smile


--------------------
user posted image
user posted image 
PM MAIL   Вверх
Akella
Дата 30.7.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



ой, немного ошибся, вот так правильнее:
Код

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Form1 := nil; // освобождаем указатель на форму.
end;


зачем   Form1 := nil;?

Смотри. В процессе работы пользователь открывает и закрывает окно. При закрытии окна оно не уничтожается, а типа прячется. Там может быть куча компонентов визуальных и невизуальных, вследствие чего окно может жрать кучу памяти.
Здесь два пути: 
1. Ничего не делать при закрытии формы, тогда она в следующий раз может открыться быстрее, т.к. всё уже создано, просто спрятано и живёт в памяти.
2. Уничтожить, но окно в следующий раз может открываться медленнее. Но память и указатели будут освобождены.

, есть код

Код

   if not Assigned(Form1) then Form1 := TForm1.create(self);//проверяем, есть ли указатель на форму

так вот, если не прописать Form1 := nil, то Assigned вернёт True;

Добавлено через 6 минут и 46 секунд
Цитата(Alexeis @  28.7.2008,  09:25 Найти цитируемый пост)
Дальше по уничтожению могут быть обращения к полям. 

По каким полям? Нечего тогда обращаться к несозданной форме или нужно проверять, создана форма или нет.
PM MAIL   Вверх
pseud
Дата 30.7.2008, 15:36 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
зачем   Form1 := nil;?


Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
При закрытии окна оно не уничтожается, а типа прячется


но ведь мы указали
Код

Action := caFree;

и никуда оно не спрячется
спрячется оно если 
Код

Action := caHide;


Добавлено через 3 минуты и 19 секунд
Akella, ты ли это?
глянь исходники форм (Forms.pas)
и вывод оттуда, если коротко:
Form1 := nil; - не нужен.

Добавлено через 10 минут и 52 секунды
Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
т.к. всё уже создано, просто спрятано и живёт в памяти

мало того что создано, так еще и инициализировано и имеет следы похождений юзера по ней.
P.S.я бы не рекомендовал использовать глобальные переменные создаваемые средой при создании форм, а-ля Form1: TForm1;




--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Akella
Дата 30.7.2008, 16:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



pseud, ты не понял, если НЕ указывать в OnClose ничего, то окно не уничтожается

Добавлено через 2 минуты и 33 секунды
Цитата(pseud @  30.7.2008,  15:36 Найти цитируемый пост)
Akella, ты ли это?

*пошёл глядеть в зеркало

Добавлено через 2 минуты и 48 секунд
да вроде я smile , а что?

Добавлено через 7 минут и 4 секунды
Цитата(pseud @  30.7.2008,  15:36 Найти цитируемый пост)
Form1 := nil; - не нужен.

уничтож форму с пом caFree, а потом проверь, что вернёт assigned
PM MAIL   Вверх
Teleport
Дата 30.7.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 5.7.2008
Где: Прибалтика

Репутация: 3
Всего: 6



2 Akella , pseudНу вот, узнал кой-чего нового.  smile  Спасибо )))


--------------------
user posted image
user posted image 
PM MAIL   Вверх
pseud
Дата 30.7.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Akella @  30.7.2008,  16:10 Найти цитируемый пост)
уничтож форму с пом caFree, а потом проверь, что вернёт assigned


да уж, картинка.
я действительно не совсем прав. но и ты до конца не прав тож.

объект-форма на самом деле уничтожается, т.е.  фраза...
Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
При закрытии окна оно не уничтожается, а типа прячется. Там может быть куча компонентов визуальных и невизуальных, вследствие чего окно может жрать кучу памяти.

...неверна.
а вот ссылка не подчищается.
и если после уничтожения я пишу:
Код

  if Assigned(Form1) then
    Form1.Show;

получаю AccessViolation.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
VICTAR
Дата 30.7.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Цитата(pseud @  30.7.2008,  17:49 Найти цитируемый пост)
...неверна.

По умолчанию для дочерних форм Action = caHide, так что Akella прав.
А про невалидные указатели это известное дело, чтобы этого избежать и существует FreeAndNil.

Это сообщение отредактировал(а) VICTAR - 30.7.2008, 17:02
PM MAIL   Вверх
morpheyushka
Дата 30.7.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зеленый человек
**


Профиль
Группа: Участник
Сообщений: 563
Регистрация: 26.2.2008
Где: Киев

Репутация: 3
Всего: 8



Цитата(VICTAR @  30.7.2008,  17:01 Найти цитируемый пост)
По умолчанию для дочерних форм Action = caHide

Дык мы же это умолчание и изменяем в методе OnClose
Код

Action := caHide;


Остается только ссылка


--------------------
user posted image
Спасибо делается вот так!!!
PM MAIL WWW   Вверх
VICTAR
Дата 30.7.2008, 17:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Складывается такое впечатление, что здесь каждый говорит о своем
PM MAIL   Вверх
Akella
Дата 30.7.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата


объект-форма на самом деле уничтожается, т.е.  фраза...
Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
При закрытии окна оно не уничтожается, а типа прячется. Там может быть куча компонентов визуальных и невизуальных, вследствие чего окно может жрать кучу памяти.

...неверна.


я ещё раз повторяю, если ты закрываешь немодальную форму, а в OnClose нет Action := caFree , то форма НЕ уничтожается, как донести это до тебя?

Добавлено через 2 минуты и 48 секунд
Цитата

и если после уничтожения я пишу:
    
  if Assigned(Form1) then
    Form1.Show;

получаю AccessViolation. 

 smile  smile  smile  smile  а я тебе о чём? smile  знаешь почему? Потому что assigned возвпащает True! А знаешь почему assigned возвпащает True??? Потому что ты не освободил указатель. Чтобы освободить указатель нужно вызвать Form1 := nil;
Посмотри Исходники FreeAndNil

Добавлено через 4 минуты и 25 секунд
Цитата(morpheyushka @  30.7.2008,  17:37 Найти цитируемый пост)
Дык мы же это умолчание и изменяем в методе OnClose

Я ГОВОРИЛ ПРО ТО, ЕСЛИ БЫ НЕ БЫЛО В ONCLOSE НИЧЕГО smile

Добавлено через 6 минут и 11 секунд
Цитата(VICTAR @  30.7.2008,  17:47 Найти цитируемый пост)
Складывается такое впечатление, что здесь каждый говорит о своем 

 smile 
а как до народа донести, что я писАл это:

Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
Смотри. В процессе работы пользователь открывает и закрывает окно. При закрытии окна оно не уничтожается, а типа прячется. 


имея ввиду то, что в OnClose программист не вставил код action := caFree;

Добавлено через 8 минут и 56 секунд
Теперь идём дальше. Если программист вставляет action := caFree; , то форма уничтожаентся, но указатель НЕТ.
но вот если в событии OnClose будет 2 строки:
action := caFree; 
и
ИмяФормы := nil;

то и форма уничтожится, и указатель в памяти на форму эту освободиться
и тогда уже при последующей проверка if assigned(ИмяФормы) вернёт FALSE

ЧТО И ТРЕБОВАЛОСЬ ДОКАЗАТЬ!
ФУХ smile 
PM MAIL   Вверх
pseud
Дата 30.7.2008, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(VICTAR @  30.7.2008,  17:47 Найти цитируемый пост)
Складывается такое впечатление, что здесь каждый говорит о своем


+1

прошу прощения за еще немножко оффтопа.

Akella, 
та поставил вопрос:
Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
зачем   Form1 := nil;?

и ответил на него:
Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
Смотри. В процессе работы пользователь открывает и закрывает окно. При закрытии окна оно не уничтожается, а типа прячется. Там может быть куча компонентов визуальных и невизуальных, вследствие чего окно может жрать кучу памяти.Здесь два пути: 1. Ничего не делать при закрытии формы, тогда она в следующий раз может открыться быстрее, т.к. всё уже создано, просто спрятано и живёт в памяти.2. Уничтожить, но окно в следующий раз может открываться медленнее. Но память и указатели будут освобождены.

согласиь вопрос с ответом никак не стыкуются. 
это меня навело на мысль что ты - это не ты.

но ты-то, оказывается, все-таки - ты  smile . так что Akella не промахнулся...

чур я прекращаю этот комаровский рынок.



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Alexeis
Дата 30.7.2008, 19:42 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Akella @  30.7.2008,  12:45 Найти цитируемый пост)
По каким полям? Нечего тогда обращаться к несозданной форме или нужно проверять, создана форма или нет. 

  OnClose вызывается не святым духом, а изнутри методов формы. После выполнения обработчика в методе вызвавшем обработчик или ниже по стеку могут быть еще обращения к полям самой формы. Потенциально это может привести к AV. Насколько я знаю запрещено удалять объект (себя) из своего же обработчика.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
VICTAR
Дата 30.7.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Цитата(Alexeis @  30.7.2008,  20:42 Найти цитируемый пост)
Насколько я знаю запрещено удалять объект (себя) из своего же обработчика.

в подтверждение слов
http://www.delphilab.ru/content/view/206/63/
PM MAIL   Вверх
Akella
Дата 30.7.2008, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(Alexeis @  30.7.2008,  19:42 Найти цитируемый пост)
Насколько я знаю запрещено удалять объект (себя) из своего же обработчика.

но код же сначала уничтожает нормально! форму, а потом только освобождает указатель
Код

action := caFree
Form1 := nil;

так что здесь никаких AV не должно быть


Это сообщение отредактировал(а) Akella - 30.7.2008, 20:54
PM MAIL   Вверх
VICTAR
Дата 30.7.2008, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Akella, Alexeis говорил про FreeAndNil(Form1)
Давайте наконец дадим этой теме спокойной умереть. Все всё выяснили  smile 
PM MAIL   Вверх
Akella
Дата 30.7.2008, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



smile

Добавлено через 1 минуту и 37 секунд
Цитата(Alexeis @  30.7.2008,  19:42 Найти цитируемый пост)
Насколько я знаю запрещено удалять объект (себя) из своего же обработчика.

а как же caFree

Добавлено через 3 минуты и 6 секунд
да, так неправильно
Цитата(Akella @  25.7.2008,  16:11 Найти цитируемый пост)
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  FreeAndNil(Form1);//так лучше
end;


но здесь я испроавил свою ошибку
Цитата(Akella @  30.7.2008,  13:45 Найти цитируемый пост)
ой, немного ошибся, вот так правильнее:
Выделить всёкод Pascal/Delphi
1:
2:
3:
4:
5:
    
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Form1 := nil; // освобождаем указатель на форму.
end;


PM MAIL   Вверх
pseud
Дата 31.7.2008, 08:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Akella @  30.7.2008,  20:37 Найти цитируемый пост)
но код же сначала уничтожает нормально! форму, а потом только освобождает указатель

Код

action := caFree

- это еще не удаление формы, а лишь выставление флага для вызвавшей процедуры DoClose;
а уже она решает что с ним делать.
да еще ее могу перекрыть и навызывать + процедур кучу. 
и кста после перекрытий ваще могут забыть OnClose вызвать. Ужастик какой-то. ))


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Alexeis
Дата 31.7.2008, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Чтобы не было пустых разговоров скажу, что вариант хоть логически не идеальный, но может работать в однопоточной программе. Почему в однопоточной? Потому что мы его уже давно проверяли под дебагом. Живой он только потому, что после освобождения памяти ее никто не успевает получить. Так оно будет всегда, пока работает 1 поток, потому что в процессе удаления нет дополнительных выделений памяти (разве что эксепшин выскочит). Если будет работать второй поток, то сразу после удаления формы эту память может кто-то запросить и при последующих операциях может нарушиться память чужого потока и дальше последствия непредсказуемы, как говорят UB. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Akella
Дата 31.7.2008, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



По идее любая программа может быть много поточной, особенно в тех случаях, когда ты используешь сторонние компоненты.
Так как же тогда правильно работать в многопоточной программе в этом случае? 
Ты хочешь сказать, что если я в программе использую многопоточность, то я должен опасаться использования этих метов закрытия форм:
action := caFree;
Form1 := nil;
???

Или я тебя не допонял? smile 

Но мы же форму уничтожили. Память освободили. Указатель тоже. Ну и пусть себе на здоровье другой поток занимает эту память, что с того? Она же свободна?
PM MAIL   Вверх
Alexeis
Дата 31.7.2008, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Akella @  31.7.2008,  09:48 Найти цитируемый пост)
Ты хочешь сказать, что если я в программе использую многопоточность, то я должен опасаться использования этих метов закрытия форм:
action := caFree;
Form1 := nil;
???

  Этих нет, а вот если вызывать FreeAndNil в OnClose то есть шансы завалиться в AV.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Akella
Дата 31.7.2008, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Alexeis, Согласен!!! Я же ответил уже, раза 2 или 3, что в том сообщении я ОШИБСЯ!
PM MAIL   Вверх
Alexeis
Дата 31.7.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Akella @  31.7.2008,  10:30 Найти цитируемый пост)
Я же ответил уже, раза 2 или 3, что в том сообщении я ОШИБСЯ!

  Прости тут многа букав, а у меня мало времени smile.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Akella
Дата 31.7.2008, 18:08 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Как я понял, все согласны, что правильно уничтожать немодальную форму будет так:
Код

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Form1 := nil; // освобождаем указатель на форму.
end;

Кстати при проектировании MDI приложений - этот код будет весьма кстати
PM MAIL   Вверх
pseud
Дата 1.8.2008, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Akella @  31.7.2008,  18:08 Найти цитируемый пост)
Кстати при проектировании MDI приложений - этот код будет весьма кстати

отнюдь не кстати
т.к. в mdi-приолжениях форм класса TForm1 может быть открыто одновременно n-штук.
а Form1 - это всего лишь одна переменная данного класса.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Akella
Дата 1.8.2008, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Если ты и прав, то и как тогда быть?

Добавлено через 8 минут и 18 секунд
у меня есть MDI приложение, всё там работает очень даже хорошо, даже если я создаю экземляров 5-7 какой либо формы smile
PM MAIL   Вверх
pseud
Дата 1.8.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



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

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

Цитата(VICTAR @  30.7.2008,  20:40 Найти цитируемый пост)
Давайте наконец дадим этой теме спокойной умереть




--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1051 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.