Форум: "Основная";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
ВнизМодальная форма и работа с файлом Найти похожие ветки
← →
Azon © (2004-04-11 02:43) [0]Я решил задать сразу два вопроса в одном топике.
1. Как закрыть модальную форму из процедуры OnActivate? Не уничтожать, а именно закрыть. В Help"е сказано, что для этого ей надо присвоить не нулевой ModalResult, но что-то ей на это "по барабану".
2. Как удалить часть файла. Используется типизированный файл, и необходимо по указанию пользователя удалять его часть. Хотелось бы именно удалять, а не перезаписывать с недобавлением той части которая не нужна.
Надеюсь на помощь. ;)
← →
Fay © (2004-04-11 03:22) [1]1) Можно в OnActivate запихнуть
PostMessage(Self.Handle, WM_CLOSE, 0, 0);
2) Часть из произвольного места?
← →
Azon © (2004-04-11 03:43) [2]1. С первым вопросом разобрались. Спасибо Fay!
2. Да любую часть из произвольного места. В типизированном файле, так как запись строго определенного размера, можно к сохраненным в нем объектам перемещаться с помощью seek(file, index of object). Так вот мне может понадобиться удалить объект под номером i, или n объектов подряд начиная с i.
Как это сделать?
← →
Fay © (2004-04-11 04:17) [3]Сделать это просто - сдвинь все идущие после удаляемой записи и изменить размер файла. Но не лучше будет пометить эту запись как удалённую?
← →
Azon © (2004-04-11 04:32) [4]Хм.. Пометить как удаленную... а это идея. Спасибо.
Но если это мне не подойдет, то как сдвинуть записи, и как изменить размер файла?
А может лучше использовать СУБД? Поясняю: я сохраняю в файл сообщения (каждое длинной не более 400 байт), отправителя, получателя, время получения.
Я еще с базами данных дела не имел. Это как, сложно?
И стоит ли в программе типа Popup с этим заморачиваться?
← →
Fay © (2004-04-11 04:34) [5]>> И стоит ли в программе типа Popup с этим заморачиваться?
Хозяин барин 8)
>> как сдвинуть записи, и как изменить размер файла
Подожди. Мне делать нефиг - чИчЯз слобаю
← →
Azon © (2004-04-11 04:44) [6]Жду.. :))
← →
Azon © (2004-04-11 05:06) [7]Что-то ты долго лобаешь(?).
Я тут подумал и решил что с пометками об удалении не пройдет, так что точно нужно сдвигать записи и изменять размер
← →
Fay © (2004-04-11 05:07) [8]Я не уснул - просто дитё проснулось голодное...
Тебе код может показаться странным. Я типизирован(н?)ыми файлами не работаю, т.к. у меня их не бывает.procedure BuBuBu(fn : string; Index : Cardinal);
type
TYourRecType = packed record
Field1 : Integer;
Field2 : array[0..99] of Char;
end;
const
BSZ = 4096;
var
h1, h2 : THandle;
b : array[0..BSZ - 1] of Byte;
bw, br : Cardinal;
begin
h1 := CreateFile(PChar(fn), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
h2 := CreateFile(PChar(fn), GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
SetFilePointer(h1, SizeOf(TYourRecType) * Index, nil, FILE_BEGIN);
SetFilePointer(h2, SizeOf(TYourRecType) * (Index + 1), nil, FILE_BEGIN);
ReadFile(h1, b, BSZ, br, nil);
if br > 0 then
repeat
WriteFile(h2, b, br, bw, nil);
ReadFile(h1, b, BSZ, br, nil);
until br = 0;
CloseHandle(h1);
SetEndOfFile(h2);
CloseHandle(h2);
end;
Я его не проверял 8). Проверок на ошибки тоже не делал - лениво.
← →
Fay © (2004-04-11 05:23) [9]Ошибочка 8)
SetFilePointer(h1, SizeOf(TYourRecType) * (Index+1), nil, FILE_BEGIN);
SetFilePointer(h2, SizeOf(TYourRecType) * Index, nil, FILE_BEGIN);
← →
Azon © (2004-04-11 05:39) [10]Я еще не проверил, но мне уже один момент не понятен:
>h1 := CreateFile(PChar(fn), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
Зачем FILE_SHARE_READ or FILE_SHARE_READ?
← →
Fay © (2004-04-11 05:50) [11]Это очепятка 8)
Я проверил - работает.procedure BuBuBu(fn : string; Index : Cardinal);
const
BSZ = 4096;
var
h1, h2 : THandle;
b : array[0..BSZ - 1] of Byte;
bw, br : Cardinal;
begin
h1 := CreateFile(PChar(fn), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
h2 := CreateFile(PChar(fn), GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0); //
SetFilePointer(h1, SizeOf(TYourRecType) * (Index + 1), nil, FILE_BEGIN);
SetFilePointer(h2, SizeOf(TYourRecType) * Index, nil, FILE_BEGIN);
ReadFile(h1, b, BSZ, br, nil);
if br > 0 then
repeat
WriteFile(h2, b, br, bw, nil);
ReadFile(h1, b, BSZ, br, nil);
until br = 0;
CloseHandle(h1);
SetEndOfFile(h2);
CloseHandle(h2);
end;
З.Ы.
У меня файл больше нигде не открывается, поэтому h2 создаётся без FILE_SHARE_WRITE.
← →
Azon © (2004-04-11 06:37) [12]Все! Топик можете закрывать. Огромное спасибо FAY!!!!!
← →
Fay © (2004-04-11 06:59) [13]8)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.032 c