Форум: "Основная";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
Вниз---|Ветка была без названия|--- Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c