Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки в TurboVision, проблема с записью/чтением потока 
:(
    Опции темы
schnappi
Дата 26.11.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 26.11.2010
Где: Омск

Репутация: нет
Всего: нет



добрый день! возникла проблема с использованием потоков Turbo Vision.

Код

uses app,Objects,Views,Drivers,Menus,MsgBox,TextView,Dialogs;



type TMyApp = object(TApplication)
     AutomList: PCollection;
     constructor Init;
     destructor done; virtual;
     procedure InitStatusLine; virtual;
     procedure InitMenuBar; virtual;
     procedure PrintClientList;
     procedure InsertClient;
     procedure SearchItem;
     procedure NewWindow; virtual;
     procedure HandleEvent(var Event:TEvent); virtual;
end;


type
 PAutom = ^TAutom;
 TAutom = object(TObject)
  Marka,Model,AssemblingCountry,Saloon,MaxSpeed: PString;
  Constructor Init(Mar,Mdl,AsmCnt,Sln,MSpd: String);
  destructor Done; virtual;
  constructor Load(S:TDosStream);
  procedure Store(S:TDosStream);
 end;

type
 PDemoWindow = ^TDemoWindow;
 TDemoWindow = object(TWindow)
 constructor Init(Bounds: TRect; WinTitle: String; WindowNo: integer);
end;

 PInterior = ^TInterior;
 TInterior = object(TScroller)
  constructor Init(var Bounds: TRect; HS, VS: PScrollBar);
  procedure Draw; virtual;
  procedure HandleEvent(var Event: TEvent); virtual;
 end;

 PMyWindow = ^TMyWindow;
 TMyWindow = object(TWindow)
  Term: PTerminal;
  Buff: text;
  constructor Init (Bounds: TRect; WinTitle: String; WindowNo: integer);
 end;

 PDialVvod = ^TDialVvod;
 TDialVvod = object(TDialog)
  constructor Init(var Bounds: TRect; WinTitle: string);
 end;

 PDialSearch = ^TDialSearch;
 TDialSearch = object(TDialog)
  constructor Init(var Bounds: TRect; WinTitle: string);
 end;

 DataRec = record
  Marka,Model,Strana,Kuzov,MSpeed: string[128];
 end;

 DataSearch = record
  VvItem: string[128];
 end;

const cmNewWin = 100;
      cmPrCl = 101;
      cmInsCl = 102;
      cmSrch = 103;

      RAutom: TStreamRec =(
      ObjType: 21111;
      VmtLink: Ofs(TypeOf(TAutom)^);
      Load: @TAutom.Load;
      Store: @TAutom.Store);

var MyApp: TMyApp;
    Data: DataRec;
    DSearch: DataSearch;
    SaveFile: TDosStream;

constructor TMyApp.Init;
var f:text;
begin
 Inherited Init;
 assign(f,'autlog.txt');
 rewrite(f);
 SaveFile.Init('AUTOM.RES',stOpenRead);
 AutomList := PCollection(SaveFile.Get);
 SaveFile.Done;
 if SaveFile.Status <> 0 then
  begin
   writeln(f,SaveFile.Status);
   SaveFile.Init('AUTOM.RES',stCreate);
   SaveFile.Done;
  end;
  system.close(f);
 MessageBox('System Automobile'#13+'for work',nil,mfOkButton);
 AutomList := new(PCollection,Init(10,5));
{ AutomList^.Insert(New(PAutom,Init('Lada','Priora','RF','Sedan','200')));}
end;

destructor TMyApp.Done;

begin
 SaveFile.Init('AUTOM.RES',stOpenWrite);
 if SaveFile.Status <> 0 then
  MessageBox('Error opening AUTOM.RES',nil,mfOkButton);
 SaveFile.Put(AutomList);
 SaveFile.Done;
 inherited done;
end;

Constructor TAutom.Init(Mar,Mdl,AsmCnt,Sln,MSpd: String);

begin
     Marka := NewStr(Mar);
     Model := NewStr(Mdl);
     AssemblingCountry :=NewStr(AsmCnt);
     Saloon := NewStr(Sln);
     MaxSpeed := NewStr(MSpd);
end;


destructor TAutom.Done;
begin
 dispose(Marka);
 dispose(Model);
 dispose(AssemblingCountry);
 dispose(Saloon);
 dispose(MaxSpeed);
end;

constructor TDialSearch.Init(var Bounds: TRect; WinTitle: string);

var R: TRect;
    B: PView;

begin
 inherited init(Bounds,WinTitle);
 R.Assign(3,2,10,3);
 Insert(New(PLabel,Init(R,'Model',B)));
 R.Assign(13,2,37,3);
 B := New(PInputLine,Init(R,128));
 Insert(B);
 R.Assign(3,4,13,6);
 Insert(New(PButton,Init(R,'OK',cmOk,bfDefault)));
 SelectNext(False);
end;

constructor TDialVvod.Init(var Bounds: TRect; WinTitle: string);

var R: TRect;
    B: PView;

begin
 inherited Init(Bounds,WinTitle);
 R.Assign(3,2,10,3);
 Insert(new(Plabel,Init(R,'Marka',B)));
 R.Assign(13,2,37,3);
 B := New(PInputLine,Init(R,128));
 Insert(B);

 R.Assign(3,4,18,5);
 Insert(new(PLabel,Init(R,'Model',B)));
 R.Assign(13,4,37,5);
 B := New(PInputLine,Init(R,128));
 Insert(B);

 R.Assign(3,6,10,7);
 Insert(new(PLabel,init(R,'Strana',B)));
 R.Assign(13,6,37,7);
 B := New(PInputLine,Init(R,128));
 Insert(B);

 R.Assign(3,8,10,9);
 Insert(new(PLabel,Init(R,'Kuzov',B)));
 R.Assign(13,8,37,9);
 B := New(PInputLine,Init(R,128));
 Insert(B);

 R.Assign(3,10,10,11);
 Insert(new(PLabel,init(R,'Max.speed',B)));
 R.Assign(13,10,37,11);
 B:= new(PInputLine,Init(R,128));
 insert(B);

 R.Assign(3,13,18,15);
 insert(new(PButton, init(R,'OK',cmOk, bfDefault)));
 SelectNext(False);
end;

constructor TMyWindow.Init(Bounds: TRect; WinTitle: string; WindowNo: integer);

var f: text;
    s: string;

begin
 TWindow.Init(Bounds,WinTitle,WindowNo);
 GetExtent(Bounds);
 Bounds.Grow(-1,-1);
 New(Term,Init(Bounds,StandardScrollBar(sbVertical+sbHandleKeyboard),StandardScrollBar(sbHorizontal+sbHandleKeyboard),50000));
 assign(f,'autom.txt');
 AssignDevice(Buff,Term);
 Insert(Term);
 reset(f);
 rewrite(buff);
 while not eof(f) do
  begin
   readln(f,s);
   writeln(buff,s);
  end;
 system.close(f);
end;


procedure TMyApp.InitStatusLine;

var R:TRect;

begin
     R.Assign(0,24,80,25);
     StatusLine := new(PStatusLine,Init(R,NewStatusDef(0,$FFFF,
                NewStatusKey('~F1~Help',kbF1,cmHelp,
                NewStatusKey('~F10~Menu',kbF10,cmMenu,
                NewStatusKey('~Alt-X~Exit',kbAltX,cmQuit,
                nil))),
     nil)));
end;


procedure TMyApp.InitMenuBar;

var R: TRect;

begin
 R.Assign(0,0,80,1);
 MenuBar := New(PMenuBar,Init(R,NewMenu(
  NewSubMenu('File',hcNoContext,NewMenu(
   NewItem('Open','F3',KbF3,cmNewWin,hcNoContext,
   NewItem('Close','Alt-F3',kbAltF3,cmClose,hcNoContext,
   NewItem('Print List','Alt-P',KbAltP,cmPrCl,hcNoContext,
   NewItem('Insert Client','Alt-I',kbAltI,cmInsCl,hcNoContext,
   NewItem('Search Item','Alt-S',kbAltS,cmSrch,hcNoContext,
   NewItem('E~x~it','Alt-X',KbAltX,cmQuit,hcNoContext,
   nil))))))),
  NewSubMenu('Windows',hcNoCOntext,NewMenu(
   NewItem('New','F2',KbF2,cmNewWin,hcNoContext,
   NewItem('Next','F6',KbF6,cmNext,hcNoContext,
   NewItem('Previous','Shift-F6',KbShiftF6,cmPrev,hcNoContext,
   nil)))),
  nil))
 )));
end;



procedure TMyApp.NewWindow;

var R:TRect;
    WinCount: Integer;
    Window: PDemoWindow;

begin
 inc(WinCount);
 R.Assign(5,5,70,15);
 Window := New(PDemoWindow, Init(R,'Window',WinCount));
 DeskTop^.Insert(Window);
end;


procedure TMyApp.HandleEvent;

begin
 inherited HandleEvent(Event);
 if Event.What=evCommand then
  begin
   case Event.Command of
    cmNewWin: NewWindow;
    cmPrCl: PrintClientList;
    cmInsCl: InsertClient;
    cmSrch: SearchItem;
   end;
  end;
end;

procedure TMyApp.InsertClient;

var R: TRect;
    DialWindow: PDialVvod;
    control: word;

begin
 R.Assign(0,1,40,17);
 DialWindow := New(PDialVvod,Init(R,'Insert rec'));
 DialWindow^.SetData(Data);
 control := DeskTop^.ExecView(DialWindow);
 if Control <> cmCancel then
  DialWindow^.GetData(Data);
 if control = cmOK then
  AutomList^.Insert(new(PAutom,Init(Data.Marka,Data.Model,Data.Strana,Data.Kuzov,Data.MSpeed)));
end;

procedure TMyApp.PrintClientList;

var R: TRect;
    Window: PMyWindow;
    f: text;

    procedure PrintClient(P: PAutom); far;
    begin
     with P^ do
      writeln(f,Marka^+' '+Model^+' '+AssemblingCountry^+' '+Saloon^+' '+MaxSpeed^);
    end;

begin
 assign(f,'autom.txt');
 rewrite(f);
 AutomList^.ForEach(@PrintClient);
 close(f);

 R.Assign(0,1,80,22);
 Window := New(PMyWindow,Init(R,'List',WnNoNumber));
 DeskTop^.Insert(Window);

end;

procedure TMyApp.SearchItem;

var R: TRect;
    DialWindow: PDialSearch;
    control: word;
    FoundAutom: PAutom;
    s: string;

    function NameMatch(Autom: PAutom):boolean; far;
     begin
      NameMatch := pos(DSearch.VvItem,Autom^.Model^)<>0;
     end;

begin
 R.Assign(0,1,40,8);
 DialWindow := New(PDialSearch,Init(R,'Search record'));
 DialWindow^.SetData(DSearch);
 control := DeskTop^.ExecView(DialWindow);
 if control <> cmCancel then
  DialWindow^.GetData(DSearch);
 FoundAutom := AutomList^.FirstThat(@NameMatch);
 if FoundAutom = nil then
    MessageBox('No matches found',nil,mfOkButton)
 else
  begin
   with FoundAutom^ do
    s := Marka^+ ' ' +Model^+ ' ' +AssemblingCountry^+ ' ' +Saloon^+ ' ' +MaxSpeed^;
   MessageBox('Found '+s,nil,mfOkButton);
  end;
end;


{====================}

constructor TDemoWindow.Init(Bounds: TRect; WinTitle: String; WindowNo: integer);

var s: string[3];
    interior: PInterior;
    HS, VS: PScrollBar;

begin
 str(WindowNo,s);
 TWindow.Init(Bounds, WinTitle+' '+s,wnNoNumber);
 GetClipRect(Bounds);
 Bounds.Grow(-1,-1);
 VS := StandardScrollBar(sbVertical+sbHandleKeyBoard);
 HS := StandardScrollBar(sbHorizontal+sbHandleKeyBoard);
 Interior := new(PInterior, Init(Bounds, HS, VS));
 Insert(Interior);
end;

{=====================}

constructor TInterior.Init(var Bounds: TRect; HS, VS: PScrollBar);
begin
 TScroller.Init(Bounds, HS, VS);
 GrowMode := gfGrowHiX+gfGrowHiY;
end;

procedure TInterior.Draw;
begin
 TScroller.Draw;
 WriteStr(0,0,'Text in window',1);
 TScroller.ShowCursor;
end;

procedure TInterior.HandleEvent(var Event: TEvent);
begin
end;

constructor TAutom.Load(S:TDosStream);

begin
 Marka := S.ReadStr;
 Model := S.ReadStr;
 AssemblingCountry := S.ReadStr;
 Saloon := S.ReadStr;
 MaxSpeed := S.ReadStr;
end;

procedure TAutom.Store(S:TDosStream);

begin
 S.WriteStr(Marka);
 S.WriteStr(Model);
 S.WriteStr(AssemblingCountry);
 S.WriteStr(Saloon);
 s.WriteStr(MaxSpeed);
end;

{=====================}


begin
     RegisterType(RAutom);
     MyApp.Init;
     MyApp.Run;
     MyApp.Done;
end.


Суть проблемы в том, что при отсутствующем файле AUTOM.RES он создается, и в течение сеанса работы приложения все в порядке - записывается и считывается. Но при повторном запуске в окне PrintClient виден хлам, записавшийся в файл из памяти. Либо при инициализации приложения SaveFile.Status принимает значение -3 (чтение за концом потока), соответственно, существующий файл AUTOM.RES создается заново, и инициализируется пустая коллекция.

Также не работает запись коллекции в файл AUTOM.RES

Подскажите, что я делаю не так?
PM MAIL ICQ Skype Jabber   Вверх
volvo877
Дата 30.11.2010, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



А ты не обратил внимание, что у тебя при записи в AUTOM.RES (в деструкторе TMyApp) SaveFile.Status принимает значение -6, что означает "Put of unregistered object type"? По крайней мере, у меня твоя программа ведет себя именно так.

Что я бы сделал: вынес бы поля Marka, Model, AssemblingCountry, Saloon, MaxSpeed как строки (а не как указатели на них) в отдельную запись AutoRec, а в объекте TAutom оставил бы только:
Код
type
   PAutom = ^TAutom;
   TAutom = object(TObject)
   TranferRecord: AutoRec;

   constructor Load(var S:TStream);
   procedure Store(var S:TStream);
end;

, и дальше работал бы прямо с TransferRecord.
(кстати, почему ты убрал Var-параметры, и тем более, почему ограничил эти методы только работой с TDosBuffer - непонятно совершенно, в принципе они должны уметь работать с любым потоком). Ну, в общем, в TutTypes.pas из папки TP70\EXAMPLES\DOCDEMOS лежит прекрасный работающий пример, посмотри, как он написан...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.