Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Вниз

Как освободить(Free) экземпляр TImage при клике на него?   Найти похожие ветки 

 
Glex ©   (2006-02-06 20:03) [0]

procedure TForm1.Image1Click(Sender: TObject);
begin
TImage(Sender).Free;
end;

Через раз Error. В help"e написано, что нельзя удалять объект в его event"ах. Как тогда мне удалить image при клике на неё?


 
Desdechado ©   (2006-02-06 21:23) [1]

например, в OnClick добавить его в некий TList, который по таймеру очищать
procedure TForm1.Image1Click(Sender: TObject);
begin
 list.Add(Sender);
end;
procedure TForm1.Timer1Timer
var i: Integer;
begin
 for i := 0 to list.Count - 1 do
   list.Items[ i ].Free;
 list.Clear;
end;


 
Asail   (2006-02-06 21:26) [2]


> например, в OnClick добавить его в некий TList, который
> по таймеру очищать

А если до наступления события таймера еще раз кликнуть? Он ему два раза Free сделает, или нет?


 
begin...end ©   (2006-02-06 21:28) [3]

> Glex ©   (06.02.06 20:03)

Из OnClick посылать форме какое-нибудь своё сообщение (через PostMessage), а в обработчике этого сообщения удалять объект.


 
Glex ©   (2006-02-07 20:35) [4]

begin...end

Прочитал в хелпе дельфей про PostMessage.
Несмотря на мой слабый англ. яз., понял, что PostMessage выполняется после того, как процедура, из которой он вызван, выполнится.
Прав ли я?

Дай пожалуйста пример по использованию PostMessage!


 
Джо ©   (2006-02-07 20:44) [5]

> [4] Glex ©   (07.02.06 20:35)



const
 WM_KILLME = WM_USER+999;
type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   procedure WmKillMe (var Message: TMessage); message WM_KILLME;
 public
   { Public declarations }
 end;
....

procedure TForm1.WmKillMe(var Message: TMessage);
begin
 TObject(Message.WParam).Free
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 PostMessage(Handle,WM_KILLME,Integer(Sender),0);
end;

В таком духе.


 
begin...end ©   (2006-02-07 20:47) [6]

> Glex ©   (07.02.06 20:35) [4]

> Несмотря на мой слабый англ. яз., понял, что PostMessage
> выполняется после того, как процедура, из которой он вызван,
> выполнится.
> Прав ли я?

Нет, Вы не правы.

> Дай пожалуйста пример по использованию PostMessage!

const
 WM_MYMESSAGE = WM_USER + 100;

type
 TForm1 = class(TForm)
   Image1: TImage;
   procedure Image1Click(Sender: TObject);
 private
   procedure WMMyMessage(var Message: TMessage); message WM_MYMESSAGE;
 end;

...

procedure TForm1.WMMyMessage(var Message: TMessage);
begin
 TObject(Message.WParam).Free
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
 PostMessage(Handle, WM_MYMESSAGE, Integer(Sender), 0)
end;


 
Zeqfreed ©   (2006-02-07 20:53) [7]

При посылке сообщения, которое представляет собой на самом деле обычное число, через PostMessage это сообщение будет помещено в очередь сообщений того окна, которому сообщение адресовано. После этого выполнение программы продолжится. В определенный момент времени, будет вызвана оконная процедура, обрабатывающая те самые сообщения, которые были помещены в очередь сообщений окна. Эту оконную процедуру можно изменить и, соответственно, получить возможность самому обработать необходимые сообщения. Небольшой пример:

. . .

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   procedure WndProc(var Message : TMessage); override; //Переопределяем оконную процедуру
 public
   { Public declarations }
 end;

const
 WM_NEWMESSAGE = WM_USER + 1; {Будем использовать константу WM_USER + 1 в качестве нашего сообщения, сообщения выше WM_USER зарезервированы специально под пользовательские нужды}

. . .

procedure TForm1.Button1Click(Sender: TObject);
begin
 PostMessage(Handle, WM_NEWMESSAGE, 0, 0); //Отсылаем сообщение нашему окну
end;

procedure TForm1.WndProc(var Message: TMessage);
begin
 inherited; //Стандартная обработка, в нее мы не вмешиваемся
 if (Message.Msg = WM_NEWMESSAGE) then //Отдельно обрабатываем наше сообщение
  Button1.Free;
end;


 
Glex ©   (2006-02-07 20:54) [8]

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


 
Германн ©   (2006-02-08 01:50) [9]

2 Джо ©   (07.02.06 20:44) [5]

Серёг, ты что - "скрытый" сатанист?  WM_KILLME = WM_USER+999; :)))


 
Джо ©   (2006-02-08 02:02) [10]

> [9] Германн ©   (08.02.06 01:50)
> 2 Джо ©   (07.02.06 20:44) [5]
>
> Серёг, ты что - "скрытый" сатанист?  WM_KILLME = WM_USER+999;
> :)))

Выходит, что так. Неудачно замаскировался :)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.04 c
15-1139143819
Cerberus
2006-02-05 15:50
2006.02.26
Можно ли по номеру телефона узнать данные абонента.


6-1132152638
pmi1
2005-11-16 17:50
2006.02.26
Кто-то пользовался функцией InternetCheckConnection?


2-1139745744
ihatelogins
2006-02-12 15:02
2006.02.26
Delphi + unicode


11-1120320117
La Stik
2005-07-02 20:01
2006.02.26
Combobox


15-1138855004
TUser
2006-02-02 07:36
2006.02.26
В круге первом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский