Добавил:
Eatmore
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:написанные программы / задание №7 — 2 / VAR1 / csdialog
.pas {
Laboratory Task 2
~~~~~~~~~~~~~~~~~
Copyright (c) 2000 NeOS Programming Software, Aleksey Borzenkov
CSDialog.pas - ‘®¤Ґа¦Ёв Ў®а дгЄжЁ© ¤«п бЎ®а Ё ®Ўа Ў®вЄЁ ¤ ле
(*) NeOS Programming Software Ґ § ॣЁбваЁа®ў п в®аЈ®ў п ¬ аЄ , ® ўл
(*) Ґ ¤®«¦л ҐҐ ЁбЇ®«м§®ў вм ЁЈ¤Ґ, Єа®¬Ґ нв®Ј® Є®ЇЁа ©в !!!
(*) NeOS Programming Software Ўл« ®б®ў ў 1998 Ј®¤г Ё ᥩз б ᮦҐа¦Ёв
(*) в®«мЄ® ®¤®Ј® 祫®ўҐЄ - ҐЈ® ®б®ў вҐ«п Ѓ®а§ҐЄ®ў Ђ«ҐЄбҐп.
(!) ќв Їа®Ја ¬¬ Ўл« бЇҐжЁ «м® Ё§Ј®в®ў«Ґ ¤«п ’ҐеЁзҐбЄ®Ј® “ЁўҐабЁвҐв
(!) €’ЊЋ Ё д Єг«мвҐв Љ’Ё“ ("Љ®¬ЇмовҐале ’Ґе®«®ЈЁ© Ё “Їа ў«ҐЁп") Є Є
(!) « Ў®а в®а п а Ў®в б §ў ЁҐ¬ "Pascal/156/TV § ¤ ЁҐ ®¬Ґа 1".
}
unit CSDialog;
interface
uses
Objects, Drivers, App, Views, Menus, Dialogs;
type
{ ®ЇЁблў Ґв бвагЄвгаг Є®¬ЇмовҐа }
THardwareInfo = record
Company: String[16];
CPUName: String[16];
CPUType: Integer;
RAMType: Integer;
HDDSpace: Integer;
FDDCount: Integer;
Monitor: String[10];
Price: Integer;
end;
const
nMaxHardwareInfos = 64;
{ вЁЇл ў®§¬®¦ле з бв®в –Џ }
CPUItems: array[0..4] of String[10] = (
'40 ЊЈж', '33 ЊЈж',
'25 ЊЈж', '20 ЊЈж',
'10 ЊЈж' );
{ вЁЇл ў®§¬®¦ле ®ЎкҐ¬®ў Ћ‡“ }
RAMItems: array[0..3] of String[10] = (
'4 ЊЎ ©в ', '2 ЊЎ ©в ',
'1 ЊЎ ©в', '0.6 ЊЎ ©в' );
CPUItemsNum: array[0..4] of Integer = (
40, 33, 25, 20, 10 );
RAMItemsNum: array[0..3] of Integer = (
40, 20, 10, 6 );
(***************************************
{ Ў®а Є®¬ЇмовҐа®ў, ў§пвл© Ё§ § ¤ Ёп }
HardwareInfo: array[1..10] of THardwareInfo = (
(Company: 'ЌЁҐи ж'; CPUName: '286' ; CPUType: 3; RAMType: 2; HDDSpace: 40 ; FDDCount: 2; Monitor: 'VGA' ; Price: 799 ),
(Company: 'ЉҐ©' ; CPUName: '286' ; CPUType: 4; RAMType: 3; HDDSpace: 40 ; FDDCount: 1; Monitor: '¬®®'; Price: 599 ),
(Company: '‹н¤' ; CPUName: '286' ; CPUType: 3; RAMType: 2; HDDSpace: 40 ; FDDCount: 2; Monitor: 'SVGA'; Price: 720 ),
(Company: 'ЂпЄб' ; CPUName: '386 SX'; CPUType: 0; RAMType: 1; HDDSpace: 120; FDDCount: 2; Monitor: 'SVGA'; Price: 895 ),
(Company: 'ЂпЄб' ; CPUName: '386 SX'; CPUType: 0; RAMType: 0; HDDSpace: 120; FDDCount: 2; Monitor: 'SVGA'; Price: 1106),
(Company: '€ЈаҐбб' ; CPUName: '386 SX'; CPUType: 1; RAMType: 1; HDDSpace: 89 ; FDDCount: 2; Monitor: 'SVGA'; Price: 1142),
(Company: 'ЌЁҐи ж'; CPUName: '386 SX'; CPUType: 0; RAMType: 0; HDDSpace: 240; FDDCount: 2; Monitor: 'SVGA'; Price: 1062),
(Company: 'ЂпЄб' ; CPUName: '486 SX'; CPUType: 2; RAMType: 1; HDDSpace: 120; FDDCount: 2; Monitor: 'SVGA'; Price: 1049),
(Company: 'ЌЁҐи ж'; CPUName: '486 SX'; CPUType: 2; RAMType: 0; HDDSpace: 340; FDDCount: 1; Monitor: 'SVGA'; Price: 1580),
(Company: 'ASCOD' ; CPUName: '486 SX'; CPUType: 1; RAMType: 0; HDDSpace: 520; FDDCount: 2; Monitor: 'SVGA'; Price: 2054)
);
***************************************)
type
PHardwareInfos = ^THardwareInfos;
THardwareInfos = array[1..nMaxHardwareInfos] of THardwareInfo;
PHardwareStrings = ^THardwareStrings;
THardwareStrings = array[1..nMaxHardwareInfos] of String[80];
var
HardwareCount: Integer;
HardwareInfos: PHardwareInfos;
HardwareStrings: PHardwareStrings;
type
{ б«г¦Ёв ¤«п ®Ў¬Ґ ¤ л¬Ё ¤Ё «®Ј }
TMyDialogData = record
ButtonData: Word;
end;
function IntToStr(Value: Integer): String; { зЁб«® -> бва®Є }
function FindByCPU(Value: Integer): String; { б ¬л© ¤Ґисўл© Ї® з бв®вҐ –Џ }
function FindByRAM(Value: Integer): String; { б ¬л© ¤ҐиҐўл© Ї® ®ЎкҐ¬г Ћ‡“ }
function FindByIndex(Value: Integer): String; { Є®¬ЇмовҐа Ї® ҐЈ® ®¬Ґаг ў в Ў« }
function MakeCPUDialog: PDialog; { ў®§ўа й Ґв ¤Ё «®Ј Ї® з бв®вҐ }
function MakeRAMDialog: PDialog; { ў®§ўа й Ґв ¤Ё «®Ј Ї® ®ЎкҐ¬г }
function MakeInfoDialog(S: String): PDialog; { ў®§ўа й Ґв ¤Ё «®Ј ¤«п १. }
implementation
function IntToStr(Value: Integer): String;
var
S: String;
begin
Str(Value, S);
IntToStr := S;
end;
function FindByCPU(Value: Integer): String;
var
i, j: Integer;
begin
j := 0;
for i := 1 to HardwareCount do begin
if HardwareInfos^[i].CPUType = Value then begin
if (j = 0) or (HardwareInfos^[i].Price < HardwareInfos^[j].Price) then
j := i;
end;
end;
if j = 0 then
FindByCPU := '’ Є®Ј® Є®¬ЇмовҐа Ґ ©¤Ґ® :('
else
FindByCPU := FindByIndex(j);
end;
function FindByRAM(Value: Integer): String;
var
i, j: Integer;
begin
j := 0;
for i := 1 to HardwareCount do begin
if HardwareInfos^[i].RAMType = Value then begin
if (j = 0) or (HardwareInfos^[i].Price < HardwareInfos^[j].Price) then
j := i;
end;
end;
if j = 0 then
FindByRAM := '’ Є®Ј® Є®¬ЇмовҐа Ґ ©¤Ґ® :('
else
FindByRAM := FindByIndex(j);
end;
function FindByIndex(Value: Integer): String;
begin
with HardwareInfos^[Value] do
FindByIndex := '”Ёа¬ : ' + Company +
#13'’ЁЇ –Џ: ' + CPUName +
#13'— бв®в –Џ: ' + CPUItems[CPUType] +
#13'ЋЎкҐ¬ Ћ‡“: ' + RAMItems[RAMType] +
#13'ЋЎкҐ¬ Ќ†Њ„: ' + IntToStr(HDDSpace) +
#13'Љ®«-ў® ѓЊ„: ' + IntToStr(FDDCount) +
#13'Њ®Ёв®а: ' + Monitor +
#13'–Ґ : $' + IntToStr(Price);
end;
function MakeCPUDialog: PDialog;
var
R: TRect;
Dialog: PDialog;
Cluster: PCluster;
begin
R.Assign(0, 0, 30, 12);
Dialog := New(PDialog, Init(R, '‚лЎ®а Є®¬мовҐа '));
Dialog^.Options := Dialog^.Options or ofCentered;
R.Assign(3, 3, 27, 8);
Cluster := New(PRadioButtons, Init(R,
NewSItem(CPUItems[0],
NewSItem(CPUItems[1],
NewSItem(CPUItems[2],
NewSItem(CPUItems[3],
NewSItem(CPUItems[4],
nil)))))
));
Dialog^.Insert(Cluster);
R.Assign(2, 2, 27, 3);
Dialog^.Insert(New(PLabel, Init(R, '~F~ — бв®в Їа®жҐбб®а :', Cluster)));
R.Assign(5, 9, 13, 11);
Dialog^.Insert(New(PButton, Init(R, 'O~K~', cmOk, bfDefault)));
R.Assign(15, 9, 25, 11);
Dialog^.Insert(New(PButton, Init(R, '~C~ancel', cmCancel, bfNormal)));
Cluster^.Select;
MakeCPUDialog := Dialog;
end;
function MakeRAMDialog: PDialog;
var
R: TRect;
Dialog: PDialog;
Cluster: PCluster;
begin
R.Assign(0, 0, 30, 11);
Dialog := New(PDialog, Init(R, '‚лЎ®а Є®¬мовҐа '));
Dialog^.Options := Dialog^.Options or ofCentered;
R.Assign(3, 3, 27, 7);
Cluster := New(PRadioButtons, Init(R,
NewSItem(RAMItems[0],
NewSItem(RAMItems[1],
NewSItem(RAMItems[2],
NewSItem(RAMItems[3],
nil))))
));
Dialog^.Insert(Cluster);
R.Assign(2, 2, 27, 3);
Dialog^.Insert(New(PLabel, Init(R, '~V~ ЋЎкҐ¬ Ћ‡“:', Cluster)));
R.Assign(5, 8, 13, 10);
Dialog^.Insert(New(PButton, Init(R, 'O~K~', cmOk, bfDefault)));
R.Assign(15, 8, 25, 10);
Dialog^.Insert(New(PButton, Init(R, '~C~ancel', cmCancel, bfNormal)));
Cluster^.Select;
MakeRAMDialog := Dialog;
end;
function MakeInfoDialog(S: String): PDialog;
var
R: TRect;
Dialog: PDialog;
begin
R.Assign(0, 0, 40, 15);
Dialog := New(PDialog, Init(R, '€д®а¬ жЁп ® Є®¬ЇмовҐаҐ'));
Dialog^.Options := Dialog^.Options or ofCentered;
R.Assign(16, 12, 24, 14);
Dialog^.Insert(New(PButton, Init(R, 'O~K~', cmOk, bfDefault)));
R.Assign(2, 2, 38, 11);
Dialog^.Insert(New(PStaticText, Init(R, S)));
MakeInfoDialog := Dialog;
end;
{-------------------------------------------------------------------------}
{--- Section 2: €ЁжЁ «Ё§ жЁп Ёд®а¬ жЁЁ ® Є®¬ЇмовҐаҐ ---}
{-------------------------------------------------------------------------}
var
HardwareFile: Text;
SaveExit: Pointer;
{$F+}
procedure CSDialogExitProc;
var
i: Integer;
begin
{
Debug Feature: Info Printer
for i := 1 to HardwareCount do begin
writeln(HardwareStrings^[i]);
end;
writeln(Sizeof(HardwareInfos^));
writeln(Sizeof(HardwareStrings^));
}
ExitProc := SaveExit;
{ Dispose(HardwareStrings); }
Dispose(HardwareInfos);
end;
{$F-}
function FindNextToken(var i: Integer; S: String): String;
var
j, k: Integer;
begin
k := Length(S);
while ((S[i] = #32) or (S[i] = #9)) and (i < k) do Inc(i);
j := i;
repeat Inc(i); until (i > k) or (S[i] = #32) or (S[i] = #9);
FindNextToken := Copy(S, j, i - j);
end;
procedure DecodeHardwareString(i: Integer);
var
j, k: Integer;
A: String;
S: String;
Code: Integer;
Value1: Integer;
Value2: Real;
Done: Boolean;
begin
j := 1;
A := HardwareStrings^[i];
{ ЁйҐ¬ §ў ЁҐ Є®¬Ї ЁЁ }
S := FindNextToken(j, A);
HardwareInfos^[i].Company := S;
{ ЁйҐ¬ §ў ЁҐ –Џ }
S := FindNextToken(j, A);
HardwareInfos^[i].CPUName := S;
{ ЁйҐ¬ з бв®вг –Џ, Ё § ®¤® (Ґб«Ё Ґбвм) ®бв в®Є бва®ЄЁ б вЁЇ®¬ –Џ }
Done := False;
repeat
S := FindNextToken(j, A);
Val(S, Value1, Code);
if S = '' then begin
HardwareInfos^[i].CPUType := High(CPUItemsNum) + 1;
Break;
end;
if Code <> 0 then begin
HardwareInfos^[i].CPUName := HardwareInfos^[i].CPUName + ' ' + S;
end else begin
for k := Low(CPUItemsNum) to High(CPUItemsNum) do begin
if CPUItemsNum[k] = Value1 then begin
HardwareInfos^[i].CPUType := k;
Done := True;
Break;
end;
end;
if not Done then
HardwareInfos^[i].CPUName := HardwareInfos^[i].CPUName + ' ' + S;
end;
until Done;
{ ЁйҐ¬ ®ЎкҐ¬ Ћ‡“ }
S := FindNextToken(j, A);
Val(S, Value2, Code);
if Code <> 0 then begin
HardwareInfos^[i].RAMType := High(RAMItemsNum) + 1;
end else begin
Value2 := Value2 * 10;
Value1 := Trunc(Value2);
Done := False;
for k := Low(RAMItemsNum) to High(RAMItemsNum) do begin
if RAMItemsNum[k] = Value1 then begin
HardwareInfos^[i].RAMType := k;
Done := True;
Break;
end;
end;
if not Done then HardwareInfos^[i].RAMType := High(RAMItemsNum) + 1;
end;
{ €йҐ¬ ®ЎкҐ¬ Ќ†Њ„ }
S := FindNextToken(j, A);
Val(S, Value1, Code);
if Code = 0 then begin
HardwareInfos^[i].HDDSpace := Value1;
end else
HardwareInfos^[i].HDDSpace := 0;
{ €йҐ¬ Љ®«-ў® ѓЊ„ }
S := FindNextToken(j, A);
Val(S, Value1, Code);
if Code = 0 then begin
HardwareInfos^[i].FDDCount := Value1;
end else
HardwareInfos^[i].FDDCount := 0;
{ Ќ §ў ЁҐ ¬®Ёв®а }
S := FindNextToken(j, A);
HardwareInfos^[i].Monitor := S;
{ € Ї®б«Ґ¤®Є бзЁвлў Ґ¬ жҐг... }
repeat
S := FindNextToken(j, A);
if S = '' then begin
HardwareInfos^[i].Price := 0;
Break;
end;
Val(S, Value1, Code);
if Code = 0 then begin
HardwareInfos^[i].Price := Value1;
Break;
end else
HardwareInfos^[i].Monitor := HardwareInfos^[i].Monitor + ' ' + S;
until False;
end;
procedure InitializeHardware;
var
S: String;
i: Integer;
Done: Boolean;
begin
{ Ќ 室Ё¬ бва®Єг б®бв®пйго Ё§ зҐав®зҐЄ }
repeat
if Eof(HardwareFile) then Exit;
ReadLn(HardwareFile, S);
if Length(S) > 0 then Done := True;
for i := 1 to Length(S) do
if (S[i] <> '-') and (S[i] <> ' ') then Done := False;
until Done;
{ ‘зЁвлў Ґ¬ бва®ЄЁ б ®ЇЁб ЁҐ¬ Є®¬ЇмовҐа®ў }
repeat
if Eof(HardwareFile) then Break;
ReadLn(HardwareFile, S);
Inc(HardwareCount);
HardwareStrings^[HardwareCount] := S;
until HardwareCount >= nMaxHardwareInfos; { ‡ йЁв Їа®вЁў ЇҐаҐЇ®«ҐЁп }
{ „ҐЄ®¤Ёа㥬 Ёе }
for i := 1 to HardwareCount do
DecodeHardwareString(i);
end;
begin
HardwareCount := 0;
Assign(HardwareFile, 'hwpc.txt');
{$I-}
Reset(HardwareFile);
{$I+}
if IOResult <> 0 then begin
WriteLn('ERROR: ЌҐ ¬®Јг ®вЄалвм д ©« hwpc.txt');
Halt(255);
end;
New(HardwareInfos);
New(HardwareStrings);
InitializeHardware;
Dispose(HardwareStrings);
Close(HardwareFile);
SaveExit := ExitProc;
ExitProc := @CSDialogExitProc;
end.
Laboratory Task 2
~~~~~~~~~~~~~~~~~
Copyright (c) 2000 NeOS Programming Software, Aleksey Borzenkov
CSDialog.pas - ‘®¤Ґа¦Ёв Ў®а дгЄжЁ© ¤«п бЎ®а Ё ®Ўа Ў®вЄЁ ¤ ле
(*) NeOS Programming Software Ґ § ॣЁбваЁа®ў п в®аЈ®ў п ¬ аЄ , ® ўл
(*) Ґ ¤®«¦л ҐҐ ЁбЇ®«м§®ў вм ЁЈ¤Ґ, Єа®¬Ґ нв®Ј® Є®ЇЁа ©в !!!
(*) NeOS Programming Software Ўл« ®б®ў ў 1998 Ј®¤г Ё ᥩз б ᮦҐа¦Ёв
(*) в®«мЄ® ®¤®Ј® 祫®ўҐЄ - ҐЈ® ®б®ў вҐ«п Ѓ®а§ҐЄ®ў Ђ«ҐЄбҐп.
(!) ќв Їа®Ја ¬¬ Ўл« бЇҐжЁ «м® Ё§Ј®в®ў«Ґ ¤«п ’ҐеЁзҐбЄ®Ј® “ЁўҐабЁвҐв
(!) €’ЊЋ Ё д Єг«мвҐв Љ’Ё“ ("Љ®¬ЇмовҐале ’Ґе®«®ЈЁ© Ё “Їа ў«ҐЁп") Є Є
(!) « Ў®а в®а п а Ў®в б §ў ЁҐ¬ "Pascal/156/TV § ¤ ЁҐ ®¬Ґа 1".
}
unit CSDialog;
interface
uses
Objects, Drivers, App, Views, Menus, Dialogs;
type
{ ®ЇЁблў Ґв бвагЄвгаг Є®¬ЇмовҐа }
THardwareInfo = record
Company: String[16];
CPUName: String[16];
CPUType: Integer;
RAMType: Integer;
HDDSpace: Integer;
FDDCount: Integer;
Monitor: String[10];
Price: Integer;
end;
const
nMaxHardwareInfos = 64;
{ вЁЇл ў®§¬®¦ле з бв®в –Џ }
CPUItems: array[0..4] of String[10] = (
'40 ЊЈж', '33 ЊЈж',
'25 ЊЈж', '20 ЊЈж',
'10 ЊЈж' );
{ вЁЇл ў®§¬®¦ле ®ЎкҐ¬®ў Ћ‡“ }
RAMItems: array[0..3] of String[10] = (
'4 ЊЎ ©в ', '2 ЊЎ ©в ',
'1 ЊЎ ©в', '0.6 ЊЎ ©в' );
CPUItemsNum: array[0..4] of Integer = (
40, 33, 25, 20, 10 );
RAMItemsNum: array[0..3] of Integer = (
40, 20, 10, 6 );
(***************************************
{ Ў®а Є®¬ЇмовҐа®ў, ў§пвл© Ё§ § ¤ Ёп }
HardwareInfo: array[1..10] of THardwareInfo = (
(Company: 'ЌЁҐи ж'; CPUName: '286' ; CPUType: 3; RAMType: 2; HDDSpace: 40 ; FDDCount: 2; Monitor: 'VGA' ; Price: 799 ),
(Company: 'ЉҐ©' ; CPUName: '286' ; CPUType: 4; RAMType: 3; HDDSpace: 40 ; FDDCount: 1; Monitor: '¬®®'; Price: 599 ),
(Company: '‹н¤' ; CPUName: '286' ; CPUType: 3; RAMType: 2; HDDSpace: 40 ; FDDCount: 2; Monitor: 'SVGA'; Price: 720 ),
(Company: 'ЂпЄб' ; CPUName: '386 SX'; CPUType: 0; RAMType: 1; HDDSpace: 120; FDDCount: 2; Monitor: 'SVGA'; Price: 895 ),
(Company: 'ЂпЄб' ; CPUName: '386 SX'; CPUType: 0; RAMType: 0; HDDSpace: 120; FDDCount: 2; Monitor: 'SVGA'; Price: 1106),
(Company: '€ЈаҐбб' ; CPUName: '386 SX'; CPUType: 1; RAMType: 1; HDDSpace: 89 ; FDDCount: 2; Monitor: 'SVGA'; Price: 1142),
(Company: 'ЌЁҐи ж'; CPUName: '386 SX'; CPUType: 0; RAMType: 0; HDDSpace: 240; FDDCount: 2; Monitor: 'SVGA'; Price: 1062),
(Company: 'ЂпЄб' ; CPUName: '486 SX'; CPUType: 2; RAMType: 1; HDDSpace: 120; FDDCount: 2; Monitor: 'SVGA'; Price: 1049),
(Company: 'ЌЁҐи ж'; CPUName: '486 SX'; CPUType: 2; RAMType: 0; HDDSpace: 340; FDDCount: 1; Monitor: 'SVGA'; Price: 1580),
(Company: 'ASCOD' ; CPUName: '486 SX'; CPUType: 1; RAMType: 0; HDDSpace: 520; FDDCount: 2; Monitor: 'SVGA'; Price: 2054)
);
***************************************)
type
PHardwareInfos = ^THardwareInfos;
THardwareInfos = array[1..nMaxHardwareInfos] of THardwareInfo;
PHardwareStrings = ^THardwareStrings;
THardwareStrings = array[1..nMaxHardwareInfos] of String[80];
var
HardwareCount: Integer;
HardwareInfos: PHardwareInfos;
HardwareStrings: PHardwareStrings;
type
{ б«г¦Ёв ¤«п ®Ў¬Ґ ¤ л¬Ё ¤Ё «®Ј }
TMyDialogData = record
ButtonData: Word;
end;
function IntToStr(Value: Integer): String; { зЁб«® -> бва®Є }
function FindByCPU(Value: Integer): String; { б ¬л© ¤Ґисўл© Ї® з бв®вҐ –Џ }
function FindByRAM(Value: Integer): String; { б ¬л© ¤ҐиҐўл© Ї® ®ЎкҐ¬г Ћ‡“ }
function FindByIndex(Value: Integer): String; { Є®¬ЇмовҐа Ї® ҐЈ® ®¬Ґаг ў в Ў« }
function MakeCPUDialog: PDialog; { ў®§ўа й Ґв ¤Ё «®Ј Ї® з бв®вҐ }
function MakeRAMDialog: PDialog; { ў®§ўа й Ґв ¤Ё «®Ј Ї® ®ЎкҐ¬г }
function MakeInfoDialog(S: String): PDialog; { ў®§ўа й Ґв ¤Ё «®Ј ¤«п १. }
implementation
function IntToStr(Value: Integer): String;
var
S: String;
begin
Str(Value, S);
IntToStr := S;
end;
function FindByCPU(Value: Integer): String;
var
i, j: Integer;
begin
j := 0;
for i := 1 to HardwareCount do begin
if HardwareInfos^[i].CPUType = Value then begin
if (j = 0) or (HardwareInfos^[i].Price < HardwareInfos^[j].Price) then
j := i;
end;
end;
if j = 0 then
FindByCPU := '’ Є®Ј® Є®¬ЇмовҐа Ґ ©¤Ґ® :('
else
FindByCPU := FindByIndex(j);
end;
function FindByRAM(Value: Integer): String;
var
i, j: Integer;
begin
j := 0;
for i := 1 to HardwareCount do begin
if HardwareInfos^[i].RAMType = Value then begin
if (j = 0) or (HardwareInfos^[i].Price < HardwareInfos^[j].Price) then
j := i;
end;
end;
if j = 0 then
FindByRAM := '’ Є®Ј® Є®¬ЇмовҐа Ґ ©¤Ґ® :('
else
FindByRAM := FindByIndex(j);
end;
function FindByIndex(Value: Integer): String;
begin
with HardwareInfos^[Value] do
FindByIndex := '”Ёа¬ : ' + Company +
#13'’ЁЇ –Џ: ' + CPUName +
#13'— бв®в –Џ: ' + CPUItems[CPUType] +
#13'ЋЎкҐ¬ Ћ‡“: ' + RAMItems[RAMType] +
#13'ЋЎкҐ¬ Ќ†Њ„: ' + IntToStr(HDDSpace) +
#13'Љ®«-ў® ѓЊ„: ' + IntToStr(FDDCount) +
#13'Њ®Ёв®а: ' + Monitor +
#13'–Ґ : $' + IntToStr(Price);
end;
function MakeCPUDialog: PDialog;
var
R: TRect;
Dialog: PDialog;
Cluster: PCluster;
begin
R.Assign(0, 0, 30, 12);
Dialog := New(PDialog, Init(R, '‚лЎ®а Є®¬мовҐа '));
Dialog^.Options := Dialog^.Options or ofCentered;
R.Assign(3, 3, 27, 8);
Cluster := New(PRadioButtons, Init(R,
NewSItem(CPUItems[0],
NewSItem(CPUItems[1],
NewSItem(CPUItems[2],
NewSItem(CPUItems[3],
NewSItem(CPUItems[4],
nil)))))
));
Dialog^.Insert(Cluster);
R.Assign(2, 2, 27, 3);
Dialog^.Insert(New(PLabel, Init(R, '~F~ — бв®в Їа®жҐбб®а :', Cluster)));
R.Assign(5, 9, 13, 11);
Dialog^.Insert(New(PButton, Init(R, 'O~K~', cmOk, bfDefault)));
R.Assign(15, 9, 25, 11);
Dialog^.Insert(New(PButton, Init(R, '~C~ancel', cmCancel, bfNormal)));
Cluster^.Select;
MakeCPUDialog := Dialog;
end;
function MakeRAMDialog: PDialog;
var
R: TRect;
Dialog: PDialog;
Cluster: PCluster;
begin
R.Assign(0, 0, 30, 11);
Dialog := New(PDialog, Init(R, '‚лЎ®а Є®¬мовҐа '));
Dialog^.Options := Dialog^.Options or ofCentered;
R.Assign(3, 3, 27, 7);
Cluster := New(PRadioButtons, Init(R,
NewSItem(RAMItems[0],
NewSItem(RAMItems[1],
NewSItem(RAMItems[2],
NewSItem(RAMItems[3],
nil))))
));
Dialog^.Insert(Cluster);
R.Assign(2, 2, 27, 3);
Dialog^.Insert(New(PLabel, Init(R, '~V~ ЋЎкҐ¬ Ћ‡“:', Cluster)));
R.Assign(5, 8, 13, 10);
Dialog^.Insert(New(PButton, Init(R, 'O~K~', cmOk, bfDefault)));
R.Assign(15, 8, 25, 10);
Dialog^.Insert(New(PButton, Init(R, '~C~ancel', cmCancel, bfNormal)));
Cluster^.Select;
MakeRAMDialog := Dialog;
end;
function MakeInfoDialog(S: String): PDialog;
var
R: TRect;
Dialog: PDialog;
begin
R.Assign(0, 0, 40, 15);
Dialog := New(PDialog, Init(R, '€д®а¬ жЁп ® Є®¬ЇмовҐаҐ'));
Dialog^.Options := Dialog^.Options or ofCentered;
R.Assign(16, 12, 24, 14);
Dialog^.Insert(New(PButton, Init(R, 'O~K~', cmOk, bfDefault)));
R.Assign(2, 2, 38, 11);
Dialog^.Insert(New(PStaticText, Init(R, S)));
MakeInfoDialog := Dialog;
end;
{-------------------------------------------------------------------------}
{--- Section 2: €ЁжЁ «Ё§ жЁп Ёд®а¬ жЁЁ ® Є®¬ЇмовҐаҐ ---}
{-------------------------------------------------------------------------}
var
HardwareFile: Text;
SaveExit: Pointer;
{$F+}
procedure CSDialogExitProc;
var
i: Integer;
begin
{
Debug Feature: Info Printer
for i := 1 to HardwareCount do begin
writeln(HardwareStrings^[i]);
end;
writeln(Sizeof(HardwareInfos^));
writeln(Sizeof(HardwareStrings^));
}
ExitProc := SaveExit;
{ Dispose(HardwareStrings); }
Dispose(HardwareInfos);
end;
{$F-}
function FindNextToken(var i: Integer; S: String): String;
var
j, k: Integer;
begin
k := Length(S);
while ((S[i] = #32) or (S[i] = #9)) and (i < k) do Inc(i);
j := i;
repeat Inc(i); until (i > k) or (S[i] = #32) or (S[i] = #9);
FindNextToken := Copy(S, j, i - j);
end;
procedure DecodeHardwareString(i: Integer);
var
j, k: Integer;
A: String;
S: String;
Code: Integer;
Value1: Integer;
Value2: Real;
Done: Boolean;
begin
j := 1;
A := HardwareStrings^[i];
{ ЁйҐ¬ §ў ЁҐ Є®¬Ї ЁЁ }
S := FindNextToken(j, A);
HardwareInfos^[i].Company := S;
{ ЁйҐ¬ §ў ЁҐ –Џ }
S := FindNextToken(j, A);
HardwareInfos^[i].CPUName := S;
{ ЁйҐ¬ з бв®вг –Џ, Ё § ®¤® (Ґб«Ё Ґбвм) ®бв в®Є бва®ЄЁ б вЁЇ®¬ –Џ }
Done := False;
repeat
S := FindNextToken(j, A);
Val(S, Value1, Code);
if S = '' then begin
HardwareInfos^[i].CPUType := High(CPUItemsNum) + 1;
Break;
end;
if Code <> 0 then begin
HardwareInfos^[i].CPUName := HardwareInfos^[i].CPUName + ' ' + S;
end else begin
for k := Low(CPUItemsNum) to High(CPUItemsNum) do begin
if CPUItemsNum[k] = Value1 then begin
HardwareInfos^[i].CPUType := k;
Done := True;
Break;
end;
end;
if not Done then
HardwareInfos^[i].CPUName := HardwareInfos^[i].CPUName + ' ' + S;
end;
until Done;
{ ЁйҐ¬ ®ЎкҐ¬ Ћ‡“ }
S := FindNextToken(j, A);
Val(S, Value2, Code);
if Code <> 0 then begin
HardwareInfos^[i].RAMType := High(RAMItemsNum) + 1;
end else begin
Value2 := Value2 * 10;
Value1 := Trunc(Value2);
Done := False;
for k := Low(RAMItemsNum) to High(RAMItemsNum) do begin
if RAMItemsNum[k] = Value1 then begin
HardwareInfos^[i].RAMType := k;
Done := True;
Break;
end;
end;
if not Done then HardwareInfos^[i].RAMType := High(RAMItemsNum) + 1;
end;
{ €йҐ¬ ®ЎкҐ¬ Ќ†Њ„ }
S := FindNextToken(j, A);
Val(S, Value1, Code);
if Code = 0 then begin
HardwareInfos^[i].HDDSpace := Value1;
end else
HardwareInfos^[i].HDDSpace := 0;
{ €йҐ¬ Љ®«-ў® ѓЊ„ }
S := FindNextToken(j, A);
Val(S, Value1, Code);
if Code = 0 then begin
HardwareInfos^[i].FDDCount := Value1;
end else
HardwareInfos^[i].FDDCount := 0;
{ Ќ §ў ЁҐ ¬®Ёв®а }
S := FindNextToken(j, A);
HardwareInfos^[i].Monitor := S;
{ € Ї®б«Ґ¤®Є бзЁвлў Ґ¬ жҐг... }
repeat
S := FindNextToken(j, A);
if S = '' then begin
HardwareInfos^[i].Price := 0;
Break;
end;
Val(S, Value1, Code);
if Code = 0 then begin
HardwareInfos^[i].Price := Value1;
Break;
end else
HardwareInfos^[i].Monitor := HardwareInfos^[i].Monitor + ' ' + S;
until False;
end;
procedure InitializeHardware;
var
S: String;
i: Integer;
Done: Boolean;
begin
{ Ќ 室Ё¬ бва®Єг б®бв®пйго Ё§ зҐав®зҐЄ }
repeat
if Eof(HardwareFile) then Exit;
ReadLn(HardwareFile, S);
if Length(S) > 0 then Done := True;
for i := 1 to Length(S) do
if (S[i] <> '-') and (S[i] <> ' ') then Done := False;
until Done;
{ ‘зЁвлў Ґ¬ бва®ЄЁ б ®ЇЁб ЁҐ¬ Є®¬ЇмовҐа®ў }
repeat
if Eof(HardwareFile) then Break;
ReadLn(HardwareFile, S);
Inc(HardwareCount);
HardwareStrings^[HardwareCount] := S;
until HardwareCount >= nMaxHardwareInfos; { ‡ йЁв Їа®вЁў ЇҐаҐЇ®«ҐЁп }
{ „ҐЄ®¤Ёа㥬 Ёе }
for i := 1 to HardwareCount do
DecodeHardwareString(i);
end;
begin
HardwareCount := 0;
Assign(HardwareFile, 'hwpc.txt');
{$I-}
Reset(HardwareFile);
{$I+}
if IOResult <> 0 then begin
WriteLn('ERROR: ЌҐ ¬®Јг ®вЄалвм д ©« hwpc.txt');
Halt(255);
end;
New(HardwareInfos);
New(HardwareStrings);
InitializeHardware;
Dispose(HardwareStrings);
Close(HardwareFile);
SaveExit := ExitProc;
ExitProc := @CSDialogExitProc;
end.