Главная страница
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.011 c
4-8223
oduvan
2002-08-16 18:38
2002.10.03
Как лучшее всего удалить папку с файлами в корзину?


3-7850
KIR
2002-09-13 00:23
2002.10.03
Снова о переносе БД с Paradox a


3-7797
Dmitry Toropov
2002-09-10 17:14
2002.10.03
ADO не работает


7-8200
Metallica
2002-07-28 14:29
2002.10.03
-----> Как спрятать программу.


14-8148
Карлсон
2002-09-07 15:39
2002.10.03
SDRAM