![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Несовместимость 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]]