Форум: "Основная";
Текущий архив: 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.037 c