Главная страница
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
14-8161
Undert
2002-09-09 00:13
2002.10.03
Для Питербуржцев охрененное предложение!!!


3-7869
Шурик Ш
2002-09-12 14:52
2002.10.03
Drag&Drop: Источник DBGrid


7-8185
wdr
2002-07-23 08:23
2002.10.03
Try..Except...


1-8016
ctapik-net
2002-09-21 21:05
2002.10.03
Declaration of class TForm1 is missing or incorrect!!!


3-7781
qwerty0
2002-09-14 21:19
2002.10.03
Лицензии к Interbase