Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2008, 22:48   #1
xPAL
Пользователь
 
Регистрация: 13.01.2008
Сообщений: 34
Восклицание Помогите усовершенствовать код

Мне нужно, чтобы вот такая запись:
СЛОВО
Значение
была преведена к виду:
<m>
<l>ru</l>
<ms>СЛОВО</ms>
<ms>слово</ms>
<t>
Значение
</t>
</m>
Но в моём коде Значение может быть длиной только в одну строку, мне нужно чтоб оно было многострочным. Не нашёл вариантов решения данной задачи. Пожалуйста помогите. Заранее спасибо.

Код:
procedure TForm1.Button1Click(Sender: TObject);
var lineIndex,charindex:integer;
str,question,answer:string;
a,b:char;
z:boolean;

begin
 if memo2.Lines.Count<>0 then
  memo2.Lines.Clear;
 memo3.Lines.clear;
 answer:='';
 question:='';
 lineindex:=0;
 z:=false;
 while lineindex<=memo1.Lines.Count-1 do begin
  str:=memo1.Lines.Strings[lineindex];
  charindex:=1;

  while charindex<=length(str) do begin     // Перебор по буквам
   a:=str[charindex];
   b:=str[charindex+1];
   if ((ansiuppercase(a)=a) and (ansiuppercase(b)=b))or
      ((ansiuppercase(a)=a) and (ansiuppercase(b)=' ')and  (ansiuppercase(str[charindex+2])=str[charindex+2]))then begin
    question:=question+a;
    if z=true then
      z:=false else z:=true;
    end else begin
    if z=false then begin answer:='';

 memo3.Lines.Clear; end;
 answer:=memo1.Lines.Strings[lineindex];
 memo3.Lines.Add(answer);

 break;
 end;
inc(charindex);
end;
if z=true then begin
if question<>'' then begin
memo2.lines.add('<m>');
memo2.lines.add('<l>ru</l> ');
memo2.lines.add('<ms>'+question+'</ms>');
memo2.lines.add('<ms>'+AnsiLowercase(question)+'</ms>');
end;
if memo3.Lines.count>0 then begin
memo2.lines.add('<t>');
memo2.Lines.AddStrings(memo3.Lines);
memo2.Lines.Add('</t>');
memo2.lines.add('</m>');
z:=false;
end;

question:='';
end;

inc(lineindex);
end;


end;

Последний раз редактировалось xPAL; 18.09.2008 в 22:51.
xPAL вне форума Ответить с цитированием
Старый 19.09.2008, 14:52   #2
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

Код:
var lineIndex,charindex:integer;
str,question,answer:string;
a,b:char;
z:boolean;

begin
 if memo2.Lines.Count<>0 then
  memo2.Lines.Clear;
 memo3.Lines.clear;
 answer:='';          str:='';
 question:='';
 lineindex:=0;
 z:=false;
 while lineindex<=memo1.Lines.Count-1 do begin
  str:=memo1.Lines.Strings[lineindex];
  charindex:=1;

  while charindex<=length(str) do begin     // Перебор по буквам
   a:=str[charindex];
   b:=str[charindex+1];
   if ((ansiuppercase(a)=a) and (ansiuppercase(b)=b))or
      ((ansiuppercase(a)=a) and (ansiuppercase(b)=' ')and  (ansiuppercase(str[charindex+2])=str[charindex+2]))then begin
    question:=question+a;
    if z=true then
      z:=false else z:=true;
    end else begin
    if z=false then begin answer:='';

 memo3.Lines.Clear; end;
 answer:=memo1.text;//.Lines.Strings[lineindex];     <------ вот тут
 memo3.Lines.Add(answer);

 break;
 end;
inc(charindex);
end;
if z=true then begin
if question<>'' then begin
memo2.lines.add('<m>');
memo2.lines.add('<l>ru</l> ');
memo2.lines.add('<ms>'+question+'</ms>');
memo2.lines.add('<ms>'+AnsiLowercase(question)+'</ms>');
end;
if memo3.Lines.count>0 then begin
memo2.lines.add('<t>');
memo2.Lines.AddStrings(memo3.Lines);
memo2.Lines.Add('</t>');
memo2.lines.add('</m>');
z:=false;
end;

question:='';
end;

inc(lineindex);
end;
вы в том месте берёте только одну строку по этому у вас и получаеться одно строчным. Просто пропускайте первую строку а остальное считывайте. Я вам всего лишь указал место в котором ошибка.

Последний раз редактировалось dr.Chas; 19.09.2008 в 14:54.
dr.Chas вне форума Ответить с цитированием
Старый 19.09.2008, 15:56   #3
xPAL
Пользователь
 
Регистрация: 13.01.2008
Сообщений: 34
По умолчанию

Проблема в том что в memo1 может быть запись типа этой:
СЛОВО
Значение
ДРУГОЕ СЛОВО
Другое значение

при answer:=memo1.text;
получается
Код:
<m>
<l>ru</l>
<ms>СЛОВО</ms>
<ms>слово</ms>
<t>
Значение
ДРУГОЕ СЛОВО
Другое значение
</t>
</m>
xPAL вне форума Ответить с цитированием
Старый 19.09.2008, 16:29   #4
dr.Chas
***
Участник клуба
 
Аватар для dr.Chas
 
Регистрация: 30.07.2007
Сообщений: 1,162
По умолчанию

слишком ты поверхносто объясняешь, а как это запись в мемо падает? Я так понял это что типа словаря. Попробуй между

Код:
СЛОВО
Значение

СЛОВО
значение
делать пустую строку и проверять её.
dr.Chas вне форума Ответить с цитированием
Старый 19.09.2008, 23:41   #5
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Тут все просто, если после строки в верхнем регистре не идет строка в нижнем, запись не сохранять. Если же идет в нижнем - сохранять, и так до конца.
Пустая строка как разделитель не нужна.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 19.09.2008 в 23:45.
mutabor вне форума Ответить с цитированием
Старый 19.09.2008, 23:54   #6
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Совем непонятно. Разбей свою строку на подстроки, где :
первая строка - СЛОВО (в верхнем регистре)
вторая строка - слово (в нижнем регистре)
третья строка - все остальное
Если COUNT строк < трёх минус один - не сохранять.
_SERGEYX_ вне форума Ответить с цитированием
Старый 20.09.2008, 00:05   #7
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

А вообще да, так лучше не делать: xxx :=memo1.text;
Гораздо удобнее работать с массивом строк - Lines[], как это делать, я написал выше.
Memo.Text это строка, к-рая содержит в себе все строки Мемо, разделенные символами #13#10, для данной задачи парсить такую строку очень неудобно.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 20.09.2008 в 00:09.
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц