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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как удалить компонент, при обработке им своего события 
V
    Опции темы
chikistbuch
Дата 26.5.2012, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



Хочу сделать чтобы при нажатии на Enter в Edit'е он исчезал, да не просто исчезал, а вообще удалялся из формы. Edit'ы созданы в run-time (MyEdit1, MyEdit2, и т.д.)

К примеру в MyEdit1 нажали Enter, вот код:

Код

procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);//когда нажали клавишу на edit
begin
  if Key = #13 then begin //если нажат enter
    Key := #0;//чтобы не звенело
    DestroyComponent('MyEdit1', form1.GroupBox4);//удаляем edit
  end;
end;


а вот и сама процедура удаления DestroyComponent:

Код

procedure DestroyComponent(name: string; gde: TComponent);//удаляет компонент
var
  i: Word;
begin
  i:=gde.ComponentCount;

  while i>0 do begin
    i:=i-1;
    if gde.Components[i].Name=name then begin
      gde.Components[i].Destroy;
      i:=0;
    end;
  end;
end;


Вопрос в том, что после завершения процедуры TForm1.EditKeyPress, выскакивает ошибка. Как я понимаю, приложение не может завершить выполнение процедуры несуществующего компонента
user posted image

При выполнении этого же кода в TForm1.EditExit, вызываемое как onExit, все ок
Код

procedure TForm1.EditExit(Sender: TObject);//когда теряет фокус edit
begin
  DestroyComponent('MyEdit1', form1.GroupBox4);//удаляем edit
end;

Подскажите, как удалить edit при нажатии в нем enter


Это сообщение отредактировал(а) chikistbuch - 26.5.2012, 17:26
PM MAIL   Вверх
northener
Дата 26.5.2012, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Посылайте форме ваше собственное сообщение с помощью PostMessage. В обработчике этого сообщения и уничтожайте компонент.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
chikistbuch
Дата 26.5.2012, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



расскажи, пожалуйста конкретнее: как именно послать сообщение и написать свой обработчик.
Вот что я нашел в нете
Код

PostMessage(FindWindow(nil,PWideChar(form1.Caption)),WM_KEYDOWN,$00000031,$00020001);

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Почти оффтоп:
northener, да, статья нужна smile

Добавлено @ 18:23
Расшифровка ответа northener:
вот.
Настоятельно рекомендую прочитать пост БелАмор-а

Это сообщение отредактировал(а) kami - 26.5.2012, 18:30
PM MAIL WWW   Вверх
northener
Дата 26.5.2012, 18:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

const
  WM_FreeMyEdit = WM_USER + 100;

type
  TForm1 = class(TForm)
  ...
  procedure WMFreeMyEdit(var Mess: TMessage); message WM_FreeMyEdit;
  ...
end;

...
 procedure TForm1.WMFreeMyEdit(var Mess: TMessage);
 begin
   MYEdit1.Free;
 end;

procedure TForm1.MyEdit1KeyPress(Sender: TObject; var Key: Char);//когда нажали клавишу на edit
begin
  if Key = #13 then begin //если нажат enter
    Key := #0;//чтобы не звенело
    PostMessage(Handle,WM_FreeMyEdit,0,0);
  end;
end;


Это сообщение отредактировал(а) northener - 26.5.2012, 18:54


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
chikistbuch
Дата 26.5.2012, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: нет
Всего: 1



kami, northener, да вы просто боги!!! СПС smile 
PM MAIL   Вверх
Akella
Дата 26.5.2012, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



chikistbuch, а ты сомневался? ;)
PM MAIL   Вверх
northener
Дата 27.5.2012, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(kami @  26.5.2012,  18:13 Найти цитируемый пост)
northener, да, статья нужна 

Вот ещё раз полазил по нашим форумам и по всемирной помойке. Но так и не нашел статью, в которой подробно и с объяснениями было бы описано как правильно уничтожать объекты!
И не только из обработчиков их событий. Но и вообще. Нет нормальной (и не только нормальной - просто никакой) статьи, где бы описывалось различие между методами Free, Destroy, Release. 

Это сообщение отредактировал(а) northener - 27.5.2012, 03:02


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Akella
Дата 27.5.2012, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Цитата(northener @  27.5.2012,  02:41 Найти цитируемый пост)
 где бы описывалось различие между методами Free, Destroy, Release. 

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


Эксперт
***


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

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



Цитата(Akella @  27.5.2012,  09:57 Найти цитируемый пост)
так можно в исходниках посмотреть

Так их "жевать" надо smile


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
MetalFan
Дата 27.5.2012, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(northener @  27.5.2012,  02:41 Найти цитируемый пост)
Нет нормальной (и не только нормальной - просто никакой) статьи, где бы описывалось различие между методами Free, Destroy, Release. 

А зачем статья? там же в двух предожениях можно описать, если глянуть исходники.

Free = проверка Self <> nil + Destroy;
Код

procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;


Release относится только к форме и равно "отложенному" Free. т.е. форме отправляется сообщение (CM_RELEASE), при обработке которого форма и прибивается.
Код

procedure TCustomForm.Release;
begin
  PostMessage(Handle, CM_RELEASE, 0, 0);
end;
procedure TCustomForm.CMRelease;
begin
  Free;
end;



Цитата(northener @  26.5.2012,  18:30 Найти цитируемый пост)
WM_FreeMyEdit

А можно написать еще более универсальный вариант, в котором передавать указатель на компонент, который надо "пришибить".


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
northener
Дата 27.5.2012, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(MetalFan @  27.5.2012,  22:37 Найти цитируемый пост)
А можно написать еще более универсальный вариант, в котором передавать указатель на компонент, который надо "пришибить".

По ссылке которую дал kami именно так и сделано.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
northener
Дата 28.5.2012, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(MetalFan @  27.5.2012,  22:37 Найти цитируемый пост)
А зачем статья? там же в двух предожениях можно описать, если глянуть исходники.

Ну хорошо. Пусть не статья. Пусть ссылка на FAQ.
Лично для меня проще иметь под рукой готовую ссылку на то, где автор вопроса сможет получить подробную информацию о том как решить его задачу, чем всякий раз "набивать" пример в своём ответе. (Пальцы чай не казённые, а мои собственные. smile

Это сообщение отредактировал(а) northener - 28.5.2012, 01:06


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Akella
Дата 28.5.2012, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Цитата(MetalFan @  27.5.2012,  22:37 Найти цитируемый пост)
 if Self <> nil then
    Destroy;


тут может быть проблема, если несколько раз создаешь и уничтожаешь объект

если уничтожаешь просто Obj.Free, то потом при проверке
if obj <> nil результат будет True

поэтому лучше уничтожать так
Код

FreeAndNil(Obj);

или
Код

Obj.Free;
Obj := nil;


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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