Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.03;
Скачать: CL | DM;

Вниз

TStringList   Найти похожие ветки 

 
gsk   (2004-09-16 15:53) [0]

List1:=TStringList.Create;

Далее в List1 добавляем count строк (в конкретном случае, строки - наборы цифр).

Затем выводим эти строки в Memo1 следующим образом:

for k:=0 to count-1 do
  for p:=0 to count-1 do
   Memo1.Lines.Add(List1.Strings[p]);

 for i:=0 to count-1 do
   Memo1.Lines.Add(List1.Strings[i]);

Естественно, содержимое List1 выводится count+1 раз.
Далее цикл по i убираем, оставляем только по k и p. И в Memo1 выводятся строки, совершенно отличные от первого случая.
Кто-нибудь может подсказать - почему?


 
Александр Иванов ©   (2004-09-16 15:56) [1]

Полный код в студию


 
Amoeba ©   (2004-09-16 15:57) [2]

А не лучше ли использовать
Memo1.Lines.Assign(List1);
или
Memo1.Lines.Text := List1.Text;
И не надо никаких циклов


 
KSergey ©   (2004-09-16 15:58) [3]

> Кто-нибудь может подсказать - почему?

Так прога написана
А как хотелось-то?


 
gsk   (2004-09-16 16:09) [4]

Циклы нужны. Каждая строка считывается в цикле и с ней производятся некие действия. Последний цикл по i - временный, для проверки того, что List1 действительно загружается нужными строками. Когда все заработало правильно этот цикл убрал. И появилась проблема. Постепенно убрал все действия со строками в циклах по k и p и вставил Memo1 в эти циклы. Проблема осталась. Опять вернул цикл по i. Все работает правильно.


 
olookin ©   (2004-09-16 16:12) [5]

[4] gsk   (16.09.04 16:09)

Я вот цикла по k не понимаю - он зачем?


 
Amoeba ©   (2004-09-16 16:22) [6]


> Каждая строка считывается в цикле и с ней производятся некие
> действия.

1. Какие действия?
2. Если все делать в List1, то для передачи строк в Memo цикл не нужен. См. Amoeba ©   (16.09.04 15:57) [2]


 
gsk   (2004-09-16 16:27) [7]

Вот код:
List1:=TStringList.Create;
i:=0;
  while i<=count do
   begin
    List1.Add(Function); {заполнение List1, Function-некая функция для "подготовки" строк для List1}
    inc(i);
   end;

   for l:=0 to count-1 do
   for p:=0 to count-1 do
    Memo1.Lines.Add(PicList1.Strings[p]);

   for i:=0 to count-1 do
    Memo1.Lines.Add(PicList1.Strings[i]);

Похоже проблема в Function. Если List1 заполнять просто случайными строками, проблемы нет. Просто кажется странным, что если убрать цикл в котором строки из List1 выводятся в Memo, появляется проблема.


 
kukuikar ©   (2004-09-16 16:38) [8]


> for l:=0 to count-1 do
>    for p:=0 to count-1 do
>     Memo1.Lines.Add(PicList1.Strings[p]);

из цикла получается что
грузишь (count-1)*(count-1) раз! ЗАЧЕМ?


 
Amoeba ©   (2004-09-16 16:43) [9]

1. В List1 у тебя содержится Count+1 строк. Следовательно, последняя строка далее не используется.

2. Передается ли в Function i?

3. Передать строки в Memo можно проще:

Memo1.Lines.Text := "";
for l:=0 to count-1 do
 Memo1.Lines.Text := Memo1.Lines.Text + List1.Text;
Memo1.Lines.Text := Memo1.Lines.Text + List1.Text;

3. Непонятно, зачем многократная передача в Memo одного и того же.


 
gsk   (2004-09-16 16:49) [10]

> kukuikar ©   (16.09.04 16:38) [8]

Реально строки из List1 используются для других действий, не связанных с Memo. Просто я упростил код и вставил Memo для контроля, что же передается из List1 в цикле (после того как стало ясно, что есть проблема).


 
gsk   (2004-09-16 16:52) [11]

