Ukládání poloek typu odkaz na objekt
Obsahuje-li objekt poloke, která je odkazem na nějaké subview, nelze ji ukládat běným způsobem. Musíme pouít speciální
metodu TGroup.GetSubViewPtr, TGroup.PutSubViewPtr
constuctor nasednik.load(var S:TStream);
begin
...
GetSubViewPrt(S,ukazatel);
end;
Procedure naslednik.store(var S:TStream);
begin
...
PutSubViewPtr(S,ukazatel);
End;
Příklad pouití streamu ( TV5.pas)
*** Nefunguje, jsou zde chyby, ktere zatim nevím jak opravit... ***
V příkladu pouijeme stream pro uloení databáze výrobků. Kadý výrobek bude popsán svým názvem a cenou.
Pro uchování těchto intormací je zavedena nová třída objektů TPart
uses app, views, objects, menus, drivers, dialogs;
const cmSesNab=100;
cmUkNab=101;
cmZrnab=102;
cmIMonitory=103;
cmIDisky=104;
cmIKlavesnice=105;
cmOMonitory=106;
cmOdisky=107;
cmOKlavesnice=108;
cmMore=111;
cmOprav=112;
cmDelete=113;
type PVstupDialog=^TVstupDialog;
TVstupDialog=Object(TDialog)
PracFile:PbufStream;
Pol:array [1..7,1..2] of PinputLine;
constructor init(var Bounds:TRect;ATitle:TTitleStr);
destructor done;virtual;
procedure handleEvent(var event:Tevent);virtual;
End;
TVstupDialogRec=record
IL:Array [1..7] of
record
Na:String[50];
Ce:String[8];
end;
end;
pDealer=^Tdealer;
tdealer=object(Tapplication)
procedure initMenuBar;virtual;
procedure initStatusLine;virtual;
procedure HandleEvent(var event:TEvent);virtual;
procedure SestavNabidku;
Procedure UkazNabidku;
Procedure ZrusNabidku;
procedure Vstup(ceho:string);
procedure vystup(ceho:string);
constructor init;
end;
PPart=^TPart;
Tpart=object(TObject)
Price:real;
Name:string[50];
constructor init(Aname:string;Aprice:real);
constructor load(var s:tstream);
procedure store(var s:tstream);virtual;
procedure setname(aname:string);
procedure setPrice(aprice:real);
function getprice:real;
function getname:string;
function getString:string;
end;
Const NVstupDialogRec:TvstupDialogRec=(
IL:((Na:'';Ce:''),(Na:'';Ce:''),(Na:'';Ce:''),
(Na:'';Ce:''),(Na:'';Ce:''),(Na:'';Ce:''),
(Na:'';Ce:''))
);
Rpart:tstreamRec=(
objtype:100;
vmtLink:ofs(typeOf(Tpart)^);
load:@Tpart.load;
Store:@Tpart.store);
sizeOfTpart=56;
Constructor Tdealer.init;
begin
TApplication.init;
registerType(RPart);
end;
procedure tDealer.initMenuBar;
var r:tRect;
begin
getExtent(r);
r.b.y:=r.a.y+1;
menubar:=new(pMENUbar, init(r, newmenu(
NEWSUBmenu('~N~abidka',hcNOcontext,NEWMENU(
newItem('~S~estav','',0,cmsesnab, hcNocontext,
newItem('~U~kaz','',0,cmuknab, hcNocontext,
newItem('~Z~rus','',0,cmzrnab, hcNocontext,
newLine(
newItem('~K~onec','ALT-X',kbALTX,cmQuit, hcNocontext,
nil)))))
),
newSubMenu('Vstupy',hcNOcontext,newMenu(
newItem('Monitory','',0,cmImonitory, hcNocontext,
newItem('Disky','',0,cmIdisky, hcNocontext,
newItem('Klavesnice','',0,cmIklavesnice, hcNocontext,
nil)))),
newSubMenu('Vystupy',hcNOcontext, newMenu(
newItem('Monitory','',0,cmOmonitory, hcNocontext,
newItem('Disky','',0,cmOdisky, hcNocontext,
newItem('Klavesnice','',0,cmOklavesnice, hcNocontext,
nil)))),
NIL))))
));
end;
Procedure tDealer.initStatusLine;
var r:trect;
begin
getExtent(r);
r.a.y:=r.b.y-1;
statusLine:=new(pStatusLine, Init(r,
newStatusDef(0,$FFFF,
newStatusKey('~ALT-X~ Exit',kbAltX,cmQuit,
newStatusKey('~F1~ Help',kbF1,cmHelp,
newStatusKey('~F2~ Nabidka',kbF2,cmSEsNab,
newStatusKey('~F10~ Menu',kbF10,cmMenu,
nil)))),
nil)
));
end;
Procedure TDealer.HandleEvent(var Event:TEvent);
begin
Tapplication.handleEvent(Event);
case event.command of
cmSesNab :sestavNabidku;
cmUkNab :UkazNabidku;
cmZrNab :ZrusNabidku;
cmImonitory :Vstup('Monitory');
cmIdisky :Vstup('Disky');
cmIKlavesnice :Vstup('Klavesnice');
cmOmonitory :Vystup('Monitory');
cmODisky :Vystup('Disky');
cmOKlavesnice :Vystup('Klavesnice');
else exit;
end;
ClearEvent(event);
end;
Procedure Tdealer.sestavNabidku;
begin
end;
Procedure Tdealer.zrusNabidku;
begin
end;
Procedure Tdealer.ukazNabidku;
begin
end;
Procedure Tdealer.vstup(ceho:string);
var r:TRect;
okno:PVstupDialog;
path:string;
begin
r.assign(5,3,73,18);
okno:=new(PVstupDialog,Init(r,True));
path:=ceho;
if length(path)>8 then
system.delete(path,8,length(path)-8);
path:=concat(path,'.dta');
okno^.natahni(path,ceho);
desktop^.execView(okno);
Dispose(okno,done);
end;
Constructor TVstupDialog.Init(var Bounds:Trect;ATitle:TTitleStr);
Var R:Trect;
i,j:byte;
pom:PButton;
Code,info:integer;
path:string;
BEGIN
TDialog.Init(Bounds, ATitle);
GetExtent(r);
R.Assign(R.A.X+2, R.A.Y+10, R.A.X+17,R.A.Y+12);
pom:=New(PButton, init(R,'~M~ore',cmMore, bfNormal));
Insert(pom);
R.Move(16,0);
pom:=New(PButton, init(R,'~O~k',cmOk, bfNormal));
Insert(pom);
R.Move(16,0);
pom:=New(PButton, init(R,'~C~ancel',cmCancel, bfNormal));
Insert(pom);
GetExtent(R);
Bounds.Copy(R);
R.Assign(R.A.X+2, R.A.Y+8, R.B.X-10, R.A.Y+9);
Bounds.assign(bounds.B.X-9, Bounds.A.Y+8, bounds.B.X-2, Bounds.A.Y+9);
For i:=1 to 7 do
BEGIN
Pol[i,1]:=New(PInputLine,Init(R,50));
Pol[i,2]:=New(PInputLine,Init(Bounds,8));
R.Move(0,-1);
END;
For i:=7 Downto 1 do
BEGIN
Insert(pol[i,1]);
Insert(pol[i,2]);
END;
POL[7,1]^.select;
Insert(New(PLabel,Init(R,' ~N~ázev', Pol[7,1])));
Insert(New(PLabel,Init(Bounds,' ~C~ena', Pol[7,2])));
if length(aTitle>8) then
system.delete(atitle,8,length(atitle)-8);
path:=concat(atitle,'.dta');
pracFile:=new(pBufStream,init(path, stOpen, 512));
with PracFile^ do
if status stOk then
begin
Reset;
init(path, stCreate, 512);
end else seek(getsize);
end;
Destructor TVstupDialog.Done;
var i,j:byte;
Begin
dispose(pracfile, done);
for i:=1 to 6 do
for j:=1 to 2 do
Dispose(pol[i,j],Done);
TDialog.done;
end;
Procedure TVstupDialog.HandleEvent(var Event:TEvent);
Procedure zapis;
var data:TVstupDialogRec;
prac:PPart;
num:real;
code:integer;
begin
data:=NVstupDialogRec;
GetData(Data);
setData(NVstupDialogRec);
i:=1;
with data do
while (i<7) and (il[i].na'') do
begin
val(il[i].ce,num,code);
prac:=new(ppart, init(il[i].na,num));
prac^.store(pracfile^);
dispose(prac,done);
ind(i);
end;
End;
begin
end;
constructor Tpart.init(aname:string;aprice:real);
begin
tobject.init;
name:=aname;
price:=aprice;
end;
function Tpart.getprice:real;
begin
getPrice:=Price;
end;
function TPart.getName:string;
begin
getName:=name;
end;
Procedure TPart.setName(aname:string);
begin
name:=aname;
end;
Procedure Tpart.setPrice(aprice:real);
begin
price:=aPrice;
end;
function tpart.getstring:string;
var a,b:string;
l,hm:byte;
begin
str(price:8:2,A);
b:=getname;
hm:=length(b);
if hm<50 then l:=hm to 49 do b:=concat(b,' ')
else delete(b, 51, hm-50);
getstring:=concat(b,' ',a,'Kcs');
end;
constructor Tpart.load(var s:tstream);
begin
s.read(name,sizeof(name));
s.read(price, sizeOf(price));
end;
Procedure tPart.store(var s:tstream);
begin
s.write(name, sizeOf(name));
s.write(price, sizeOf(price));
end;
function Najdi_select:Boolean;
var i,j:byte;
Begin
i:=1;j:=1;
while (i<7) and not(pol[i,j]^.GetState(sfSelected))
do if j=2 then
begin
j:=1;
inc(i);
end else inc(j);
Najdi_select:=(i<7);
end;
Begin
if (event.what=evBroadCast) and (event.Command=cmDefault) then
begin
if najdi_select then selectNext(false)
else TDialog.handleEvent(Event);
end else
begin
if (event.what=evCommand) then
begin
if (event.command=cmMore) or (event.command=cmOk) then
begin
zapis;
pol[7,1]^.select;
end;
end;
TDialog.HandleEvent(event);
end;
ClearEvent(Event);
end;
Procedure Tdealer.vystup(ceho:string);
begin
end;
VAR a:tdealer;
BEGIN
a.init;
a.run;
a.done;
END.
Pouití některých dalích objektů TV
Máme hotovou část programu, která nám umoní zadávat data jednotlivých výrobků a uchovávat je v přísluných souborech na
disku. Nyní vytvoříme prostředky pro prohlíení těchto dat.
Třída TListBox a TScrollBar
Třída TListViewer, která je předkem třídy TListBox, poskytuje prostředky pro zobrazení a správu obecných zřetězených
seznamů poloek. Zobrazení tohoto seznamu můe být uivatelem řízeno pomocí jednoho nebo dvou skrolovacích sloupků - objektů
třídy TScrollBar.
Nejprve tedy vytvoříme TScrollBar a ukazatel na něj se předá jako parametr konstruktoru objektu TListViewer. Tado dvě vytvořená
view mezi sebou automaticky komunikují. Programátor tedy nemusí volat metody TScrollBarr.SetParams, TScrollBarr.SetValue a dalí, pokud
nechce dosáhnout nějakého speciálního chování.
TListViewer definuje abstraktní metodu GetText, která určuje způsob, kterým budou jednotlivé oploky zobrazovaného
seznamu vypsány na obrazovku. Pro pouitív programu je tato abstraktní metoda přepsána a tak je definován konkrétní postup
vypsání kadé poloky.
TV samotné definují nsledníka TListViewer nazvaného TListBox, která implementuje asi nejobvyklejí typ seznamu, seznam
řetězců. TListBox vypisuje položkyv jednom sloupci a je řízen jedním vertikálním skrolovacím sloupcem.
Jediné co lze v tomto standardnímu typu změnit je metoda GetText.
Vlastní zobrazovaný seznam je představován polokou TListBox.List, která je typu PCollection
Dynamická polymorfní pole - třída TCollection
Třída TCollection a její následníci TSortedCollection a TStringCollection jsou ze skupiny němých objektů.
Nemohou se tedy být zobrazovány na obrazovce, ale jsou implementovány s cílem usnadnit řeení programátorské problematiky.
Dynamická proměnná velikosti pole
Vytvoření objektu TCollection:
constructor TCollection.Init(ALimit,ADelta:integer);
ALimit - pro kolik poloek se má na počátku vyhradit místo
ADelta - o kolik se rozsah zvětí je-li počet poloek překročen
Vkládání poloek:
Procedure TCollection.Insert(Item:Pointer);
Maximální počet poloek obsaených v TCollection je určen proměnnou MaxCollectionSize
Iterátory pole TCollection
Kromě dynamicky měnitelné velikosti a polymorfismu poskytuje TCollection navíc prostředky pro řeení dalího obvykle programového
úkolu týkajícího se polí. Je to vykonání nějaké činnosti nade vemi položkami pole a najítí první nebo poslední položkysplňukící určitou podmínku.
Tyto problémy je mono jednodue řeit pomocí "iteračních" metod ForEach, FirstThat, LastThat
Metoda ForEach
procedure TCollection.ForEach(Action:pointer);
Vykoná postupně akci určenou parametrem Action. Pouívá se následujícím způsobem:
Procedure Moje_Procedura(kol:PCollection);
procedure AKCE(item:pointer);far;
begin
delej_neco_s(item);
end;
kol^.forEach(@Akce);
end;
Procedura její adresa je předávána jako parametr Action musí být obyčejná procedura - nesmí být metodou ádného objektu!!
Dále musí být lokální vzhledem k proceduře, která ji volá. Musí být typu far.
Metody FirstThat a LastThat
function TCollection.FIrstThat(Test:pointer):pointer;
function TCollection.LastThat(test:pointer);pointer;
Test - adresa funkce s návratovou hodnotou typu Boolean, vrací True pokud položka splňuje poadovanou podmínku
Způsob zápisu:
Procedure MojeProcedura(kol:PCollection);
var Prvni, posledni:pointer;
function Podminka(pol:pointre):Boolean;far;
begin
podminka:=delej_neco_s(pol);
end;
Begin
Prvni:=firstThat(@podminka);
posledni:=lastThat(@podminka);
end;
Uspořádaná pole - TSortedCollection
Třída TSortedCollection se pouívá jako pole, jeho položkyjsou uspořádány podle určitého klíče.
Způsob uspořádání definujeme přepsáním metod:
function TSortedCollection.KeyOf(Item:pointer):pointer;virtual;
Má jediný parametr - ukazatel na poloku pole, jako náratovou hodnotu předává ukazatel na tu poloku pole, podle které se má provádět
třídění.
function TSortedCollection.Compare(key1,key2:pointer):iteger;Virtual;
Parametry jsou dva ukazatele na klíče poloek pole. Vrací hodnotu 0 v případě rovnosti obou klíčů.
-1 v případě e první klíč je mení ne druhý a 1 pokud je druhý klíč mení ne první.
Function TSortedCollection.Search(key:pointer;var index:integer):boolean;virtual;
Tato metoda byhldí poloku s klíčem key. Pokud je nalezena vrací True a v proměnné index nalezenou hodnotu poloky.
TStringCollection je přímý následník třídy TSortedCollection, poskytuje vechny její monosti.
položkynejsou objekty ale stringy.
Doplnění programu (TV6.PAS)
*** nefunguje - chyby :(( ***
uses app, views, objects, menus, drivers, dialogs;
const cmSesNab=100;
cmUkNab=101;
cmZrnab=102;
cmIMonitory=103;
cmIDisky=104;
cmIKlavesnice=105;
cmOMonitory=106;
cmOdisky=107;
cmOKlavesnice=108;
cmMore=111;
cmOprav=112;
cmDelete=113;
type PVstupDialog=^TVstupDialog;
TVstupDialog=Object(TDialog)
PracFile:PbufStream;
Pol:array [1..7,1..2] of PinputLine;
constructor init(var Bounds:TRect;ATitle:TTitleStr);
destructor done;virtual;
procedure handleEvent(var event:Tevent);virtual;
End;
PMyListBox=^TMyListBox;
TMyListBox=Object(TListBox)
kol:PCollection;
constructor init(var bounds:Trect;AnumCols:word;AScrollBar:PScrollBar;APath:string);
destructor done;virtual;
function GetText(item:integer;maxLen:integer):String;virtual;
end;
PTitulText=^TTitulText;
TTitulText=Object(TstaticText)
function GetPalette:ppalette;virtual;
end;
PVystupDialog=^TVystupDialog;
TvystupDialog=Object(TDialog)
list:pMyListBox;
Titul:PtitulText;
Obs:Boolean;
Scrolbar:Pscrollbar;
Constructor init(var bounds:Trect);
destructor done;virtual;
procedure natahni(path,name:String);
end;
TVstupDialogRec=record
IL:Array [1..7] of
record
Na:String[50];
Ce:String[8];
end;
end;
pDealer=^Tdealer;
tdealer=object(Tapplication)
procedure initMenuBar;virtual;
procedure initStatusLine;virtual;
procedure HandleEvent(var event:TEvent);virtual;
procedure SestavNabidku;
Procedure UkazNabidku;
Procedure ZrusNabidku;
procedure Vstup(ceho:string);
procedure vystup(ceho:string);
constructor init;
end;
PPart=^TPart;
Tpart=object(TObject)
Price:real;
Name:string[50];
constructor init(Aname:string;Aprice:real);
constructor load(var s:tstream);
procedure store(var s:tstream);virtual;
procedure setname(aname:string);
procedure setPrice(aprice:real);
function getprice:real;
function getname:string;
function getString:string;
end;
Const NVstupDialogRec:TvstupDialogRec=(
IL:((Na:'';Ce:''),(Na:'';Ce:''),(Na:'';Ce:''),
(Na:'';Ce:''),(Na:'';Ce:''),(Na:'';Ce:''),
(Na:'';Ce:''))
);
Rpart:tstreamRec=(
objtype:100;
vmtLink:ofs(typeOf(Tpart)^);
load:@Tpart.load;
Store:@Tpart.store);
sizeOfTpart=56;
Constructor Tdealer.init;
begin
TApplication.init;
registerType(RPart);
end;
procedure tDealer.initMenuBar;
var r:tRect;
begin
getExtent(r);
r.b.y:=r.a.y+1;
menubar:=new(pMENUbar, init(r, newmenu(
NEWSUBmenu('~N~abidka',hcNOcontext,NEWMENU(
newItem('~S~estav','',0,cmsesnab, hcNocontext,
newItem('~U~kaz','',0,cmuknab, hcNocontext,
newItem('~Z~rus','',0,cmzrnab, hcNocontext,
newLine(
newItem('~K~onec','ALT-X',kbALTX,cmQuit, hcNocontext,
nil)))))
),
newSubMenu('Vstupy',hcNOcontext,newMenu(
newItem('Monitory','',0,cmImonitory, hcNocontext,
newItem('Disky','',0,cmIdisky, hcNocontext,
newItem('Klavesnice','',0,cmIklavesnice, hcNocontext,
nil)))),
newSubMenu('Vystupy',hcNOcontext, newMenu(
newItem('Monitory','',0,cmOmonitory, hcNocontext,
newItem('Disky','',0,cmOdisky, hcNocontext,
newItem('Klavesnice','',0,cmOklavesnice, hcNocontext,
nil)))),
NIL))))
));
end;
Procedure tDealer.initStatusLine;
var r:trect;
begin
getExtent(r);
r.a.y:=r.b.y-1;
statusLine:=new(pStatusLine, Init(r,
newStatusDef(0,$FFFF,
newStatusKey('~ALT-X~ Exit',kbAltX,cmQuit,
newStatusKey('~F1~ Help',kbF1,cmHelp,
newStatusKey('~F2~ Nabidka',kbF2,cmSEsNab,
newStatusKey('~F10~ Menu',kbF10,cmMenu,
nil)))),
nil)
));
end;
Procedure TDealer.HandleEvent(var Event:TEvent);
begin
Tapplication.handleEvent(Event);
case event.command of
cmSesNab :sestavNabidku;
cmUkNab :UkazNabidku;
cmZrNab :ZrusNabidku;
cmImonitory :Vstup('Monitory');
cmIdisky :Vstup('Disky');
cmIKlavesnice :Vstup('Klavesnice');
cmOmonitory :Vystup('Monitory');
cmODisky :Vystup('Disky');
cmOKlavesnice :Vystup('Klavesnice');
else exit;
end;
ClearEvent(event);
end;
Procedure Tdealer.sestavNabidku;
begin
end;
Procedure Tdealer.zrusNabidku;
begin
end;
Procedure Tdealer.ukazNabidku;
begin
end;
Procedure Tdealer.vstup(ceho:string);
var r:TRect;
okno:PVstupDialog;
path:string;
begin
r.assign(5,3,73,18);
okno:=new(PVstupDialog,Init(r,True));
path:=ceho;
if length(path)>8 then
system.delete(path,8,length(path)-8);
path:=concat(path,'.dta');
okno^.natahni(path,ceho);
desktop^.execView(okno);
Dispose(okno,done);
end;
Constructor TVstupDialog.Init(var Bounds:Trect;ATitle:TTitleStr);
Var R:Trect;
i,j:byte;
pom:PButton;
Code,info:integer;
path:string;
BEGIN
TDialog.Init(Bounds, ATitle);
GetExtent(r);
R.Assign(R.A.X+2, R.A.Y+10, R.A.X+17,R.A.Y+12);
pom:=New(PButton, init(R,'~M~ore',cmMore, bfNormal));
Insert(pom);
R.Move(16,0);
pom:=New(PButton, init(R,'~O~k',cmOk, bfNormal));
Insert(pom);
R.Move(16,0);
pom:=New(PButton, init(R,'~C~ancel',cmCancel, bfNormal));
Insert(pom);
GetExtent(R);
Bounds.Copy(R);
R.Assign(R.A.X+2, R.A.Y+8, R.B.X-10, R.A.Y+9);
Bounds.assign(bounds.B.X-9, Bounds.A.Y+8, bounds.B.X-2, Bounds.A.Y+9);
For i:=1 to 7 do
BEGIN
Pol[i,1]:=New(PInputLine,Init(R,50));
Pol[i,2]:=New(PInputLine,Init(Bounds,8));
R.Move(0,-1);
END;
For i:=7 Downto 1 do
BEGIN
Insert(pol[i,1]);
Insert(pol[i,2]);
END;
POL[7,1]^.select;
Insert(New(PLabel,Init(R,' ~N~ zev', Pol[7,1])));
Insert(New(PLabel,Init(Bounds,' ~C~ena', Pol[7,2])));
if length(aTitle) > 8 then
system.delete(atitle,8,length(atitle)-8);
path:=concat(atitle,'.dta');
pracFile:=new(pBufStream,init(path, stOpen, 512));
with PracFile^ do
if status=stOk then
begin
Reset;
init(path, stCreate, 512);
end else seek(getsize);
end;
Destructor TVstupDialog.Done;
var i,j:byte;
Begin
dispose(pracfile, done);
for i:=1 to 6 do
for j:=1 to 2 do
Dispose(pol[i,j],Done);
TDialog.done;
end;
Procedure TVstupDialog.HandleEvent(var Event:TEvent);
Procedure zapis;
var data:TVstupDialogRec;
prac:PPart;
num:real;
code:integer;
i:byte;
begin
data:=NVstupDialogRec;
GetData(Data);
setData(NVstupDialogRec);
i:=1;
with data do
while (i<7) and (il[i].na) do
begin
val(il[i].ce,num,code);
prac:=new(ppart, init(il[i].na,num));
prac^.store(pracfile^);
dispose(prac,done);
inc(i);
end;
End;
begin
end;
constructor Tpart.init(aname:string;aprice:real);
begin
tobject.init;
name:=aname;
price:=aprice;
end;
function Tpart.getprice:real;
begin
getPrice:=Price;
end;
function TPart.getName:string;
begin
getName:=name;
end;
Procedure TPart.setName(aname:string);
begin
name:=aname;
end;
Procedure Tpart.setPrice(aprice:real);
begin
price:=aPrice;
end;
function tpart.getstring:string;
var a,b:string;
l,hm:byte;
begin
str(price:8:2,A);
b:=getname;
hm:=length(b);
if hm<50 then for l:=hm to 49 do b:=concat(b,' ')
else delete(b, 51, hm-50);
getstring:=concat(b,' ',a,'Kcs');
end;
constructor Tpart.load(var s:tstream);
begin
s.read(name,sizeof(name));
s.read(price, sizeOf(price));
end;
Procedure tPart.store(var s:tstream);
begin
s.write(name, sizeOf(name));
s.write(price, sizeOf(price));
end;
function Najdi_select:Boolean;
var i,j:byte;
Begin
i:=1;j:=1;
while (i<7) and not(pol[i,j]^.GetState(sfSelected))
do if j=2 then
begin
j:=1;
inc(i);
end else inc(j);
Najdi_select:=(i<7);
end;
Begin
if (event.what=evBroadCast) and (event.Command=cmDefault) then
begin
if najdi_select then selectNext(false)
else TDialog.handleEvent(Event);
end else
begin
if (event.what=evCommand) then
begin
if (event.command=cmMore) or (event.command=cmOk) then
begin
zapis;
pol[7,1]^.select;
end;
end;
TDialog.HandleEvent(event);
end;
ClearEvent(Event);
end;
Procedure Tdealer.vystup(ceho:string);
var R:Trect;
okno:pvystupDialog;
path:string;
begin
R.Assign(5,2,73,18);
Okno:=new(pvystupDialog, init(R));
path:=Ceho;
if length(path)>8 then
system.delete(path,8,length(path)-8);
Path:=concat(path, '.dta');
okno^.natahni(path,ceho);
desktop^.execview(okno);
dispose(okno,done);
End;
constructor TmyListBox.init(var bound:Trect;aNumCols:word;Ascrollbar:pascrollbar;
APath:strin);
var pom:ppart;
dl:searchRec;
soub:PDosstream;
Begin
TlistBox.init(bounds, aNumcols, ascrollBar);
findfirst(aPath, archive, Dl);
id Doserror=0 then
doub:=new(PdosStream, init(APath, stOpen))
else soub:=new(PDosStream, init(Apath, stCreate));
Kol:=new(Pcollection, init(10,1));
while soub^.getpos < soub^.getsize do
begin
pom:=new(ppart, load(soub^));
kol^.insert(pom);
end;
Dispose(soub,done);
newList(kol);
end;
Destructor TmyListBox.done;
begin
newList(nil);
Tlistbox.done;
end;
function tMyListBox.getTExt(item:integer;maxLen:integer):string;
begin
gettext:=ppart(list^.At(item))^.getstring);
end;
Constructor TVystupdialog.Init(var Bounds:tRect);
var R:TRect
krok:=word;
begin
TDialog.init(bounds, '');
obs:=false;
getExtend(R);
R.b.y:=r.a.y+1;
r.a.x:=r.a.x.+10;
r.b.x:=r.a.x;
titul:=new(PtitulText,init(R,'');
getExtend(r);
R.assign(r.b.x-1,r.a.y+2, r.b.x,r.b.y-5);
scrollbar:=new(pscrollBar,Init(r));
insert(scrollBar);
GetExtend(R);
R.grow(-11,-1);
r.a.y:=r.b.y-2;
insert(new(pbutton,init(R,'~O~k',cmOk,Bfdefault)));
end;
destructor TVystupDialog.done;
begin
if Obs then list^.newlist(nil);
Tdialog.done;
end;
Procedure TVystupDialog.natahni(path,name:string);
var a:string;
r:Trect;
begin
if obs then
begin
delete(list);
list^.newlist(Nil);
dispose(list,done);
end;
obs:=true;
getextent(R);
R.assign(r.a.x+1,r.a.y+1,r.b.x-1,r.b.y-4);
list:=new(Pmylistbox, init(R,1,scrollBar, Path));
insert(list);
delete(titul);
dispose(titul, done);
a:=concat('Evidovane',Name,'');
getExtent(R);
r.b.y:=r.a.y+1;
r.a.x:=(r.b.x-r.a.x)div 2 -length(a) div 2;
r.b.x:=r.a.x+length(a);
titul:=new(pTitulText,Init(r,a));
insert(titul);
drawview;
end;
function TtitulText.getpalette:ppalette;
const cTitulText=#2;
ptitultext:string[length(cTitulText)]=CtitulText;
begin
getpalette:=@PtitulText;
end;
VAR a:tdealer;
BEGIN
a.init;
a.run;
a.done;
END.
Dokončení ukázkového programu
