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

Вниз

не разрушается обьект !   Найти похожие ветки 

 
sten   (2004-12-04 13:09) [0]

Кто-нибудь может обьяснить следующий факт :

var ch:tchecklistbox;
procedure tform1.chdown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
ch.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ch:=tchecklistbox.Create(self);
ch.Parent:=self;
ch.OnKeyDown:=chdown;
end;

На форме есть кнопка button1. При клике на ней создается checklistbox. При событии OnKeyDown
этот листбокс уничтожается. Все это работает, пока на форме нет других обьектов. Но стоит добавить
любой обьект (например еще одну button, или просто щелкнуть на button1 2 раза, создав 2 checklistbox"a),
при уничтожении checklistbox вываливается ошибка.

ПОЧЕМУ ???


 
DrPass ©   (2004-12-04 13:31) [1]

Нельза уничтожать объекты в обработчиках их событий


 
sten   (2004-12-04 13:38) [2]

а почему это работает

procedure TForm1.Button2Click(Sender: TObject);
begin
form1.Button2.Destroy;
end;

почему, как я уже говорил, если на форме только button1, то мой пример из сабжа тоже работает ?


 
PURGEN   (2004-12-04 13:47) [3]

var ch:tchecklistbox; - создал переменную
ch.Free;              - удалил переменную

Как ты интересно с помощью неё собираешься удалить конкретный объект если их 2!!! Переменная то одна...


 
sten   (2004-12-04 13:53) [4]

не, сh является указателем на текущий обьект. Можно десять раз нажать button1, и создасться 10 экземпляров checklistbox, совершенно друг от друга независящих


 
PURGEN   (2004-12-04 14:01) [5]

Это понятно...А как ты их собираешься удалять???? К какому именно объекту у тебя будет относиться CH???


 
sten   (2004-12-04 14:09) [6]

последний созданный.

Кто кого здесь консультирует?


 
Jel ©   (2004-12-04 14:52) [7]

1. В обработчике tform1.chdown поставить вместо ch.Free - Sender.Free.

2. Если нажать на кнопку в твоем примере дважды создастся 2 чекбокса, но первый будет уже недоступен, так как ссылка на него потеряна. А обработчик tform1.chdown из твоего пример будет пытаться разрушить второй чекбокс при событии, которое произошло на ЛЮБОМ из них.


 
sten   (2004-12-04 15:43) [8]

все равно ошибка вываливается


 
Jel ©   (2004-12-04 15:57) [9]

А текст ошибки можно узнать?


 
sten   (2004-12-04 16:16) [10]

Access violation at address ...

Да ты сам можешь проэкспериментировать, там 5 строчек кода.


 
Anatoly Podgoretsky ©   (2004-12-04 16:17) [11]

sten   (04.12.04 16:16) [10]
Это говорит о том, что указатель неверный.


 
Jel ©   (2004-12-04 16:41) [12]

Склонен согласиться с


> DrPass ©   (04.12.04 13:31) [1]


 
begin...end ©   (2004-12-04 16:43) [13]

> sten

Т.е. Вас ответ [1] не устраивает? Вы считаете его неверным?

> [2] sten   (04.12.04 13:38)

> а почему это работает

А у меня, например, вроде бы нормально (по крайней мере, до завершения программы) работает вот такой код:

var
 Arr: array of Integer;
begin
 SetLength(Arr, 1);
 Arr[100] := 1
end.

Но это же не является опровержением того, что не следует выходить за границы массива?

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


 
sten   (2004-12-04 22:08) [14]

что-то с сообщениями та-же история. Один в один, если на форме только button1, то все работает, ch уничтожается, но стоит добавить еще один компонент - Access violation at address ...

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, CheckLst;

type
 TForm1 = class(TForm)
   Button1: TButton;
   CheckListBox1: TCheckListBox;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
   procedure test(var msg: tmessage); message wm_user;
   procedure chdown(Sender: TObject; var Key: Word;
Shift: TShiftState);
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

var ch:tchecklistbox;

procedure tform1.test(var msg: tmessage);
begin
if msg.WParam =1 then ch.Free;
end;

procedure tform1.chdown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
sendmessage(form1.Handle,wm_user,1,0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var test:tmessage;
begin
ch:=tchecklistbox.Create(self);
ch.Parent:=self;
ch.OnKeyDown:=chdown;
end;

end.


 
begin...end ©   (2004-12-04 22:17) [15]

> [14] sten   (04.12.04 22:08)

Замените SendMessage на PostMessage. Сообщите о результатах.


 
sten   (2004-12-05 09:34) [16]

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

Слава богу все заработало, а то я уже не знал как с этим бороться



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

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

Наверх




Память: 0.48 MB
Время: 0.039 c
3-1100688870
md
2004-11-17 13:54
2004.12.19
как конвертировать NUMBER в STRING


1-1102428928
Гость
2004-12-07 17:15
2004.12.19
Модальное окно


4-1099733725
howdo
2004-11-06 12:35
2004.12.19
почему не работает ShowWindow(WHandle, SW_RESTORE) ?


4-1099933195
nookie84
2004-11-08 19:59
2004.12.19
как происходит выключение компа?


6-1097079906
ДАНИИЛ
2004-10-06 20:25
2004.12.19
СТАРТОВАЯ СТРАНИЦА





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский