Главная страница
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.024 c
1-18288
xGhost
2003-09-26 11:40
2003.10.06
проблема с удалением значения из ini файла


14-18559
Jiura32d
2003-09-18 20:31
2003.10.06
Дайте please компонент для предосмотра перед печатью!!!!


1-18336
Bocman
2003-09-23 16:24
2003.10.06
Проблеммы с получение адреса отправителя


14-18614
lak
2003-09-17 17:13
2003.10.06
отдохните от рекламы


1-18395
@andrew
2003-09-25 20:39
2003.10.06
ClipBoard. ВСЕМ ПРИВЕТ! Подскажите, пжл.