Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1080725353
JibSkeart
2004-03-31 13:29
2004.04.25
Интерестно а можно узнать в ADOConnection у какого обьекта ...


14-1079985969
Andreykom
2004-03-22 23:06
2004.04.25
Memory


3-1080574116
lvp
2004-03-29 19:28
2004.04.25
Пароль+логин в трехзвенке


3-1080537249
WondeRu
2004-03-29 09:14
2004.04.25
ADOConnection.ConnectionString


7-1077707481
CrytoGen
2004-02-25 14:11
2004.04.25
проблемы с CreateProcessAsUser





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский