|
Вопрос # 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]:
При определенных условиях описанный мною метод можно расширять не перекомпилируя приложение...
Т.е. добавлять нужные тебе функции уже после компиляции основного проекте. Если надо могу рассказать об этом по подробнее.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|