program Crear;
uses SysUtils;
type
THeader = record
Serial: Word; //2 bytes
Filename: String[255]; //1 byte
Date: Word; //2 bytes
Fieldnrs: Word; //2 bytes
NrsRecords: Word; //2 bytes
end;
TFields = record
Fieldnr: Word; //2 bytes
Fieldname: ShortString; //1 byte
end;
TRecordField = record
FullField: Word;
Fieldnr: Word; //2 bytes
FieldText: String[255]; //1 byte
end;
var
BinaryStream: File;
Header: THeader; //Header.Serial Filename Date Fieldnrs NrsRecords
Fields: array [0..20] of TFields; //Fields.Fieldnr Fields.Fieldname
Rec: array[0..20] of TRecordField; //Rec.Fieldnr Rec.FieldText
nrs: Integer; //2 bytes
I,N,J,C,NR,Camp: Integer;
procedure myWrite (var Buffer; Size: Integer);
begin
BlockWrite(BinaryStream, Buffer, Size);
end;
procedure myWriteWord (var W:Word);
begin
W := Swap(W);
myWrite(W,2);
end;
procedure myWriteString (var S:ShortString);
var
Len: Byte;
begin
Len := Length(S);
myWrite (Len,1);
myWrite (S[1], Len);
end;
function encode_date : Word;
var
Year,Month,Day,y_offset: Word;
begin
DeCodeDate (Date,Year,Month,Day);
if Year > 2000 then begin
y_offset := year - 2000;
end else begin
y_offset := 2099 - year;
end;
result := y_offset shl 9;
result := result + Month shl 5;
result := result + Day
end;
begin
assign(BinaryStream, 'C:\Dev-Pas\EXAMEN333.dat');
rewrite(BinaryStream, 1);
Writeln ('Ingrese Serial:'); //serial
ReadLn (Header.Serial);
myWriteWord (Header.Serial);
Writeln ('Ingrese Nombre Archivo:'); //path
ReadLn (Header.Filename);
myWriteString (Header.Filename);
//fecha
Header.Date := encode_date;
myWriteWord (Header.Date);
Writeln ('Ingrese Cantidad de Campos Customizados:'); //campos custom
ReadLn (Header.Fieldnrs);
N:=Header.Fieldnrs;
myWriteWord (Header.Fieldnrs);
for nrs := 1 to N do //codigo 1,2,3,4
begin
Fields[nrs].Fieldnr := nrs;
myWriteWord (Fields[nrs].Fieldnr); //nombre,tel,dir,email
Writeln ('Ingrese Nombre de dato numero:', nrs);
ReadLn (Fields[nrs].Fieldname);
myWriteString (Fields[nrs].Fieldname);
end;
Writeln ('Ingrese la cantidad de registros:'); //cantidad de registros
ReadLn (Header.NrsRecords);
NR:=Header.NrsRecords;
myWriteWord (Header.NrsRecords);
Writeln ('Ingrese los ',NR,' contactos'); //datos contactos concretos
for J := 1 to NR do
begin
for I := 1 to N do
begin
Writeln ('Ingrese:', Fields[I].Fieldname);
ReadLn (Rec[I].FieldText);
if Length (Rec[I].FieldText) <> 0 then begin
Camp:=(Camp+1);
end;
end;
Rec[J].FullField := Camp;
myWriteWord ( Rec[J].FullField );
for C := 1 to Camp do
begin
myWriteString ( Rec[C].FieldText );
end;
Camp := 0 ;
end;
close (BinaryStream);
end.