нужно сделать переводчик, слова берёт из тхт, слова разных языков разделены пробелом. подскажыте плз что за косяк в цикле (и ваще я так делаю или нет? >__> ) плюс интересная штука в последней строке переменную f почемуто принимает за стринг, хотя везде описал как буль
Код
Output.Text:=''; f:=false; repeat
if BaseField.Text[i]<>' ' then Str:=Str+BaseField.Text[i] else begin if BaseField.Text=Str then begin f:=true; repeat Output.Text:=Output.Text+BaseField.Text[i]; inc(i); until BaseField.Text[i]=' '; Str:='' end; end;
inc(i); until BaseField.Text[i]=''{ or f=true};
volvo
5.10.2007 20:21
Цитата
плюс интересная штука в последней строке переменную f почемуто принимает за стринг, хотя везде описал как буль
Мало правильно описывать, надо еще правильно вызывать:
until (BaseField.Text[i]='') or (f=true);
или просто
until (BaseField.Text[i]='') or f;
Цитата
что за косяк в цикле
Угу... Только ты покажи полностью код со всеми описаниями, а то придумывать что там у тебя и как - зачем?
kr3v3tkus
5.10.2007 20:25
гоменасай забыл прикрепить файл)
volvo
6.10.2007 0:44
kr3v3tkus, я бы на твоем месте вместо TMemo для хранения словаря использовал TValueListEditor... Придется чуть-чуть добавить кода при инициализации программы (читать файл и записывать в TValueListEditor вручную), зато потом основной цикл станет таким:
procedure TDictionary.TransClick(Sender: TObject); var i:integer; SL: TStringList; begin
SL := TStringList.Create; try SL.Delimiter := ' '; SL.DelimitedText := StringReplace(Input.Text, ' ', ' ', [rfReplaceAll]); for i := 0 to pred(SL.Count) do Output.Text := Output.Text + ValueListEditor1.Values[SL[i]] + ' '; finally SL.Free; end;
end;
kr3v3tkus
6.10.2007 3:39
Цитата
читать файл и записывать в TValueListEditor вручную
? А нельзя всё таки какнить с мемо? чёт пока для меня сложновато, вроде понятно более менее но не могу заставить работать
volvo
6.10.2007 4:00
Цитата
А нельзя всё таки какнить с мемо?
Можно. "В принципе, можно и зайца научить курить" (С), но только вот у тебя код неправильный, в этом все дело... Тебе придется каждый раз (для каждого слова, фигурирующего в поле Input) проходить по всему Memo, в каждой строке брать ту часть, которая до пробела, сравнивать ее с самим выделенным словом, и если есть совпадение - то брать часть строки Memo после пробела и добавлять ее к полю Output...
Что я тебе предлагаю: при инициализации (т.е., один раз) делаешь так:
procedure TDictionary.FormCreate(Sender: TObject); var i, p:integer; SL: TStringList; begin SL := TStringList.Create; // Создаем StringList SL.LoadFromFile('base.txt'); // Читаем файл в StringList
for i := 0 to pred(SL.Count) do begin // для каждой строки ... p := Pos(' ', SL[i]); ValueListEditor1.InsertRow( copy(sl[i], 1, p - 1), copy(sl[i], p + 1, length(sl[i]) - p), true ); // ... заполняем ValueEditor end; SL.Free; // Освобождаем StringList end;
, и у тебя есть готовый массив с индексами-строками, никаких велосипедов...
kr3v3tkus
6.10.2007 4:21
вольвыыыыч позялста последние 2 вопроса
Код
SL.Delimiter := ' '; SL.DelimitedText := StringReplace(Input.Text, ' ', ' ', [rfReplaceAll]); for i := 0 to pred(SL.Count) do Output.Text := Output.Text + ValueListEditor1.Values[SL[i]] + ' ';
допустим мы ввели слово "собака" - как мы тут узнаём что ему соответствует слово "dog"? SL.DelimitedText := StringReplace(Input.Text, ' ', ' ', [rfReplaceAll]); - мы же просто в DelimitedText передаём текст, только с переносом строки заменённым на пробел? и второй вопрос - допустим мы знаем какая раскладка - если она англ и ввели слово "dog" то как вывести "собака"? с помощью ValueListEditor1.Names? я непойму какие параметры там ставить
volvo
6.10.2007 7:38
Цитата
как мы тут узнаём что ему соответствует слово "dog"?
Я ж говорил: у тебя один столбец - это индексы, а второй - значения, ИМ соответствующие. То есть, при занесении
почему, собственно если брать значение arr[1], то это - 'cat'? Так же и там, только индекс - не целое число, а строка...
Теперь чуть подробнее о том, как работает непонятный тебе код:
// поскольку слова как ты написал разделяются пробелом // делаем разделителем пробел SL.Delimiter := ' ';
// Следующая строка заносит текст, который БУДЕТ разделяться в StringList // А вот чтобы не было проблем при введении больше чем одного пробела // я все лишние пробелы из списка слов убираю через StringReplace // (вместо группы пробелов остается только один) SL.DelimitedText := StringReplace(Input.Text,' ', ' ', [rfReplaceAll]);
// тут проходим по всем строкам StringList-а (благодаря тому, что лишние пробелы убраны, // можно гарантировать, что на каждой его строке будет новое слово которое надо перевести) for i := 0 to pred(SL.Count) do
// ищем перевод этого слова в контейнере (по нужному индексу), // и добавляем соответствующее ему переведенное слово в Output ... Output.Text := Output.Text + BaseField.Values[SL[i]];
Цитата
если она англ и ввели слово "dog" то как вывести "собака"
Нельзя этого делать с одним словарем... Для двухстороннего перевода понадобятся 2 словаря: англо-русский и русско-английский... Но можно и схитрить:
procedure TDictionary.FormCreate(Sender: TObject); var i, p:integer; SL: TStringList; begin SL := TStringList.Create; SL.LoadFromFile('base.txt');
for i := 0 to pred(SL.Count) do begin p := Pos(' ', SL[i]); ValueListEditor1.InsertRow(copy(sl[i], 1, p - 1), copy(sl[i], p + 1, length(sl[i]) - p), true); // Рус -> Англ ValueListEditor1.InsertRow(copy(sl[i], p + 1, length(sl[i]) - p), copy(sl[i], 1, p - 1), true); // Англ -> Рус end;
SL.Free; end;
Теперь у тебя будет двухсторонний словарь: ищешь по русскому индексу - находишь перевод на английский, и наоборот...
kr3v3tkus
6.10.2007 22:18
ууу пасибки, въехал царь во дворца
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.