Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Case ... of ? 
:(
    Опции темы
Azur
Дата 25.4.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 19.4.2006

Репутация: нет
Всего: нет



Мне нужно сделать проверку  текста в едите(Edit1.text) оператором case ... of  но как я понимаю он не поддерживает тип string . Вопрос: Что мне делать???
Примерно: 
Case Edit1.text of 
... : ... ;
end

так выдает ошибку: Ordinal type required  
PM MAIL   Вверх
Dynamic
Дата 25.4.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 372
Регистрация: 5.7.2004
Где: Салехард

Репутация: 12
Всего: 15



Цитата(Azur @  25.4.2006,  12:21 Найти цитируемый пост)
так выдает ошибку: Ordinal type required   

а строки к порядковым не относятся. так что выбирай либо через кучу if..then..else или в цикле....
 


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
Yanis
Дата 25.4.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Azur @  25.4.2006,  12:21 Найти цитируемый пост)
так выдает ошибку: Ordinal type required   
Конечно, string не перечислимый тип.

Напиши функцию в которую будешь передавать строку, а она будет возвращать число соответствующее определённой строке. 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Yanis
Дата 25.4.2006, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Предлагаю свой вариант:
Код

unit Unit1;

interface

uses { ... };

type
  TTestResult = (trNone, trExit, trCopy, trRun, trDelete);

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

function TestStr(const S: string): TTestResult;
  function IfThen(AValue: Boolean; const ATrue: TTestResult; const AFalse: TTestResult): TTestResult;
  begin
    if AValue then Result := ATrue
    else Result := AFalse;
  end;
const
  params: array[0..4] of string = ('none','exit', 'copy' ,'run' ,'delete');
var
  i: Integer;
  tr: TTestResult;
begin
  for i := Low(params) to High(params) do
    begin
    Result := IfThen(AnsiLowerCase(Copy(s, 1, Length(params[i]))) = params[i], TTestResult(i), trNone);
    if Result > trNone then Break;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  s := 'rUnz';
  case TestStr(s) of
    trExit: ShowMessage('Выходим');
    trCopy: ShowMessage('Копируем');
    trRun: ShowMessage('Запускаем');
    trDelete: ShowMessage('Удаляем');
  end;

  s := 'cOpy6';
  case TestStr(s) of
    trExit: ShowMessage('Выходим');
    trCopy: ShowMessage('Копируем');
    trRun: ShowMessage('Запускаем');
    trDelete: ShowMessage('Удаляем');
  end;


  s := 'ExIt123';
  case TestStr(s) of
    trExit: ShowMessage('Выходим');
    trCopy: ShowMessage('Копируем');
    trRun: ShowMessage('Запускаем');
    trDelete: ShowMessage('Удаляем');
  end;

  s := 'f4ck';
  case TestStr(s) of
    trNone: ShowMessage('Ничего не делаем');
    trExit: ShowMessage('Выходим');
    trCopy: ShowMessage('Копируем');
    trRun: ShowMessage('Запускаем');
    trDelete: ShowMessage('Удаляем');
  end;
end;


P. S. возможно не самый лучший smile 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 25.4.2006, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



можно чуть улучшить вариант 
Yanis, 
Код

type
  TTestResult = (trNone, trExit, trCopy, trRun, trDelete);
var
   a : array[TTestResult] of Ansistring = ('Ничего не делаем', 'Выходим', 'Копируем', 'Запускаем', 'Удаляем');

implementation

{$R *.dfm}

function TestStr(const S: string): TTestResult;
  function IfThen(AValue: Boolean; const ATrue: TTestResult; const AFalse: TTestResult): TTestResult;
  begin
    if AValue then Result := ATrue
    else Result := AFalse;
  end;
const
  params: array[0..4] of string = ('none','exit', 'copy' ,'run' ,'delete');
var
  i: Integer;
  tr: TTestResult;
begin
  for i := Low(params) to High(params) do
    begin
    Result := IfThen(AnsiLowerCase(Copy(s, 1, Length(params[i]))) = params[i], TTestResult(i), trNone);
    if Result > trNone then Break;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 s : ansiString;
begin
  s := 'copy';
  showmessage(a[TestStr(s)]);
end;
  

Это сообщение отредактировал(а) alexeis1 - 25.4.2006, 13:54


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Yanis
Дата 25.4.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(alexeis1 @  25.4.2006,  13:37 Найти цитируемый пост)
можно чуть улучшить вариант 

Если этот пример служит только для отображения сообщений, то можно так улучшить. smile Но что бы выполнять код нужен case ... of ... end;
Код

Res = Set of TTestResult;
 зачем? 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 25.4.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Yanis, сорри не все лишнее убрал smile  smile  smile

Добавлено @ 13:58 
Цитата(Yanis @  25.4.2006,  12:45 Найти цитируемый пост)
 Но что бы выполнять код нужен case ... of ... end;

Иногда да, другой раз и так сработает, когда нужно просто получть руский перевод команды.

p.s. Свой пост я поправил... 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rouse_
Дата 25.4.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 5
Всего: 29



smile))
Код

function TestStr(const S: string): TTestResult;
begin
  case S[1] of
    'n': Result := trNone;
    'e': Result := trExit;
    'c': Result := trCopy;
    'r': Result := trRun;
    'd': Result := trDelete;
  else
    Result := trError;
  end;
end;
 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 25.4.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Rouse_, а если понадобится еще и 'cut'  smile  


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0511 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.