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

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

Несовместимость String и Char [D7, WinXP]


TDionis ©   (2005-08-03 13:22:00) 

Никогда не занимался Char`ом. И вот, решил написать транслитор (ну, чтобы русский текст был английскими буквами). Вот код:

var
  S,now_bykva: string;
  Flags: TReplaceFlags;
  nom: integer;
  bykva: array['а'..'я']  of string;
begin
bykva['а'] := 'a';
bykva['б'] := 'b';
bykva['в'] := 'v';
bykva['г'] := 'g';
bykva['д'] := 'd';
bykva['е'] := 'e';
bykva['ж'] := 'j';
bykva['з'] := 'z';
bykva['и'] := 'i';
bykva['й'] := 'i';
bykva['к'] := 'k';
bykva['л'] := 'l';
bykva['м'] := 'm';
bykva['н'] := 'n';
bykva['о'] := 'o';
bykva['п'] := 'p';
bykva['р'] := 'r';
bykva['с'] := 's';
bykva['т'] := 't';
bykva['у'] := 'u';
bykva['ф'] := 'ph';
bykva['х'] := 'x';
bykva['ц'] := 'z';
bykva['ч'] := 'ch';
bykva['ш'] := 'sh';
bykva['щ'] := 'sh';
bykva['ъ'] := '';
bykva['ы'] := 'i';
bykva['ь'] := '';
bykva['э'] := 'e';
bykva['ю'] := 'iy';
bykva['я'] := 'ia';
  nom := 0;
  Flags:= [ rfReplaceAll, rfIgnoreCase ];
  S:= memo1.Text;
while nom < length(memo1.Text) do begin
  now_bykva := copy(s,nom,1);
  S:= StringReplace( S, now_bykva, bykva[copy(s,nom,1)], Flags);      
  nom := nom + 1;
end;
  memo1.Text := s;

Тут вылезает ошибка, что bykva[copy(s,nom,1)] ему не ндравися, и что я раздолбай хочу ему подсунуть в индекс string.

Отсюда вопрос: надо либо как-то перевести string в Char либо может  найти аналог Copy но в char...


begin...end   (2005-08-03 17:35:00) [1]

> evvcom ©   (03.08.05 14:26) [13]
> лучше тогда array[Ord('а')..Ord('я')] нагляднее.

array['а'..'я']. Ещё нагляднее.
:-)


TDionis   (2005-08-03 16:11:00) [2]

ну ладно, идем по варварский:

AnsiLowerCase(edit1.Text[i]) = edit1.Text[i] - значит число маленькое. ))

а на самомо деле проще проработать 192 - 224 элементы массива

вобщем всем спасибо за помощь


Ega23   (2005-08-03 14:33:00) [3]

2 Ega23 ©   (03.08.05 14:31) [16]

Не, фигу... Так не получится...


Ega23   (2005-08-03 14:31:00) [4]

Спасибо теперь только большие буквы надо проработать

Не вопрос!


procedure TForm1.Button2Click(Sender: TObject);
const
Liters:array[224..255] of string=('a', 'b', 'v', 'g', 'd', 'e', 'j', 'z', 'i', 'i',
                              'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u',
                              'ph', 'x', 'z', 'ch', 'sh', 'sh', '', 'i', '',
                              'e', 'iy', 'ya' );
var
i:Integer;
res:string;

begin
res:='';
Edit1.Text:=AnsiUpperCase(Edit1.Text);

for i:=1 to Length(Edit1.Text) do
begin
 res:=res+ANSIUpperCase(Liters[Ord(Edit1.Text[i])]);
end;
Label1.Caption:=res;

end;


:-)))))))))))))))


TDionis   (2005-08-03 14:29:00) [5]

Спасибо теперь только большие буквы надо проработать


Ega23   (2005-08-03 14:28:00) [6]

Не, ну это пусть сам уже думает и делает. Я идею подкинул?  :о)


evvcom   (2005-08-03 14:26:00) [7]


> array[224..255]

лучше тогда array[Ord('а')..Ord('я')] нагляднее.

> for i:=1 to Length(Edit1.Text) do
>  begin
>   res:=res+Liters[Ord(Edit1.Text[i])];
>  end;

+ проверку на принадлежность символа в Edit1 диапазону от а до я


Ega23   (2005-08-03 14:10:00) [8]


procedure TForm1.Button2Click(Sender: TObject);
const
Liters:array[224..255] of string=('a', 'b', 'v', 'g', 'd', 'e', 'j', 'z', 'i', 'i',
                               'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u',
                               'ph', 'x', 'z', 'ch', 'sh', 'sh', '', 'i', '',
                               'e', 'iy', 'ya' );
var
i:Integer;
 res:string;

begin
res:='';
Edit1.Text:=AnsiLowerCase(Edit1.Text);

for i:=1 to Length(Edit1.Text) do
 begin
  res:=res+Liters[Ord(Edit1.Text[i])];
 end;
Label1.Caption:=res;

end;


Думкин   (2005-08-03 13:39:00) [9]

> [9] TDionis   (03.08.05 13:35)

1. ты бы моим воспользовался s[nom]
2. А как больше 1 если у тебя строка получается с одним символом?
3. Читать основы Паскаля. А то при таком темпе, следующей твоей программой будет DOOM4 не меньше. А вопросы уровня "в трей".


Digitman   (2005-08-03 13:39:00) [10]


> почему больше 1 буквы вылетает


потому что все то что больше 1 буквы любит летать


TDionis   (2005-08-03 13:35:00) [11]

ага

Вопрос в том почему больше 1 буквы вылетает EAccessViolation


Ega23   (2005-08-03 13:33:00) [12]

2 TDionis   (03.08.05 13:30) [6]
Хм.. а что, в стринге отсчет идет с 1 а не с нуля ?

Есть мнение, что кое-кому не мешает почитать про тип String и Char, прежде чем вопросы задавать, нес па?


Digitman   (2005-08-03 13:32:00) [13]


> Хм.. а что, в стринге отсчет идет с 1 а не с нуля ?


здрасть-приехали !

конечно с 1 !


TDionis   (2005-08-03 13:30:00) [14]

Хм.. а что, в стринге отсчет идет с 1 а не с нуля ?


TDionis   (2005-08-03 13:29:00) [15]

ага но вылетает с ошибкой. почему?


DiamondShark   (2005-08-03 13:29:00) [16]

Это означает первый символ в строке, возвращаемой функцией copy


TDionis   (2005-08-03 13:28:00) [17]

Сорри за мега тупой вопрос: что в данном случае означает bykva[copy(s,nom,1) [1]] ??


Думкин   (2005-08-03 13:26:00) [18]

ДОСТУП К БУКВЕ В СТРИНГЕ - КАК В МАССИВЕ.

Оп, капс не вырубил. Звиняюсь.


Чапаев   (2005-08-03 13:24:00) [19]

bykva[copy(s,nom,1)[1]]


Наверх

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