![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение массива Record в файл [D7, WinXP]
Cherepah © (2004-09-01 16:18:00)Подскажите пожалуйста, можно ли создать универсальную процедуру сохранения в файл (или чтения из него) массивов Record?
Ситуация такая:
type
TZaved_data = record
kod, adress, proezd, director,tel1,tel2,url : string;
end;
type
TOther = record
kod, naimenovanie : string;
end;
var
Zaved_data: array of TZaved_data;
Other: array of TOther;
Сейчас для сохранения и чтения использую формат *.csv, соответсвенно, для каждого массива приходится писать отдельную процедуру типа
readln(textfile,ch);
StrCSVToArray(ch,tmp);
SetLength(zaved_data,Length(zaved_data)+1);
with zaved_data[High(zaved_data)] do
begin
kod:=tmp[0];
adress:=tmp[1];
proezd:=StrToMemo(tmp[2]);
director:=tmp[3];
tel1:=tmp[4];
tel2:=tmp[5];
url:=tmp[6];
end;
Крайне неудобно, когда массивов 6-8 штук и на каждый писать по 2 процедуры...
Access Violation (2004-09-03 16:29:00) [1]>Cherepah © (02.09.04 12:18) [9]
массив динамический - зделай setlength. усё будет работать.
Erik1 (2004-09-03 15:29:00) [2]Если даже после Close незакрывает, то это серезный баг. Попробуй VK DBF там такой ерунды быть недолжно. Сам использовал HALCN для многопоточной записи и все работало нормально, конечно писалось в обном потоке я сам синхнонизировал.
Black-Grin (2004-09-03 13:48:00) [3]mreo_o1=record
kodo:string[30];
prot_cr:string[30];
gr_num:string[30];
id:string[30];
categor:string[30];
familiya:string[30];
imja:string[30];
otchest:string[30];
birthday:string[30];
mest_rozhd,mestrab,pasport,kodreg,oblast,gorod,rayon,ulica,nomerdoma,nomerkorp,kvartira,datamed,nummed, kodmed, katspr, sroksprav,ogrspr, ocenka1,ocenka2,ocenka3, num_svidet, date_svid, pro1,pro2,pro3:string[30];
end;
assignfile(d,'ss.ss');
rewrite(d,1);
BlockWrite(d, mreo1o[Low(mreo1o)], Length(mreo1o)*SizeOf(mreo_o1));
closefile(d);
У меня тоже не работает - создаёт просто пустой файл ;(
ПРикол весь в том, что я использу tdbf, и чтоб подкоректировать таблицу - заменить нужные символы мне пришлось вынести tdbf в отдельную программу, так-как он не закрывает файл после доступа к ней до закрытия приложения, и я не могу сделать ресет этому файлу ;( Дык вот теперь хочу масивы с инфой загнать в то приложение и не получается ;(
GuAV (2004-09-02 15:07:00) [4]
>
> Указал длину строк - перестал даже в файл записывать...
??
Должен работать так
> TNewZaved_data = record
> kod : string[3];
> adress : string[20];
> proezd : string[20];
> director: string[20];
> tel1 : string[10];
> tel2 : string[10];
> url : string[100];
> end;
BlockWrite(F, MyArray[Low(MyArray)], Length(MyArray)*SizeOf(TNewZaved_data));
Erik1 (2004-09-02 14:48:00) [5]Вроде "VK DBF v.1.0.6" самое лучшее.
Erik1 (2004-09-02 14:28:00) [6]Ты когданибудь заглядывал на www.torry.net там есть и другие движки для баз данных, кроме BDE. Например "TDbf dBase Access v.6.20" хотя я использовал HALCN660. Загляни очень полезно будет.
Cherepah (2004-09-02 13:29:00) [7]
> GuAV © (02.09.04 12:51) [11]
Указал длину строк - перестал даже в файл записывать...
GuAV (2004-09-02 12:51:00) [8]
> ... acess violation at ...
Да, это сохраняет содержимое записи, а string - указатель,
вот за что боролись, на то и напоролись. Т.к.
> В вопросе фигурирует тип string
Это будет работать
> если определишься с макс. длинной строк записи
KSergey (2004-09-02 12:26:00) [9]> [9] Cherepah © (02.09.04 12:18)
> > Erik1 (02.09.04 11:36) [8]
> Не хочется использовать БДЕ...
Разве в [8] было про БДЕ???
Cherepah (2004-09-02 12:18:00) [10]
> Erik1 (02.09.04 11:36) [8]
Не хочется использовать БДЕ...
> GuAV © (01.09.04 22:55) [5]
То есть получается так?
Zaved_data, ttt2: array of TZaved_data; //TMyRecord
Var
f : file;
begin
assignfile(f,'data\test.ttt');
rewrite(f,1);
blockwrite(f,Zaved_data,sizeof(TZaved_data)*high(Zaved_data));
closefile(f);
end;
_____________________
Var
f : file;
begin
assignfile(f,'data\test.ttt');
reset(f,1);
blockread(f,ttt2,filesize(f));
closefile(f);
end;
... acess violation at ...
Erik1 (2004-09-02 11:36:00) [11]To Cherepah
Мне вобще кажется, что тебе надо использовать элементарную базу данных. Хотябы плоские DBF файлы. Скачай прямой драйвер с DBF и жизнь твоя станет легче. Только подумай поиск уже реализован, сортировка по индексу тоже есть. Даже в гриде записи показывать можно.
Sapersky (2004-09-02 11:09:00) [12]Если в записях будут только строки, можно с массивом записей работать как с массивом строк.
Ну например:
Var len : Integer;
pst : PAnsiString;
f : TextFile;
len:=Length(Zaved_data) * SizeOf(TZaved_data) div 4;
If len>0 then begin
AssignFile(f,'aaa.txt'); ReWrite(f);
pst:=@Zaved_data[0].Kod;
for n:=0 to len-1 do begin
WriteLn(f, pst^); Inc(pst);
end;
CloseFile(f);
end;
KSergey (2004-09-02 07:50:00) [13]> [5] GuAV © (01.09.04 22:55)
В вопросе фигурирует тип string
GuAV (2004-09-01 22:55:00) [14]
> Подскажите пожалуйста, можно ли создать универсальную процедуру
> сохранения в файл (или чтения из него) массивов Record?
Уже написана, BlockRead зовётся, в качестве буфера - первый элемент, в качестве размера - SizeOf(TMyRecord)*(кол-во -эл-тов)
KilkennyCat (2004-09-01 21:24:00) [15]
> Семен Сорокин © (01.09.04 18:25) [3]
гм, забыл однако, про длину записи :)
Семен Сорокин (2004-09-01 18:25:00) [16]type
TZaved_data = record
kod, adress, proezd, director,tel1,tel2,url : string;
end;
type
TOther = record
kod, naimenovanie : string;
end;
если определишься с макс. длинной строк записи, то можешь сохранять в типизированный файл, например:
type
TNewZaved_data = record
kod : string[3];
adress : string[20];
proezd : string[20];
director: string[20];
tel1 : string[10];
tel2 : string[10];
url : string[100];
end;
var
f : file of TNewZaved_data;
a : TNewZaved_data;
begin
...
read(f,a);
...
end;
иначе тебе для каждой строки придется отдельно сохранять размер (кол-во символов).
Cherepah (2004-09-01 16:33:00) [17]Ошибки:
Type 'TOther' needs finalization - not allowed in file type
Incompatible types: 'TOther' and 'String'
KilkennyCat (2004-09-01 16:24:00) [18]Var
f : file of TOher;
a : TOher;
begin
...
read(f,a);
...
end;