IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> переводчик, опять велосипед...
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 111
Пол: Мужской
Реальное имя: Рома

Репутация: -  0  +


нужно сделать переводчик, слова берёт из тхт, слова разных языков разделены пробелом.
подскажыте плз что за косяк в цикле (и ваще я так делаю или нет? >__> )
плюс интересная штука в последней строке переменную 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};


Сообщение отредактировано: kr3v3tkus -


Прикрепленные файлы
Прикрепленный файл  Trans.rar ( 8.48 килобайт ) Кол-во скачиваний: 111


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
плюс интересная штука в последней строке переменную f почемуто принимает за стринг, хотя везде описал как буль
Мало правильно описывать, надо еще правильно вызывать:
until (BaseField.Text[i]='') or (f=true);

или просто
until (BaseField.Text[i]='') or f;


Цитата
что за косяк в цикле
Угу... Только ты покажи полностью код со всеми описаниями, а то придумывать что там у тебя и как - зачем?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 111
Пол: Мужской
Реальное имя: Рома

Репутация: -  0  +


гоменасай забыл прикрепить файл)


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 111
Пол: Мужской
Реальное имя: Рома

Репутация: -  0  +


Цитата
читать файл и записывать в TValueListEditor вручную

Код
  ValueListEditor1.Strings.LoadFromFile('base.txt');

?
А нельзя всё таки какнить с мемо? smile.gif чёт пока для меня сложновато, вроде понятно более менее но не могу заставить работать smile.gif


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
А нельзя всё таки какнить с мемо?
Можно. "В принципе, можно и зайца научить курить" (С), но только вот у тебя код неправильный, в этом все дело... Тебе придется каждый раз (для каждого слова, фигурирующего в поле 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;

, и у тебя есть готовый массив с индексами-строками, никаких велосипедов...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 111
Пол: Мужской
Реальное имя: Рома

Репутация: -  0  +


вольвыыыыч позялста последние 2 вопроса smile.gif
Код

    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? я непойму какие параметры там ставить sad.gif

Сообщение отредактировано: kr3v3tkus -


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата
как мы тут узнаём что ему соответствует слово "dog"?
Я ж говорил: у тебя один столбец - это индексы, а второй - значения, ИМ соответствующие. То есть, при занесении
    ValueListEditor1.InsertRow('собака', 'dog', true);
ты задаешь однозначно: "если будут искать 'собаку' - это 'dog'"... Вот тут же у тебя не возникает сомнения:


const arr: array[1 .. 2] of string = (
'cat', '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;
Теперь у тебя будет двухсторонний словарь: ищешь по русскому индексу - находишь перевод на английский, и наоборот...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 111
Пол: Мужской
Реальное имя: Рома

Репутация: -  0  +


ууу пасибки, въехал smile.gif царь во дворца smile.gif


--------------------
Цитата
          .     .
           \__/
          (**)
(>:=:=:~~ 
  ^ ^ ^ ^ 

Креветка присваивания :DDD
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.09.2020 7:15
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name