Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 88

/ вопрос открыт /

У меня есть мои функции:
VVV(S: String): String;
V(S: String): String;
Функция VVV(S: String): String фозвращает текст длиной 3 символа. Если S менше чем 3 символа, то функция добавит вначале нужное количество нулей. Например S=k. Функция вернет 00k.

Функция V(S: String): String тоже фозвращает текст длиной 3 символа. Если S менше чем 3 символа, то функция добавит вконце нужное количество нулей. Например S=k. Функция вернет k00.

Как сделать чтобы пользователь сам выбирал какую ему функцию использовать?
Хочу чтобы в момент когда нужна эта функция, она читалась с нужного параметра в ini-файле, ранее сохраненного пользователем.

Поставль вопрос по-другому!!!!!
В ini-файле записано
[Function]
Funk1=VVV(S)
Funk2=V(S)

Если надо SSS:=VVV(S)+V(S);, то как функции прочитать из ini-файла, чтобы они передались как функции, а не как строки (чтобы было SSS=00kk00, а не SSS=VVV(S)V(S).

Игорь Середюк Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Игорь Середюк (статус: Посетитель)
Вопрос отправлен: 27 июля 2006, 17:47
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: bruder

Здравствуйте, Игорь Середюк!
Всё оч просто. Ставь условия.
var b1, b2: boolean;
if IniF.WriteString('Function','Funk1','VVV(S)')='VVV(S)' then bo1 := true else bo1 := false;
if IniF.WriteString('Function','Funk2','V(S)')='V(S)' then bo2 := true else bo2 := false;

Дальше по аналогии.
Удачи.

Ответ отправил: bruder (статус: 4-ый класс)
Время отправки: 27 июля 2006, 19:36

Ответ #2. Отвечает эксперт: Деревяно Евгений

Возможно подойдут процедурные типы:

// определяем процедурный тип. Дальше будет использована переменная этого типа.
TFun = function (S: String): String;
...

// объявляем две функции. В вашем примере это функции V и VVV
function Fun1(S: String): String;
begin
Result := 'This is Fun1. ' + s;
end;

function Fun2(S: String): String;
begin
Result := s + ' This is Fun2. ';
end;

// а теперь небольшой пример использования
procedure TForm1.Button1Click(Sender: TObject);
var
Fun: TFun; // объявляем переменную процедурного типа
begin
// в зависимости от какого-либо флага (записанного в ini) выбираем нужную в дальнейшем функцию
if CheckBox1.Checked then
Fun := Fun1
else
Fun := Fun2;
// и дальше можно работать с процедурной переменной, а не с функциями.
ShowMessage(Fun('Any text'));
end;

А чтобы получить 00kk00, следует объявить третью функцию, которая бы делала бы Fun1 + Fun2. При более сложных вариантах (SSS:=VVV(S)+V(S)+VVV(S)+VVV(S)+V(S) и т.д.) без парсера не обойтись.

ЗЫ:
Следует обратить внимание на то, что определение типа TFun, функций Fun1 и Fun2 должны быть идентичными. Более подробно обо всём этом можно почитать в Delphi Help. Топик Procedural types.

Ответ отправил: Деревяно Евгений (статус: 1-ый класс)
Время отправки: 27 июля 2006, 21:59

Ответ #3. Отвечает эксперт: Виталий Лещенко

Здравствуйте, Игорь Середюк!

Способ №1
if что-то там then что-то там else ;)
Способ №2
Делаешь тип:
type TMyFunc = function(s: string): string;
type
TMyFuncData = record
name: string;
func: TMyFunc;
end;
Затем делаешь массив типа TMyFuncData и инициализиреешь его нужным тебе образом...
Затем читаешь из .ini файла имя, ищеш в списке и используешь нужную функцию...

Ответ отправил: Виталий Лещенко (статус: 4-ый класс)
Время отправки: 28 июля 2006, 00:08
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 28 июля 2006, 00:13; участников в обсуждении: 1.
Виталий Лещенко

Виталий Лещенко (статус: 4-ый класс), 28 июля 2006, 00:13 [#1]:

При определенных условиях описанный мною метод можно расширять не перекомпилируя приложение...
Т.е. добавлять нужные тебе функции уже после компиляции основного проекте. Если надо могу рассказать об этом по подробнее.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:57
Выполнено за 0.02 сек.