Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];

Вниз

Сохранение массива Record в файл   Найти похожие ветки 

 
Cherepah ©   (2004-09-01 16:18) [0]

Подскажите пожалуйста, можно ли создать универсальную процедуру сохранения в файл (или чтения из него) массивов 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 процедуры...


 
KilkennyCat ©   (2004-09-01 16:24) [1]

Var
 f : file of TOher;
 a : TOher;
begin
 ...
 read(f,a);
 ...
end;


 
Cherepah ©   (2004-09-01 16:33) [2]

Ошибки:
Type "TOther" needs finalization - not allowed in file type
Incompatible types: "TOther" and "String"


 
Семен Сорокин ©   (2004-09-01 18:25) [3]

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;


иначе тебе для каждой строки придется отдельно сохранять размер (кол-во символов).


 
KilkennyCat ©   (2004-09-01 21:24) [4]


> Семен Сорокин ©   (01.09.04 18:25) [3]

гм, забыл однако, про длину записи :)


 
GuAV ©   (2004-09-01 22:55) [5]


> Подскажите пожалуйста, можно ли создать универсальную процедуру
> сохранения в файл (или чтения из него) массивов Record?

Уже написана, BlockRead зовётся, в качестве буфера - первый элемент, в качестве размера - SizeOf(TMyRecord)*(кол-во -эл-тов)


 
KSergey ©   (2004-09-02 07:50) [6]

>  [5] GuAV ©   (01.09.04 22:55)

В вопросе фигурирует тип string


 
Sapersky   (2004-09-02 11:09) [7]

Если в записях будут только строки, можно с массивом записей работать как с массивом строк.

Ну например:

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;


 
Erik1   (2004-09-02 11:36) [8]

To Cherepah
Мне вобще кажется, что тебе надо использовать элементарную базу данных. Хотябы плоские DBF файлы. Скачай прямой драйвер с DBF и жизнь твоя станет легче. Только подумай поиск уже реализован, сортировка по индексу тоже есть. Даже в гриде записи показывать можно.


 
Cherepah ©   (2004-09-02 12:18) [9]


> 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 ...


 
KSergey ©   (2004-09-02 12:26) [10]

> [9] Cherepah ©   (02.09.04 12:18)
> > Erik1   (02.09.04 11:36) [8]
> Не хочется использовать БДЕ...

Разве в [8] было про БДЕ???


 
GuAV ©   (2004-09-02 12:51) [11]


> ... acess violation at ...

Да, это сохраняет содержимое записи, а string - указатель,
вот за что боролись, на то и напоролись. Т.к.

> В вопросе фигурирует тип string


Это будет работать

> если определишься с макс. длинной строк записи


 
Cherepah ©   (2004-09-02 13:29) [12]


> GuAV ©   (02.09.04 12:51) [11]

Указал длину строк - перестал даже в файл записывать...


 
Erik1   (2004-09-02 14:28) [13]

Ты когданибудь заглядывал на www.torry.net там есть и другие движки для баз данных, кроме BDE. Например "TDbf dBase Access v.6.20" хотя я использовал HALCN660. Загляни очень полезно будет.


 
Erik1   (2004-09-02 14:48) [14]

Вроде "VK DBF v.1.0.6" самое лучшее.


 
GuAV ©   (2004-09-02 15:07) [15]


>
> Указал длину строк - перестал даже в файл записывать...

??

Должен работать так

>  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));


 
Black-Grin ©   (2004-09-03 13:48) [16]

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 в отдельную программу, так-как он не закрывает файл после доступа к ней до закрытия приложения, и я не могу сделать ресет этому файлу ;(  Дык вот теперь хочу масивы с инфой загнать в то приложение и не получается ;(


 
Erik1   (2004-09-03 15:29) [17]

Если даже после Close незакрывает, то это серезный баг. Попробуй VK DBF там такой ерунды быть недолжно. Сам использовал HALCN для многопоточной записи и все работало нормально, конечно писалось в обном потоке я сам синхнонизировал.


 
Access Violation   (2004-09-03 16:29) [18]

>Cherepah ©   (02.09.04 12:18) [9]
массив динамический - зделай setlength. усё будет работать.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.418 c
4-1091905005
RyDmi
2004-08-07 22:56
2004.09.19
Скрытие процесса в Win98?


4-1091449532
CAMCOH
2004-08-02 16:25
2004.09.19
Ошибка при создании сервиса


4-1091110061
kblc
2004-07-29 18:07
2004.09.19
Как для TRichEdit организовать прозрачность?


14-1093525768
Копир
2004-08-26 17:09
2004.09.19
H E L P. Damned Javaw !


4-1091730200
Toxic
2004-08-05 22:23
2004.09.19
lpfnWndProc := ???





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский