Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.07.03;
Скачать: [xml.tar.bz2];

Вниз

работа с процедурными и перечисляемыми типами данных   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.004 c
2-1301387189
ZV
2011-03-29 12:26
2011.07.03
Как вывести значение переменной в виде символа


15-1300224592
Юрий
2011-03-16 00:29
2011.07.03
С днем рождения ! 16 марта 2011 среда


15-1300200658
OW
2011-03-15 17:50
2011.07.03
А помните тут кто-то скрины раб столов собирал?


2-1301173364
Fr
2011-03-27 00:02
2011.07.03
Смещение ячеек в TDrawGrid


2-1301336263
Drowsy
2011-03-28 22:17
2011.07.03
В обработчике какого события можно перехватить ошибку





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский