Текущий архив: 2011.07.03;
Скачать: CL | DM;
Внизработа с процедурными и перечисляемыми типами данных Найти похожие ветки
← →
S_K © (2011-03-28 10:39) [0]Доброе время суток!
На дельфи начала программировать недавно и натолкнулась на проблему с которой не могу справиться сама. Если кто сможет подсказать по существу буду вам очень благодарна. Суть проблемы:
Имеется тип данных
type TFunc = (Rev, Sqr); {перечисляемый тип, содержит названия методов класса TFrac, находящемся в другом Unit}
TFuncF = function (): TFrac of object; {описание процедурного типа, параметры соотв.методов}
var tff: TFuncF;
mFun: TFunc;
далее по программе в определенный момент нужно выполнить (допустип ранее mFun:=Rev;)
tff:=mFun;
вот тут и возникает вопрос? Компилятор сообщает об ошибке несоответствия типов TFuncF и TFunc. Как быть?
Нашла в литературе вот такое использование:
const tff: array[TFunc] of TFuncF=(Rev, Sqr);
var mFun: TFunc;
и за тем обращение tff[mFun]
но тоже выдает ошибку не объявлена переменная Rev.
Может кто сталкивался с подобным, подскажите?!
← →
DiamondShark © (2011-03-28 11:03) [1]
> Может кто сталкивался с подобным, подскажите?!
Да все сталкивались, каждый день тут сталкиваемся с подобным.
Чепуха какая-то опять написана.
У вас есть два пути:
1. Верить компилятору, и исправить те ошибки, о которых он сообщает.
2. Написать здесь по-русски, чего вы хотите добиться.
← →
RWolf © (2011-03-28 11:05) [2]приведённый код вполне рабочий.
type
TFuncF = function : Integer;
function x:Integer;
begin
Result:=1;
end;
function y:Integer;
begin
Result:=2;
end;
const
tff: array[1..2] of TFuncF=(x, y);
var
mFun: TFuncF;
procedure TForm1.FormCreate(Sender: TObject);
begin
mfun:=tff[1];
ShowMessage(IntToStr(mfun));
end;
← →
Плохиш © (2011-03-28 11:26) [3]
> type TFunc = (Rev, Sqr); {перечисляемый тип, содержит
> названия методов класса TFrac, находящемся в другом Unit}
Враньё, никакие это не названия и не методы класса.
← →
S_K © (2011-03-28 11:53) [4]Опишу подробнее ситуацию:
есть модуль определения класса простая дробь
(состав модуля буду немного сокращать, чтоб конкретно по делу):unit UFrac;
interface
type TFrac= class
private
FA: integer; //числитель дроби
FB: integer; //знаменатель дроби
public
constructor Create (newn : string); overload;
function Sqr (): TFrac; //квадрат дроби
function Rev (): TFrac; //обратная дробь
end;
implementation
constructor TFrac.Create (newn : string); //êîíñòðóêòîð ñòðîêà
var n : integer;
begin
n:= System.Pos("/",newn);
FA:= StrToInt(System.Copy(newn,1,(n - 1)));
Delete(newn,1,n);
FB:= StrToInt(System.Copy(newn,1,Length(newn)));
end;
function TFrac.Sqr (): TFrac; far;
var c,e: integer;
begin
c:= FA * FA;
e:= FB * FB;
Sqr:= TFrac.Create(c,e);
end;
function TFrac.Rev (): TFrac; far;
begin
if Correct(FA) then
Rev:=TFrac.Create(FB,FA)
else Rev:=TFrac.Create(FA,FB);
end;
end.
Имеется модуль работы процессора/калькулятора:unit UProc;
interface
Uses UFrac;
type TOprtn = (None, Add, Sub, Mul, Del);
TFunc = (mRev, mSqr);
TFuncF = function (): TFrac of object;
TOprtnF = function (sender: TFrac): TFrac of object;
TProc= class
FLop_Res: TFrac; //правый операнд и резуьтат
FRop: TFrac; //левый операнд
FOperation: TOprtn; //состояние процессора
FError : String; //поле ошибки
constructor Create();
procedure FuncRun (mFunc: Integer); //выполнение функции
end;
const tff1: array[TFunc] of TFuncF=(Rev, Sqr);
implementation
constructor TProc.Create();
begin
FLop_Res:=TFrac.Create("0/1");
FRop:=TFrac.Create("0/1");
FError:="";
FOperation:=None;
end;
procedure TProc.FuncRun(MFunc: TFunc);
begin
try
FRop:=FRop.tff1[MFunc];
except
FError:="Ошибка";
exit;
end;
end;
end.
Ну и основная форма программы:unit l3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, UFrac, UProc;
type
TForm1 = class(TForm)
edt1: TEdit;
btn9: TButton;
btn10: TButton;
procedure btn9Click(Sender: TObject);
procedure btn10Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
p: TProc;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
edt1.Text:="0/1";
p:=TProc.Create;
end;
procedure TForm1.btn9Click(Sender: TObject);
var tmp: TFrac;
begin
tmp:=TFrac.Create(edt1.Text);
p.Rop_Set(tmp);
p.FuncRun(Rev);
tmp:=p.Rop;
edt1.Text:=tmp.Frac;
tmp.Free;
edt1.SetFocus;
end;
procedure TForm1.btn10Click(Sender: TObject);
var tmp:TFrac;
begin
tmp:=TFrac.Create(edt1.Text);
p.Rop_Set(tmp);
p.FuncRun(Sqr);
tmp:=p.Rop;
edt1.Text:=tmp.Frac;
tmp.Free;
edt1.SetFocus;
end;
end.
← →
DiamondShark © (2011-03-28 12:02) [5]
> S_K © (28.03.11 11:53) [4]
Для тебя русский язык не родной?
Кому нафиг твоя портянка нужна? Ты можешь по-человечески описать задачу?
Если не можешь, то и программировать нечего.
← →
S_K © (2011-03-28 12:04) [6]Класс TFrac ключает в себя еще один конструктор:
constructor TFrac.Create (a,b: integer);
begin
FA:=a;
FB:=b;
end;
← →
Плохиш © (2011-03-28 12:08) [7]
> const tff1: array[TFunc] of TFuncF=(Rev, Sqr);
минимум
const tff1: array[TFunc] of TFuncF=(TFrac.Rev, TFrac.Sqr);
← →
S_K © (2011-03-28 12:10) [8]
DiamondShark © (28.03.11 12:02) [5]
> Для тебя русский язык не родной?
> Кому нафиг твоя портянка нужна? Ты можешь по-человечески
> описать задачу?
> Если не можешь, то и программировать нечего.
А для тебя элементарная вежливость не приоритет общения?
Вопрос описан в первом сообщении. Вопрос применим к коду в 4 сообщении. Что непонятно?
В процедуру передается название метода класса который нужно применить к соответствующему полю. Но при данном описании вылетает ошибка которую не удается мне обгойти. Вопрос: как обойти данную ошибку, либо как выполнить описанную выше задачу без изменения модуля UFrac
← →
S_K © (2011-03-28 12:13) [9]
> Плохиш © (28.03.11 12:08) [7]
>
> > const tff1: array[TFunc] of TFuncF=(Rev, Sqr);
>
> минимум
>
> const tff1: array[TFunc] of TFuncF=(TFrac.Rev,
> TFrac.Sqr);
так тоже пробовала. КОмпилятор:
Incompatible types:"TFuncF" and "Procedure"
← →
Плохиш © (2011-03-28 12:15) [10]
> Что непонятно?
Тут такое дело.
Это у Вас проблема. И это Вы пришли сюда с просьбами о помощи.
Тут Вам никто ничего не должен, равно как и разбираться в Вашем коде.
PS. Надеюсь я всё достаточно вежливо объяснил.
← →
S_K © (2011-03-28 12:31) [11]Я мне кажется я тоже достаточно вежливо выложила свой конкретный вопрос.
Написали:...вранье, фигня..
Я выложила код применимый к данному вопросу и что мне нужно сделать.
Я не хочу ни с кем выяснять отношения. Мне просто нужен нормальный совет применимый к именно моей программе. Мне не нужна совершенно новая программа, т.к. задание дано в соответствии со спецификациями (как тут не выложить код?).
← →
clickmaker © (2011-03-28 12:52) [12]в таком виде
tff1: array[TFunc] of TFuncF=(TFrac.Rev, TFrac.Sqr);
функции могут быть только статическими - class function Rev
как ты себе представляешь массив указателей на методы не созданного еще объекта?
← →
DiamondShark © (2011-03-28 12:59) [13]
> S_K © (28.03.11 12:31) [11]
Т.е., ты предлагаешь НАМ по неработающему коду восстановить, какое ТЕБЕ было задание.
А пересказать своё задание на том же языке, на котором оно тебе было выдано ты отказываешься.
При этом ещё посюсюкать вокруг тебя со всей великосветской вежливостью.
Я правильно понял? Ничего не перепутал?
← →
S_K © (2011-03-28 13:04) [14]
> clickmaker © (28.03.11 12:52) [12]
> в таком виде
> tff1: array[TFunc] of TFuncF=(TFrac.Rev, TFrac.Sqr);
> функции могут быть только статическими - class function Rev
и как правильно в данном случае будет вызвать нужный метод?
← →
clickmaker © (2011-03-28 13:08) [15]var tff1: array[TFunc] of TFuncF;
tff1[mRev] := FRop.Rev;
tff1[mSqr] := FRop.Sqr;
← →
S_K © (2011-03-28 13:08) [16]
> DiamondShark © (28.03.11 12:59) [13]
> Т.е., ты предлагаешь НАМ по неработающему коду восстановить,
> какое ТЕБЕ было задание.
> А пересказать своё задание на том же языке, на котором оно
> тебе было выдано ты отказываешься.
> При этом ещё посюсюкать вокруг тебя со всей великосветской
> вежливостью.
>
> Я правильно понял? Ничего не перепутал?
Нет, я не прошу "сюсюкаться". Я прошу тех, кто умееть читать код, подсказать где я ошиблась. А хамов, и тех кто просто хочет, повые.. какой он типа умный..прошу не беспокоится и не забивать форум!
← →
DiamondShark © (2011-03-28 13:09) [17]
> и как правильно в данном случае будет вызвать нужный метод?
1. Прямо. Так, как вызывается метод любого объекта.
2. Косвенно. Заполнив массив ссылками на метод ПОСЛЕ создания нужного экземляра.
Но это всё не важно. Если в галиматье каждый отдельный оператор будет формально правилен, галиматья всё равно останется галиматьёй.
← →
S_K © (2011-03-28 13:09) [18]
> clickmaker © (28.03.11 13:08) [15]
> var tff1: array[TFunc] of TFuncF;
>
> tff1[mRev] := FRop.Rev;
> tff1[mSqr] := FRop.Sqr;
Спасибо. Сейчас попробую так.
← →
DiamondShark © (2011-03-28 13:20) [19]
> S_K © (28.03.11 13:08) [16]
> Нет, я не прошу "сюсюкаться".
А с формулировкой задачи, значит, всё как я сказал? Предлагаешь телепать?
> Я прошу тех, кто умееть читать код, подсказать где я ошиблась
Лучше всех умеет читать код компилятор. Он тебе уже сказал где.
> А хамов, и тех кто просто хочет, повые.. какой он типа умный.
> .прошу не беспокоится и не забивать форум!
Да. Я умный. А ты -- нет. Именно поэтому У ТЕБЯ проблема, а не у меня.
Хлеб за пузом не ходит, как бы тебя это ни расстраивало.
Пока ты не начнёшь ВНЯТНО описывать проблему, ты не получишь никакого решения. И здесь тебе никто ничего не должен.
← →
S_K © (2011-03-28 13:27) [20]
> clickmaker © (28.03.11 13:08) [15]
> var tff1: array[TFunc] of TFuncF;
>
> tff1[mRev] := FRop.Rev;
> tff1[mSqr] := FRop.Sqr;
Спасибо огромное clickmaker! так действительно все правильно работает! Вопрос исчерпан.
Страницы: 1 вся ветка
Текущий архив: 2011.07.03;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.004 c