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

Вниз

Модальная форма и работа с файлом   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.037 c
7-1078326067
Ш-К
2004-03-03 18:01
2004.04.25
Захват кадров


14-1080994553
Romario
2004-04-03 16:15
2004.04.25
Двоично-десятичное представление числа.


3-1080650722
dolmat
2004-03-30 16:45
2004.04.25
Никак не добъюсь полного отображения информации


3-1080285883
Jungle
2004-03-26 10:24
2004.04.25
MS SQL + ADO + DateTime


7-1077634845
Rentgen
2004-02-24 18:00
2004.04.25
WDM