Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c