Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать case для строк в 4 символа? [D7]


Страницы:   1 2

Оптим ©   (2006-02-16 02:59:00) 

Ведь Integer - это тоже 4 байта, значит как то можно преобразовать строку в интегер, и делать ему case. Или нельзя?
Вот так Integer('test'): - не получается. А как правильно?


Defunct   (2006-02-18 03:32:00) [21]

Оптим   (18.02.06 02:02) [14]
без констант нельзя, оператор case к сожалению только с константами "оперирует".

может быть имеет смысл вашу задачу решать по-другому?
Например, взять TStringList, засунуть в него строки и ссылки, далее искать строку уже в списке - при совпадении пользоваться ссылкой или индексом строки...


Оптим   (2006-02-18 02:02:00) [22]

> Leonid Troyanovsky ©   (16.02.06 09:27) [9]
А можно сделать тоже самое, только без констант, а то с ними не удобно как то.


Плохиш   (2006-02-16 11:11:00) [23]

И после wsego этого они смеют кричать, что вындов - глючный маст дай :-)


evvcom   (2006-02-16 09:49:00) [24]


> palva ©   (16.02.06 09:47) [11]

Угу, и всякий раз, когда решишь изменить 1 символ, будешь брать в руки "железного Феликса"?


palva   (2006-02-16 09:47:00) [25]

Можно не преобразовывать:

{$APPTYPE CONSOLE}
var
 s: String[7];
 si: LongInt absolute s;
procedure c;
begin
 case si of
 1163350277:
   WriteLn('case1');
 1685283078:
   WriteLn('case2');
 else
   WriteLn('nocase')
 end;
end;
begin
 s := 'QWERT';
 c; // case1
 s := 'asdfgh';
 c; // case2
 s := '';
 c; // nocase
end.

Только придется составить словарь: значение строки и соответствующее этому значению число, которое требуется для case.


evvcom   (2006-02-16 09:36:00) [26]


> КаПиБаРа ©   (16.02.06 07:03) [6]
> @'test'[1] - адрес первого символа, то биш 't'
> (@'test'[1])^ - значение по указанному выше адресу

Для лучшего понимания надо добавить строку:
PLongint(@'test'[1]) - приведение к указателю на Longint, т.е. указателю на 4-байтовое целое. А уж потом разадресация: PLongint(@'test'[1])^. См. [9].
Хотя, конечно, в [3] ответ немного иной и интуитивно непонятный.


Leonid Troyanovsky   (2006-02-16 09:27:00) [27]


> Оптим   (16.02.06 02:59)  
> Ведь Integer - это тоже 4 байта, значит как то можно преобразовать
> строку в интегер, и делать ему case. Или нельзя?


procedure TForm1.Button1Click(Sender: TObject);
const
c1 =   $1*             Ord('E')+
       $100*           Ord('d')+
       $10000*         Ord('i')+
       $1000000*       Ord('t'); // Edit
c2 =   $1*             Ord('T')+
       $100*           Ord('e')+
       $10000*         Ord('s')+
       $1000000*       Ord('t'); // Test
begin
 case PLongint(PChar(copy(Edit1.Text,1,4)))^ of
   c1:
     ShowMessage('Edit');
   c2:
     ShowMessage('Test');
 end;
end;

--
Regards, LVT.


КаПиБаРа   (2006-02-16 07:22:00) [28]

Попробуй разобраться в этом
procedure TForm1.Button1Click(Sender: TObject);
var
 s: string;
 i: Integer;
begin
 s := 'Test';
 Memo1.Lines.Add('Первый символ  ' + s[1]);
 Memo1.Lines.Add('Адрес первого символа ' + IntToStr(Dword(@s[1])));
 Memo1.Lines.Add('Значение хранящееся по этому адресу ' + IntToStr(Dword((@s[1])^)));
 Memo1.Lines.Add('Это же значение в 16-ричном виде ' + IntToHex(Dword((@s[1])^), 6));
 Memo1.Lines.Add('Или по символам первый    ' + Char((@s[1])^));
 Memo1.Lines.Add('Или по символам второй    ' + Char((@s[2])^));
 Memo1.Lines.Add('Или по символам третий    ' + Char((@s[3])^));
 Memo1.Lines.Add('Или по символам четвертый ' + Char((@s[4])^));
end;


Оптим   (2006-02-16 07:06:00) [29]

> (@'test'[1])^ - значение по указанному выше адресу
А сам адрес разве не значит что по указанному адресу? Или что он тогда значит?


КаПиБаРа   (2006-02-16 07:03:00) [30]

Оптим   (16.02.06 6:51) [5]
'test'[1] - первый элемент массива символов 'test' тоесть 't'
@'test'[1] - адрес первого символа, то биш 't'
(@'test'[1])^ - значение по указанному выше адресу
 см F1 - Overview of pointers


Оптим   (2006-02-16 06:51:00) [31]

> i :=  Integer((@'test'[1])^);

А можно для начинающих расшифровать эту запись?

'test'[1] - почему это с цифрой 1?
@'test'[1] - это мы берём адрес, да?
(@'test'[1])^ - это мы чего делаем с адресом? ...


Zeqfreed   (2006-02-16 06:11:00) [32]

Не стоит так извращаться.


Жуков Олег   (2006-02-16 05:36:00) [33]

В число:
 i :=  Integer((@'test'[1])^);

и обратно в строку:

 SetLength(s, 4);
 Integer((@s[1])^) := 1953719668;


Наблюдение   (2006-02-16 03:35:00) [34]

Если бы сюда зашёл дурак, то он бы тоже не понял.


Германн   (2006-02-16 03:20:00) [35]

Суть смысла и смысл сути вопроса не понятен абсолютно!


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо