Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.09.2008, 20:12
FreeUser FreeUser вне форума
Начинающий
 
Регистрация: 13.08.2008
Сообщения: 119
Репутация: 10
По умолчанию Проблема с циклом

GetInfo - операция связанная с получением информации.
Результат (z):string;
---------
Код:
For i:=0 to memo1.lines.count-1 do
begin

if pos('Value1',memo1.Lines.ValueFromIndex[i])>0 then
   begin
       memo2.Lines.Insert(i,GetInfo(z));
  if pos ('Multi',memo2.Lines.ValueFromIndex[i])>0 then
            memo3.Lines.Insert(i,'Mnogo')
  else
    if pos('Mono',memo2.Lines.ValueFromIndex[i])>0 then
        memo3.Lines.Insert(i,'Malo')
    else
        memo3.Lines.Insert(i,'Error')
    end;

Таких скриптов 4, одни друг за другом, т.к. Value - 4 шт. Т.е. достаточно скопировать этот код 4 раза, проставить значения для Value от 1 до 4.
Этот цикл не работает . Гонит одни error'ы. Я грешу на то что у меня не правильно построена работа с memo. Разберитесь кто может.

В memo1 сидит текст (z), о нем GetInfo получает данные, которые и пишет в "буфер" memo2.
Memo1 - содержит данные
Memo2 - типа буфера
Memo3 - вывод результата
На форме выглядит как

------------------
| M | M |
| E | E |
| M | M |
| O | O |
| 1 | 3 |
------------------
Memo2 от глаз юзера скрыт, т.к. в нем проводятся все операции.
Ответить с цитированием
  #2  
Старый 04.09.2008, 23:04
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

Вот это не то?

Код:
var
 i: Integer;
 Buffer: String;
begin

 for i := 0 to Memo1.Lines.Count - 1 do
  if Pos('Value1', Memo1.Lines.Strings[i]) > 0 then
  begin
   Buffer := GetInfo(z);

    if Pos('Multi', Buffer) > 0 then
     Memo3.Lines.Add('Mnogo')
    else
     if Pos('Mono', Buffer) > 0 then
      Memo3.Lines.Add('Malo')
     else
      Memo3.Lines.Add('Error')
  end;
Ответить с цитированием
  #3  
Старый 05.09.2008, 14:23
FreeUser FreeUser вне форума
Начинающий
 
Регистрация: 13.08.2008
Сообщения: 119
Репутация: 10
По умолчанию

Это упростило код, но проблемы не решило.

Дело в том, что весь цикл выглядит так
Код:
for i := 0 to Memo1.Lines.Count - 1 do
begin
  if Pos('Value1', Memo1.Lines.Strings[i]) > 0 then
  begin
   Buffer := GetInfo(z);
    if Pos('Multi', Buffer) > 0 then
     Memo3.Lines.Add('Mnogo')
    else
     if Pos('Mono', Buffer) > 0 then
      Memo3.Lines.Add('Malo')
     else
      Memo3.Lines.Add('Error')
  end;

if Pos('Value2', Memo1.Lines.Strings[i]) > 0 then
  begin
   Buffer := GetInfo(z);

    if Pos('Multi', Buffer) > 0 then
     Memo3.Lines.Add('Mnogo')
    else
     if Pos('Mono', Buffer) > 0 then
      Memo3.Lines.Add('Malo')
     else
      Memo3.Lines.Add('Error')
  end;

if Pos('Value3', Memo1.Lines.Strings[i]) > 0 then
  begin
   Buffer := GetInfo(z);

    if Pos('Multi', Buffer) > 0 then
     Memo3.Lines.Add('Mnogo')
    else
     if Pos('Mono', Buffer) > 0 then
      Memo3.Lines.Add('Malo')
     else
      Memo3.Lines.Add('Error')
  end;

if Pos('Value4', Memo1.Lines.Strings[i]) > 0 then
  begin
   Buffer := GetInfo(z);

    if Pos('Multi', Buffer) > 0 then
     Memo3.Lines.Add('Mnogo')
    else
     if Pos('Mono', Buffer) > 0 then
      Memo3.Lines.Add('Malo')
     else
      Memo3.Lines.Add('Error')
  end;
end;

Как должен работать цикл.
Из Memo1 от начала и до конца, по очереди берется содержимое строки (z).
Потом еще один цикл проверяет содержит ли эта взятая строка Value1 или Value2 или Value3 или Value4. Когда становится понятно, какое Value содержится, то соответственно выбирается еще один цикл написанные именно под найденное Value, в нем мы передаем при помощи команды получаем значение Z. И снова цикл, чтобы определить, содержит ли Z Multi или Mono. Если содержит то в Memo3 выводим результат или Mnogo или Malo. Если не содержит то в Memo3 выводим Error.

Что на деле.
Циклы начинают работать. Работают. Но со 2-й или 3-ей строки Memo3 начинается полная пурга. Ввиде одних лишь Mnogo. И редко редко проскакивают Malo.

Как мне думается. Что-то не ладное творится в переменной Buffer. Или она не очищается или чего-то еще. Но записывая 1 раз Multi в ней то потом прога так и считает что там каждый раз Multi. Хотя GetInfo(z) каждый раз туда пишет верные данные. Но то ли в Buffer дописывается что результат в конце, а цикл находит первое попавшееся.

