Смекни!
smekni.com

Довідник одиниці вимірювання система числення час у різних країнах (стр. 3 из 4)

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;