Новичок
Профиль
Группа: Участник
Сообщений: 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 Подскажите, что я делаю не так?
|