Последний раз редактировалось FreeUser, 05.09.2008 в 14:30.
Ответить с цитированием
  #4  
Старый 05.09.2008, 23:32
FreeUser FreeUser вне форума
Начинающий
 
Регистрация: 13.08.2008
Сообщения: 119
Репутация: 10
По умолчанию

Ну помогите пожалуйста кто может
Ответить с цитированием
  #5  
Старый 06.09.2008, 01:45
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

Ну первое, вроде ошибок нет, и Buffer обнулять не обязательно, ИМХО трабла в функции GetInfo

А второе Что такое z?))) это не Memo1.Lines.Strings[i]??? Если да то код можно упростить
Ответить с цитированием
  #6  
Старый 06.09.2008, 10:46
FreeUser FreeUser вне форума
Начинающий
 
Регистрация: 13.08.2008
Сообщения: 119
Репутация: 10
По умолчанию

Да. Z это именно Memo1.Lines.Strings[i]. Точно так.
Ответить с цитированием
  #7  
Старый 06.09.2008, 11:23
FreeUser FreeUser вне форума
Начинающий
 
Регистрация: 13.08.2008
Сообщения: 119
Репутация: 10
По умолчанию

А может ли быть проблема, что GetInfo(z) возвращает огромный кусок текста? Т.е. около 500 символов.
Ответить с цитированием
  #8  
Старый 06.09.2008, 14:50
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

Вот так сократить код можно
Код:
var
 i, Index: Integer;
 Buffer, strRead: String;
begin

 for i := 0 to Memo1.Lines.Count - 1 do
 begin
  strRead := Memo1.Lines.Strings[i];
  Buffer := '';

   for Index := 1 to 4 do
    if Pos('Value'+IntToStr(Index), strRead) > 0 then
    begin
     Buffer := GetInfo(strRead);
      if Pos('Multi', Buffer) > 0 then
       Memo2.Lines.Add('Mnogo')
      else
       if Pos('Mono', Buffer) > 0 then
        Memo2.Lines.Add('Malo')
       else
        Memo2.Lines.Add('Error');
     Break;
    end;
 end;

Не марел, но работать вроде должен, если не поможет то ошибка в GetInfo, так что выкладывай код
Ответить с цитированием
  #9  
Старый 06.09.2008, 16:47
FreeUser FreeUser вне форума
Начинающий
 
Регистрация: 13.08.2008
Сообщения: 119
Репутация: 10
По умолчанию

Код:
var
 i, Index: Integer;
 Buffer, strRead: String;
begin

 for i := 0 to Memo1.Lines.Count - 1 do
 begin
  strRead := Memo1.Lines.Strings[i];
  Buffer := '';

   for Index := 1 to 4 do
    if Pos('Value'+IntToStr(Index), strRead) > 0 then
    begin
     Buffer := GetInfo(strRead);
      if Pos('Multi', Buffer) > 0 then
       Memo2.Lines.Add('Mnogo')
      else
       if Pos('Mono', Buffer) > 0 then
        Memo2.Lines.Add('Malo')
       else
        Memo2.Lines.Add('Error');
     Break;
    end;
 end;

Не понял...А как же это Value? У меня там 4 разных Value. А тут 4 раза 1 Value
Ответить с цитированием
  #10  
Старый 06.09.2008, 16:50
FreeUser FreeUser вне форума
Начинающий
 
Регистрация: 13.08.2008
Сообщения: 119
Репутация: 10
По умолчанию

Например value1 это XX, а value2 это 123, value3 z1x. Не подходит

Последний раз редактировалось FreeUser, 06.09.2008 в 16:53.
Ответить с цитированием
  #11  
Старый 06.09.2008, 23:48
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

АААА тогда делай так)
Код:
const
 Value: array [0..3] of String = ('Value1', 'Value2', 'Value3', 'Value4');
var
 i, j: Integer;
 Buffer, strRead: String;
begin

 for i := 0 to Memo1.Lines.Count - 1 do
 begin
  strRead := Memo1.Lines.Strings[i];
  Buffer := '';

   for j := 0 to Length(Value) - 1 do
    if Pos(Value[j], strRead) > 0 then
    begin
     Buffer := GetInfo(strRead);
      if Pos('Multi', Buffer) > 0 then
       Memo2.Lines.Add('Mnogo')
      else
       if Pos('Mono', Buffer) > 0 then
        Memo2.Lines.Add('Malo')
       else
        Memo2.Lines.Add('Error');
     Break;
    end;
 end;
Ответить с цитированием
  #12  
Старый 07.09.2008, 18:06
FreeUser FreeUser вне форума
Начинающий
 
Регистрация: 13.08.2008
Сообщения: 119
Репутация: 10
По умолчанию

Блин) И этот цикл не подходит ) Т.к. Multi и Mono тоже разные каждый из 4 циклов. Но GetInfo(Z) не может быть не правильной. Это гарантия.
Ответить с цитированием
  #13  
Старый 07.09.2008, 20:55
Drozh Drozh вне форума
Активный
 
Регистрация: 12.06.2008
Сообщения: 313
Репутация: 40
По умолчанию

))))) мда, но вот то что я тебе привел работает, значит либо ошибка в процедуре GetInfo либо выше и ниже этого кода
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:29.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025