> Amoeba ©   (16.09.04 16:43) [9]

i передается в Function. Но Function больше нигде далее не вызывается.


 
Amoeba ©   (2004-09-16 16:54) [12]

Еще раз обращаю внимание автора вопроса (пригодится на будущее), что предавать строки из StringList в Memo (если передаются все) используя цикл - не есть хорошо. Для этого достаточно одного действия.


 
kukuikar ©   (2004-09-16 17:07) [13]

ну а для контроля нельзя сделать так

Memo1.Lines.Text:=List1.Text ?
зачем геммороиться с циклов и передавать построчно.

И что же за код такой секретный что нельзя его часть показать?


 
Amoeba ©   (2004-09-16 17:11) [14]


> kukuikar ©   (16.09.04 17:07) [13]

Про ненужные циклы я уже устал повторять уважаемому автору вопроса.

Подозреваю, что ошибка кроется в той части кода, которую нам упорно не хотят показать.


 
gsk   (2004-09-17 12:52) [15]

Циклы нужны. Мне надо каждую строку присваивать элементам массива и делать с ними некоторые действия. Когда стало ясно, что что-то не так, я удалил из кода все действия и массив и решил проверить, что же передается из List1. Для этого использовал Memo. Но передачу в Memo оставил так же, как это нужно в программе, т.е. с помощью циклов. Если использовать Memo1.Lines.Text:=List1.Text, то все передается правильно. Но с циклом - не правильно. Но если после вывода в Memo в цикле (по l и p) я вывожу тоже самое еще раз (цикл по i, как указано выше), то содержимое List1 выводится правильно. Больше ничего в коде нет. И этого я не понимаю.
Кстати, если в первом цикле (по l и p) не выводить в Memo, а присваивать строки List1 элементам массива, то содержание массива также зависит от того, есть ли далее цикл по i с выводом в Memo или нет.


 
Amoeba ©   (2004-09-17 13:20) [16]

1. Просто мистика какая-то.

2. Насколько я понял, передача в Memo используется чисто в отладочных целях, т.к. в окончательном виде вместо нее должна быть какая-то работа со строками из списка, выполняемая во вложенном цикле? Т.е. важен сам цикл?

3. Интересно, что получится (это уже из области шаманства), если список заполнять не результатом работы твоей ф-ии, а одним и тем же константным значением?

4. Какой в этом скрытый смысл?

i:=0;
 while i<=count do
  begin


У тебя создается не Count строк, а Count+1 строка. В Memo же последняя строка не попадает, покольку за проход цикла считывается только Count строк.


 
gsk   (2004-09-17 13:39) [17]

1. Согласен.
2. Да, важен именно цикл.
3. Сейчас попробую. Хотя, как я понимаю, List1 не должен "помнить" кто, как и какими строками его заполнил. Но надо проверить. Как проверю - сообщю.
4. Сколько строк вывожу в Memo не важно. Просто только каждая третья строка правильная, остальные нет.


 
gsk   (2004-09-17 13:52) [18]

Попробовал.
Заполнил список одним и тем же константным значением. Работает правильно независимо от того, есть ли далее дополнительный цикл по i. Как только использую Function, опять все не так. Но я далее больше нигде Function  не вызываю и ничего со списком не делаю! Только лишь добавляю последний цикл или убираю его. Не понимаю!



Страницы: 1 вся ветка

Текущий архив: 2004.10.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.022 c
1-1095161831
Volodya_
2004-09-14 15:37
2004.10.03
Thread


3-1094525026
Nerv
2004-09-07 06:43
2004.10.03
Каким образом вы храните используемые в приложении sql-запросы?


4-1093075611
kblc
2004-08-21 12:06
2004.10.03
MCI


14-1095274788
Drakon
2004-09-15 22:59
2004.10.03
Чернила для струйника


8-1089102438
Urvin
2004-07-06 12:27
2004.10.03
КАК уменьшить количество цветов в картинке