Текущий архив: 2003.10.06;
Скачать: CL | DM;
Вниз
Record или Class Найти похожие ветки
← →
alehan © (2003-09-25 14:04) [0]Нужно асинхронно обработать некие данные, и делал я сначала так:
PMyRecord=^TMyRecord;
TMyRecord=record {поля} end;
procedure TForm1.Button1Click(Sender: TObject);
var p:PMyRecord;
begin
with p^ do
begin
//заполняем поля
end;
PostMessage(Form1.Handle, WM_MY_MESSAGE, 0, LongInt(p));
end;
procedure TForm1.WMMyMessage(var m : TMessage);
var p:PMyRecord;
begin
p:=PMyRecord(m.LParam);
// обработка данных из p^
Dispose(p);
end;
И всё замечательно работало. Но. Взбрелось мне вместо record сделать class.
PMyClass=^TMyClass;
TMyClass=class {поля и методы} end;
procedure TForm1.Button1Click(Sender: TObject);
var MyClass:TMyClass;
begin
MyClass:=TMyClass.Create;
//заполняем поля MyClass
PostMessage(Form1.Handle, WM_MY_MESSAGE, 0, LongInt(@MyClass));
end;
procedure TForm1.WMMyMessage(var m : TMessage);
var с:TMyClass;
begin
с:=PMyClass(m.LParam)^;
// обработка данных из с
с.free;
end;
Теперь WMMyMessage ругается, MyClass видать саморазрушается ранее, очевидно при выходе из Button1Click. Определил MyClass как глобальную переменную - помогло, но если запустить Button1Click дважды (не дав пройти WMMyMessage), то обратотается нормально только одно сообщение. На втором - опять эксепшн.
Вот я не понял. Нет, всё понятно, но как конкретно. Динамически создавать и удалять классы... :)
Спасибо!
← →
Palladin © (2003-09-25 14:09) [1]Ну во первых бессмысленно создавать указатель на указатель...
ибо идентификатор объекта уже указатель...
Во вторых очень интересная работа с указателем в первом варианте, ты знаком с такими основами как New, Dispose?
← →
Юрий Зотов © (2003-09-25 14:13) [2]PMyClass - выбросьте. Объектная переменная - это УЖЕ указатель.
procedure TForm1.Button1Click(Sender: TObject);
var
MyClass: TMyClass;
begin
MyClass:= TMyClass.Create;
try
//заполняем поля MyClass
PostMessage(Form1.Handle, WM_MY_MESSAGE, 0, LongInt(MyClass))
except // Это страховка от утечки памяти при ошибке
MyClass.Free;
raise
end
end;
procedure TForm1.WMMyMessage(var m: TMessage);
begin
with TMyClass(m.LParam) do
try
// обработка данных
finally
Free
end
end;
← →
jack128 © (2003-09-25 14:16) [3]
> ты знаком с такими основами как New, Dispose
С Dispose человек знаком...А вот с New действительно не очень .. ;-)
← →
alehan © (2003-09-25 14:23) [4]> Palladin
ой, да
procedure TForm1.Button1Click(Sender: TObject);
var p:PMyRecord;
begin
New(p); //стёр случайно :)
with p^ do
begin
//заполняем поля
end;
PostMessage(Form1.Handle, WM_MY_MESSAGE, 0, LongInt(p));
end;
-----------
> Юрий Зотов
Огромное спасибо!
-----------
> Всем
Даже не ожидал такой оперативности... Вы меня вылечили :)
← →
Serginio666 (2003-09-25 14:35) [5]У тебя проблема в
procedure TForm1.Button1Click(Sender: TObject);
var MyClass:TMyClass;
begin
MyClass:=TMyClass.Create;
//заполняем поля MyClass
PostMessage(Form1.Handle, WM_MY_MESSAGE, 0, LongInt(@MyClass));
end;
@MyClass это ссылка на память в стеке, которая изменяется очень активно. Нужно учитывать это обстоятельство.
Страницы: 1 вся ветка
Текущий архив: 2003.10.06;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.024 c