Показать сообщение отдельно
  #14  
Старый 30.08.2011, 07:49
royun royun вне форума
Прохожий
 
Регистрация: 19.08.2011
Сообщения: 28
Репутация: 10
По умолчанию

Вот что получилось.

Код:
type
  AMA = packed record
  RecId : Byte;  //Идентификатор записи
  LenRec : Word; //Длина записи
  Flags : array[1..3] of Byte; //Флажки
  SeqAndStat : Byte; //Посл-сть записи Статус оплаты
  LenLacAndOwnId : Byte; //Длина LAC и ID владельца
  {DnA : TStream; - Проблема в том что не умею работать с потоками: как использовать поток затем вывести данные}
  DnA : array[1..5] of Byte; //Переменная часть - Номер абонента А - значение массива просто подобрал
                                     //исп. hexviewer
                             //Если просто пишу DnA : array of Byte; то выходит ошибка, где говорится о том
                             //что требуется финализация переменной  f: file of AMA;
                             //Значение переменного массива рассчитывается как DnA : array[1..i] of Byte
                             //где i = div [(LenLacAndOwnId+1)/2]
  //Описание Пакета № 100
  Np100 : Byte; //Номер пакета
  Date : array[1..3] of Byte; //Дата
  Time : array[1..3] of Byte; //Время
  Flags100 : Byte; //Флажки Пакета № 100
  Prod : array[1..3] of byte;//Прод-сть
  //Описание Пакета № 101
  Np101 : Byte; //Номер пакета
  LenDnB : Byte; //Длина номера абонента Б
  {DnB : TStream; - Проблема в том что не умею работать с потоками: как использовать поток затем вывести данные}
  DnB : array[1..1] of Byte;  //Переменная часть - Номер абонента Б - значение массива просто
                                      // подобрал исп. hexviewer
                              //Если просто пишу DnA : array of Byte; то выходит ошибка, где говорится о том
                             //что требуется финализация переменной  f: file of AMA;
                             //Значение переменного массива рассчитывается как DnB : array[1..j] of Byte
                             //где j = div [(LenDnB+1)/2]
  //Описание Пакета № 130
  Np130 : Byte; //Номер пакета
  LenP : Byte; //Длина пакета
  Zp : Word; //Значение причины
  RezAndOpr : byte; //Резерв и определение
  //Описание Пакета № 103
  Np103 : Byte; //Номер пакета
  TeTv : array[1..3] of byte; // Тарифные единицы для тарификации вызова
 
  end;
    TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    OpenDialog: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  f: file of AMA;
  open : Topendialog;
  Rec : AMA;
  Buffer : array [0..8191] of byte;
  NumRecsRead,t : integer;
begin
  memo1.Clear;
  open := TOpenDialog.Create(self);
  open.InitialDir := 'C:\000';
  open.Options := [ofFileMustExist];
  open.Filter :=  'ama files|*.*';
  open.Execute;
  AssignFile(f,open.FileName);
  {$I-}
  Reset(f);
  {$I+}
  seek(f,0);
  {while not eof(f) do
  begin}
  Read(f,Rec);
  memo1.Lines.Add(inttostr(Rec.RecId) + ' - ИДЕНТИФИКАТОР ЗАПИСИ');
  memo1.Lines.Add(inttostr(Rec.LenRec) + ' - ДЛИНА ЗАПИСИ');
  memo1.Lines.Add(inttostr(Rec.Flags[1]) + ' - Флажок F12');
  memo1.Lines.Add(inttostr(Rec.Flags[2]) + ' - Флажок F12');
  memo1.Lines.Add(inttostr(Rec.Flags[3]) + ' - Флажок F12');
  memo1.Lines.Add(inttostr(Rec.SeqAndStat) + ' - Посл-сть записи и статус оплаты');
  memo1.Lines.Add(inttostr(Rec.LenLacAndOwnId) + ' - Длина LAC и ID владельца');
  memo1.Lines.Add(inttohex(Rec.DnA[1],1) + inttohex(Rec.DnA[2],1) + inttohex(Rec.DnA[3],1) + inttohex(Rec.DnA[4],1) + inttohex(Rec.DnA[5],1) + ' - Номер абонента А');
  //Выводим пакет № 100
  memo1.Lines.Add(inttostr(Rec.Np100) + ' - Номер пакета');
  memo1.Lines.Add(inttohex(Rec.Date[3],1) +'.'+ inttohex(Rec.Date[2],1) +'.'+ inttohex(Rec.Date[1],1) + ' - Дата');
  memo1.Lines.Add(inttostr(Rec.Time[1]) +':'+ inttostr(Rec.Time[2]) +':'+ inttostr(Rec.Time[3]) + ' - Время');
  memo1.Lines.Add(inttohex(Rec.Prod[3],1) +':'+ inttohex(Rec.Prod[2],1) +':'+ inttohex(Rec.Prod[1],1) + ' - Продолжительность');
  //Выводим пакет № 101
  memo1.Lines.Add(inttostr(Rec.Np101) + ' - Номер пакета');
  memo1.Lines.Add(inttostr(Rec.LenDnB) + ' - Длина номера абонента Б');
  memo1.Lines.Add(inttostr(Rec.DnB[1]) + ' - Номера абонента Б');
  //Выводим пакет № 130
  memo1.Lines.Add(inttostr(Rec.Np130) + ' - Номер пакета');
  memo1.Lines.Add(inttostr(Rec.LenP) + ' - Длина пакета');
  memo1.Lines.Add(inttostr(Rec.Zp) + ' - Причина');
  memo1.Lines.Add(inttostr(Rec.RezAndOpr) + ' - Резерв и определение');  
 
  {end;}
  CloseFile(f);
  end;]

Как обойти ошибку которая требует финализации переменной f: file of AMA или дайте ссылочку где можно почитать про работу с потоками.
Ответить с цитированием