Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.03;
Скачать: CL | DM;

Вниз

---|Ветка была без названия|---   Найти похожие ветки 

 
kex86 ©   (2002-09-22 02:24) [0]

Как сохранить в файл регион?
Все наверное сразу скажут
var f:file of cardinal;
rgn:cardinal;
begin
...
assignfile(f,"...");
rewrite(f);
write(rgn);
closefile(f);
...
end;
ну так вот:
когда создаешь регион delphi выдает его handle, поэтому весь регион выражается cardinal"ом. Значит при взятии этого handl"а из файла берется только дескриптор, а не регион, который в программе не определен. Как быть?
я пробовал через extcreateregion и GetRegionData, наверное как-то так и надо, но у меня хелпер про это токо на C++ и на английском.


 
kex86 ©   (2002-09-22 03:22) [1]

ну ведь надо мне!


 
dim- ©   (2002-09-22 04:18) [2]

Как то не понял вопрос, handle это указатель на память


 
MBo ©   (2002-09-22 06:51) [3]

Ответ в другой ветке


 
Юрий Зотов ©   (2002-09-22 11:48) [4]

Handle - это НЕ указатель на память. Это просто число, численный идентификатор. Как бы "номер строки" во внутренней таблице Windows.


 
Ricks ©   (2002-09-22 12:42) [5]

А как ты его создаешь?
(Я имею в виду, что может лучше делать
var F:File of TPoint
...
for I:=0 to num-1 do
BlockWrite(F, points[I], SizeOf(TPoint)))


 
Старый паскалист   (2002-09-22 13:40) [6]

Да, тяжело в деревне без нагана...
(в смысле без английского)
Ты же нашёл все нужные тебе функции.

const
RegionMarker = $BCD0A2EA;

procedure SaveRgnToStream(hreg: HRGN; Stream: TStream);
var prd: PRgnData;
BufSize: Cardinal;
Marker: Cardinal;
begin
Marker := RegionMarker;
BufSize := GetRegionData(hreg, 0, nil);
GetMem(prd, BufSize);
try
BufSize := GetRegionData(hreg, BufSize, prd);
Stream.WriteBuffer(Marker, SizeOf(Marker));
// При записи данных сложного формата всегда неплохо
// подстраховаться и проконтролировать,
// что данные в потоке соответствуют этому формату
Stream.WriteBuffer(BufSize, SizeOf(BufSize));
Stream.WriteBuffer(prd^, BufSize);
finally
FreeMem(prd, BufSize);
end;
end;

function {Read}CreateRgnFromStream(Stream: TStream): HRGN;
// Лучше назвать ф-ю CreateXXX, чтобы было понятно, что потом
// результат нужно будет где-то освободить
var prd: PRgnData;
BufSize: Cardinal;
Marker: Cardinal;
begin
Stream.ReadBuffer(Marker, SizeOf(Marker));
if Marker <> RegionMarker then raise Exception.Create("Region read: Invalid data");

Stream.ReadBuffer(BufSize, SizeOf(BufSize));
GetMem(prd, BufSize);
try
Stream.ReadBuffer(prd^, BufSize);
Result := ExtCreateRegion(nil, BufSize, prd^);
finally
FreeMem(prd, BufSize);
end;
end;

{---------------Использование------------------------}
var
Stm: TStream;
hYouRgn: HRGN;
begin
Stm := TFileStream.Create("...", fmCreate or fmShareDenyWrite);
try
SaveRgnToStream(hYourRgn, Stm);
finally
Stm.Free;
end;
end;

PS я мог бы сразу в файл сделать, да не хочется мне вложенные траи писать. И к тому же более общий случай получился.


 
kex86 ©   (2002-09-24 01:22) [7]

>Ricks
я делаю регионы из рисунка bmp



Страницы: 1 вся ветка

Текущий архив: 2002.10.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
4-8237
Serguar
2002-08-15 12:20
2002.10.03
получение строкового ресурса по handle


14-8118
TTCustomDelphiMaster
2002-09-07 19:21
2002.10.03
Кино не показывает


3-7876
Tie
2002-09-13 22:31
2002.10.03
Приблизительный поиск


6-8089
Yuriy
2002-08-01 08:25
2002.10.03
Помогите разобраться с web компанентами.


8-8074
Arhangel
2002-05-27 20:02
2002.10.03
MSAgent