6. “Численные методы в инженерных исследованиях” / В. Е. Краскевич, К. Х. Зеленский, В. И. Гречко.-К.: Вища шк.,1986.-263 с.
7. Перминов О. Н. “Программирование на языке Паскаль”.- М.: Радио и связь,1988.-244 с.: ил.
8. Електронний довідник „Поради по Delphiвід Валентина Озерова”
9. Інтернет ресурси :
http://www.vesna.org.ua
http://www.jeep.avtograd.ru/Converters/Length_converter.htm
http://onebit.narod.ru/metrix.htm
http://decoder.ru
Додатки
Вигляд закладки „Час у різних країнах”
Вигляд закладки „Одиниці вимірювання”
Вигляд закладки „Системи числення”
Лістинг програми
program Metrix;
uses
Forms,
Main in 'Main.pas' {MainForm},
Bases in 'Bases.pas',
UkrRecog in 'UkrRecog.pas';
{$R *.res}
begin
Application.Initialize;
Application.Title := 'Довідник : одиницівимірювання, с-мачислення, часурізнихкраїнах.';
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
Програма складається з 3-х модулів :
1. Main – Знаходиться опис головної форми і її методів включаючи основні алгоритми.
2. Bases – в цьому модулі описана процедура переводу систем числення.
3. UkrRecog – тут запрограмована функція переводу цілих чисел в словесний вигляд.
1)unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls, Registry, Menus, UkrRecog, Bases,
Spin, IniFiles, Buttons ;
type
TMainForm = class(TForm)
PageControl: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
ComboGMT: TComboBox;
Label1: TLabel;
CurTime: TLabel;
TimeTimer: TTimer;
Label2: TLabel;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
Label3: TLabel;
FindedTime: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Base1: TSpinEdit;
Base2: TSpinEdit;
Animate1: TAnimate;
StatusBar1: TStatusBar;
RadioGroup: TRadioGroup;
Panel: TPanel;
MEdit: TEdit;
MButton: TSpeedButton;
MLabel: TLabel;
Label4: TLabel;
Label_: TLabel;
Label6: TLabel;
Label7: TLabel;
Label_2: TLabel;
Label_1: TLabel;
procedure TimeTimerTimer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure RadioGroupClick(Sender: TObject);
procedure MButtonClick(Sender: TObject);
private
F : TIniFile;
Edits : arrayof TEdit;
procedure InitMetrix;
procedure LoadSetings;
procedure SaveSetings;
{ Private declarations }
public
{ Public declarations }
end;
const
SetingsFile='Metrix.ini'; // файл опцій програми
IniFile='Metrix.inf'; // файл параметрів переводу систем числення
GMTFile= 'GMTs.inf' ; // файл з інформацією про часові зони
FormatString = 'Число в %Sковій системі числення';
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.FormCreate(Sender: TObject);
begin
InitMetrix;
ComboGMT.Items.Clear;
ComboGMT.Items.LoadFromFile(ExtractFilePath(Application.ExeName)+ GMTFile);
ComboGMT.ItemIndex:=1;
Edit1Change(Sender);
LoadSetings;
end;
// Ініціалізація, завантаження параметрів
procedure TMainForm.InitMetrix;
begin
try
F := TIniFile.Create(ExtractFilePath(Application.ExeName)+IniFile);
except
on Exception do Close;
end;
f.ReadSections( RadioGroup.Items );
RadioGroup.Items.Delete(0);
RadioGroup.ItemIndex:=0;
end;
// Завантаження заголовків одиниць вимірювання в RadioGroup.
procedure TMainForm.TimeTimerTimer(Sender: TObject);
var Finded : TDateTime;
begin
CurTime.Caption:=TimeToStr(Now);
try
if ComboGMT.Text[5]='+' then
Finded:= Now + StrToTime(copy(ComboGMT.Text,6,5)) - StrToTime('02:00')
else
Finded:= Now - StrToTime(copy(ComboGMT.Text,6,5)) - StrToTime('02:00');
FindedTime.Caption:=TimeToStr(Finded);
except
end;
end;
// Порахунок і відображення часу
procedure TMainForm.N1Click(Sender: TObject);
var
reg : TRegistry;
ts : TStrings;
i : integer;
s : string[150];
begin
TimeTimer.Enabled := False;
ComboGMT.Items.Clear;
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey( 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones', false);
if reg.HasSubKeys thenbegin
ts := TStringList.Create;
reg.GetKeyNames(ts);
reg.CloseKey;
for i := 0 to ts.Count -1 dobegin
reg.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\' + ts.Strings[i], false);
s:= reg.ReadString('Display')+' ('+reg.ReadString('Std');
s:=Copy(s,0,length(s)-7);
ComboGMT.Items.Add(s+')');
reg.CloseKey;
end;
ts.Free;
ComboGMT.ItemIndex:=1;
ComboGMT.Items.SaveToFile(ExtractFilePath(Application.ExeName)+ 'GMTs.inf');
TimeTimer.Enabled := True;
endelse
reg.CloseKey;
reg.free; end;
procedure TMainForm.N2Click(Sender: TObject);
begin
ComboGMT.Items.Clear;
ComboGMT.Items.LoadFromFile(ExtractFilePath(Application.ExeName)+ 'GMTs_default.inf');
ComboGMT.Items.SaveToFile(ExtractFilePath(Application.ExeName)+ 'GMTs.inf');
end;
// виклик контекстного меню – поновлення інформації про часові пояси
procedure TMainForm.Edit1Change(Sender: TObject);
Var
NumStr : String;
Radix : LongInt;
ResultStr : String;
NewRadix : LongInt;
begin
try
NumStr := Edit1.Text;
Radix := Base1.Value;
NewRadix:= Base2.Value;
RadixStr(NumStr,Radix,NewRadix,ResultStr);
Edit2.Text := Copy( ResultStr,0,length(ResultStr));
Label_1.Caption:=Format(FormatString, [UkrRecognizeAmount(Base1.Value)]);
Label_2.Caption:=Format(FormatString, [UkrRecognizeAmount(Base2.Value)]);
exceptend;
//Beep;
end;
// викликається на зміну числа або основи для переводу
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
try
F.Free;
exceptend;
SaveSetings;
end;
// при виході закриває файли і зберігає установки
procedure TMainForm.RadioGroupClick(Sender: TObject);
var MItems : TStrings; // Назви величин
i, t : integer;
begin
MItems := TStringList.Create;
Panel.Free; // знищення попередньої панелі
Panel := TPanel.Create(TabSheet1);// і створення нової
Panel.Parent := TabSheet1;
Panel.Align := alClient;
Panel.Caption:='';
Panel.BevelInner := bvRaised;
Panel.BevelOuter :=bvLowered;
try
F.ReadSection(RadioGroup.Items[RadioGroup.ItemIndex], MItems);
t:= round((210-MItems.Count*20)/2); // центрування
SetLength(Edits, MItems.Count); // зміна розміру масиву Edits for i := 0 to MItems.Count-1 do
begin
Mlabel := TLabel.Create(Panel);
Mlabel.Parent := Panel;
Mlabel.Left:=10;
Mlabel.Top := i*20+t+1;
Mlabel.Caption := MItems[i]; // відображення назв величин
MLabel.Hint:=MItems[i];
MEdit := TEdit.Create(Panel);
MEdit.Parent := Panel;
MEdit.Left := 140;
MEdit.Top := i*20+t;
MEdit.Height:=18;
MEdit.Width :=100;
MEdit.Hint:=MItems[i]; // створення Edits для редагування значень
Edits[i]:=MEdit;
MButton := TSpeedButton.Create(Panel);
MButton.Parent := Panel;
MButton.Left := 243;
MButton.Top := i*20+t;
MButton.Height:= 20;
MButton.Width := 85;
MButton.Caption:='Перерахунок'; // створення кнопок
MButton.Flat := True;
MButton.Hint:=MItems[i];
MButton.OnClick := MButtonClick;
end;
finally
MItems.Free;
end;
StatusBar1.SimpleText:= RadioGroup.Items[RadioGroup.ItemIndex];
end;
// знищує попередню панель і створює нову відповідно до вибраного пункту
procedure TMainForm.MButtonClick(Sender: TObject);
// Реакція на кнопку „Перерахунок”
var i, j : integer;
val, Y, X, Etalon : Extended;
begin
val:=1;
for i := 0 to High(Edits) do
begin
if Edits[i].Hint=( Sender as TSpeedButton).Hint then
begin
try // знайдено Edits[i] до якого викликано процедуру
if Edits[i].Text<>'' then
val := StrToFloat(Edits[i].Text)
elsebegin Edits[i].Text:='1'; val:=1; end;
Break;
except
on EConvertError do ShowMessage('Невірнийформатчисла');
end; // try
end; //if
end; //for
X := F.ReadFloat(RadioGroup.Items[RadioGroup.ItemIndex],
( Sender as TSpeedButton).Hint, 1.0) ;
Etalon := val * X;
// Взяття введеного значення і приведення до „еталону”
for i := 0 to High(Edits) do
begin
if Edits[i].Hint<>( Sender as TSpeedButton).Hint then
begin
Y := Etalon / F.ReadFloat(RadioGroup.Items[RadioGroup.ItemIndex],
Edits[i].Hint , 1.0) ;
// знаходження вихідної величини і подальше її форматування
Edits[i].Text:=FloatToStr(Y);
if (pos(',', Edits[i].Text)>0) and (pos('E', Edits[i].Text)=0) thenbegin
for j:= pos(',', Edits[i].Text)+1 to Length(Edits[i].Text) do
if (Edits[i].Text[j]<>'0') then break;
Edits[i].Text:=copy( Edits[i].Text,0,j-1+5);
// число значущих цифр після коми
end;
end; //if
end; //for
Beep; // звук
end;
// перерахунок величин
procedure TMainForm.LoadSetings;
var Setings : TIniFile;
begin
Setings := TiniFile.Create(ExtractFilePath(Application.ExeName)+SetingsFile);
try
MainForm.Left:= Setings.ReadInteger('Window Setings', 'Left', MainForm.Left);
MainForm.Top := Setings.ReadInteger('Window Setings', 'Top', MainForm.Top);
PageControl.ActivePageIndex:= Setings.ReadInteger('Setings', 'ActivePage', PageControl.ActivePageIndex);
RadioGroup.ItemIndex:= Setings.ReadInteger('Metrix Setings', 'Metix_Index', RadioGroup.ItemIndex);
ComboGMT.ItemIndex:= Setings.ReadInteger('Time Setings', 'GMT_Index', ComboGMT.ItemIndex);
Base1.Value:= Setings.ReadInteger('Base Setings', 'Base1', Base1.Value);
Base2.Value:= Setings.ReadInteger('Base Setings', 'Base2', Base2.Value);
finally
Setings.Free;
end;
end;
// завантаження параметрів з файлу
procedure TMainForm.SaveSetings;
var Setings : TIniFile;
begin
Setings := TiniFile.Create(ExtractFilePath(Application.ExeName)+SetingsFile);
try
Setings.WriteInteger('Window Setings', 'Left', MainForm.Left);
Setings.WriteInteger('Window Setings', 'Top', MainForm.Top);
Setings.WriteInteger('Setings', 'ActivePage', PageControl.ActivePageIndex);
Setings.WriteInteger('Metrix Setings', 'Metix_Index', RadioGroup.ItemIndex);
Setings.WriteInteger('Time Setings', 'GMT_Index', ComboGMT.ItemIndex);
Setings.WriteInteger('Base Setings', 'Base1', Base1.Value);
Setings.WriteInteger('Base Setings', 'Base2', Base2.Value);
Setings.UpdateFile;
finally
Setings.Free;
end;
end;
// збереженняння параметрів до файлу
end.
2)unit Bases;
interface
// переведення числа з однією основою до іншої
procedure RadixStr(NumStr : String;
Radix : LongInt;
NewRadix : LongInt;
var
ResultStr : String);
implementation
uses SysUtils;
procedure RadixStr(NumStr : String; // введене число
Radix : LongInt; // основа введеного числа
NewRadix : LongInt; // основа шуканого числа
var
ResultStr : String);// шукане число
var
RadixChar : String;
v : Int64; //111111111111111111111111111111111111111111111111111111111111111
i : LongInt;
p : Int64;
begin
if ((Abs(Radix) < 2) or (Abs(Radix) > 36)) then Exit;
if ((Abs(NewRadix) < 2) or (Abs(NewRadix) > 36)) then Exit;
RadixChar:='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
ResultStr:= Copy( NumStr, 0, Length(NumStr));
v := 0;
UpperCase(ResultStr); // перевірка та задання початкових параметрів
for i := 1 to (Length(ResultStr)) do
begin
p := Pos(ResultStr[i] , RadixChar) - 1;
if ((p < 0) or (p >= Abs(Radix))) thenbegin
Exit; // Перевірка правильності вводу
end;
v := v * Abs(Radix) + p; // підрахунок числа в десятковому форматі
if (v < 0 ) thenbegin
ResultStr:= 'Помилкавводузначенняперевищує 64^2 = '+IntToStr(High(Int64))+'(10)';
exit;
end;
end;
if v = 0 thenbegin
ResultStr := '0';
exit;
endelsebegin
i:=1;
repeat
SetLength(ResultStr,i);
ResultStr[i] := RadixChar[(v mod NewRadix)+1];
v := v div NewRadix;