Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.017 c
1-18421
vadfe
2003-09-25 13:39
2003.10.06
Помогите чайнику


1-18401
Вован
2003-09-25 15:32
2003.10.06
У когонибуть есть русский Consts.pas и DBConsts.pas ???


1-18465
WondeRu
2003-09-24 09:22
2003.10.06
Сервисы


14-18577
Mystic
2003-09-18 14:28
2003.10.06
Красная книга


3-18256
Andrey V.
2003-09-15 14:57
2003.10.06
ib vs. fb