Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-18608
RDA
2003-09-17 18:20
2003.10.06
Update для Delphi 5


14-18535
Прохожий
2003-09-19 07:34
2003.10.06
ICQ - Сервер


14-18540
Ru
2003-09-17 10:43
2003.10.06
http://deep.webm.ru/forum/reply.php?num=3.1&id=39787


3-18225
MJ
2003-09-16 23:16
2003.10.06
sql server


14-18628
vopros
2003-09-17 13:15
2003.10.06
Где посмотреть праздничные даты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский