![]() |
|
|
|
|
#1
|
|||
|
|||
|
Помогите с классом, он должен быть оформлен как один модуль отвечающий за определённые действия(в моём случае за перевод систем счисления), я нашёл программку в одном из ранних топиков(Спасибо автору!) но не дойдёт до меня что я делаю не так...
Вот основной модуль: Код:
unit osnov;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Vcl.StdCtrls, classunit;
type
TForm1 = class(TForm)
edChisDec: TEdit; // Исходное число в десятичной системе счисления.
edOsnovNew: TEdit; // Число задающее основание системы счисления.
edRezul: TEdit; //Результат преобразования DecToX
edPrecision: TEdit; // Точность преобразования - количество знаков после запятой в edRezul
btnPreobr: TButton; // Кнопка по нажатию на которую происходит преобразование.
{ Ниже - надписи для перечисленных выше элементов }
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
procedure btnPreobrClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btnPreobrClick(Sender: TObject);
begin
edRezul.Text := DecimalToXStr(
StrToInt(edOsnovNew.Text),
StrToInt(edPrecision.Text),
StrToFloat(edChisDec.Text)
);
end;
end.А вот тот самый модуль: Код:
unit classunit;
interface
uses SysUtils;
type
TPerevod = Class(TObject)
private
function IntToDigit(aVal : Byte) : String;
function DecimalToXStr (aBase : Byte; Precision : Byte; aVal : Extended) : String;
end; // Конец определения класса TPerevod
// Фактически, класс TForm1 теперь определен}
implementation
function IntToDigit(aVal : Byte) : String;
begin
case aVal of
0..9 : Result := IntToStr(aVal);
10 : Result := 'A';
11 : Result := 'B';
12 : Result := 'C';
13 : Result := 'D';
14 : Result := 'E';
15 : Result := 'F';
end;
end;
function DecimalToXStr (aBase : Byte; Precision : Byte; aVal : Extended) : String;
var
Val : Extended;
IntVal : Int64;
FracVal : Extended;
StrInt : String;
StrFrac : String;
i : Integer;
begin
// Получаем целую и дробную части числа.
IntVal := Trunc(aVal);
FracVal := Frac(aVal);
//Переводим целую часть.
StrInt := '';
repeat
StrInt := IntToDigit(IntVal mod aBase) + StrInt;
IntVal := IntVal div aBase;
until IntVal = 0;
// Если дробная часть = 0, то перевод закончен.
if FracVal = 0 then begin
Result := StrInt;
exit;
end;
//Переводим дробную часть. Точность - до Precision цифр после запятой.
StrFrac := '';
for i := 1 to Precision do begin
Val := FracVal * aBase;
StrFrac := StrFrac + IntToDigit(Trunc(Val));
FracVal := Frac(Val);
//Если дробная часть = 0, то перевод закончен.
if FracVal = 0 then Break;
end;
Result := StrInt + ',' + StrFrac;
end;
end.P.S. Дело с Delphi имею в первые, и работаю в XE5, смешно но другого небыло) |
|
#2
|
|||
|
|||
|
P.P.S. Вот на что ругается
|
|
#3
|
||||
|
||||
|
Просто в секции Implementation функция IntToDigit должна быть указана с именем класса, так как является его частью.
Код:
implementation function TPerevod.IntToDigit(aVal : Byte) : String; ... P.S. Небольшее дополнение. Небходимо декларацию вынести из private в public, иначе они будут недоступны вызывающей программе. Последний раз редактировалось angvelem, 07.01.2014 в 04:00. |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
kotophei999 (07.01.2014)
| ||
|
#4
|
|||
|
|||
|
Цитата:
а теперь в основном модуле ругается Код:
procedure TForm1.btnPreobrClick(Sender: TObject);
begin
edRezul.Text := TPerevod.DecimalToXStr(
StrToInt(edOsnovNew.Text),
StrToInt(edPrecision.Text),
StrToFloat(edChisDec.Text)
); |
|
#5
|
||||
|
||||
|
И правильно делает. Как можно обращаться к несуществующему объекту.
Код:
procedure TForm1.btnPreobrClick(Sender: TObject);
begin
with TPerevod.Create do
try
edRezul.Text := DecimalToXStr(StrToInt(edOsnovNew.Text), StrToInt(edPrecision.Text), StrToFloat(edChisDec.Text));
finally
Free;
end; |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
kotophei999 (07.01.2014)
| ||
|
#6
|
|||
|
|||
|
Спасибо огромное!!!
|