Ошибка Control '' Has No Parent Window

  • Автор темы DJKondakov
  • Дата начала
D

DJKondakov

Доброго времени суток! Есть задача: перемешать строки в TListBox так, чтобы строки не повторялись. Реализую след. образом:
*********
{$R *.DFM}

function FindRecord(list: tlistbox; rec: integer): boolean;
var
i: integer;
begin
for i:=0 to list.Items.Count-1 do begin
if list.Items=inttostr(rec) then result:=true;
end;
result:=false;
end;

***

var
i, j, r: integer;
back: integer;
list: tlistbox;
begin
randomize;
list:=tlistbox.Create(list);
for i:=0 to listbox1.Items.Count-1 do begin
listbox1.Visible:=false;
listbox3.Visible:=true;
r:=random(listbox1.items.count-1);
while findrecord(list, r) do
r:=random(listbox1.items.count-1);
list.Items.Add(inttostr®);
listbox3.Items.Add(listbox1.items[r]);
listbox4.Items.Add(listbox2.items[r]);
end;
end;

**********
При выполнении последнего кода вылетает ошибка (см. в названии темы),
и выделяется строка, выделенная жирным. Кажется, никаких новых класов и т.п. я не создавал...
Что делать?
 
S

Silver Wind

list:=tlistbox.Create(list);
И как понимать вот этот кусок кода? Создаем TListBox и назначем ему Parent на него же самого - естественно получим вышеописанную ошибку при работе с ним.
Это к тому же еще и локальная переменная. Подозреваю что TListBox здесь используется только лишь как контейнер для хранения строк, тогда это в корне не правильный подход - для этого есть совершенно другие классы, не являющиеся визуальными компанентами (смотри TStringList).
 
D

DJKondakov

Хм... Спасибо за подсказку, ошибка исправлена, однако задача решена не до конца. Список перемешивается, но некоторые строки повторяются 2 и более раз, а некоторые не появляются вовсе. Пробовал заменить свою функцию FindRecord стандартной Find, результат тот же. Должно работать так:
Генерируем случайным образом индекс строки;
Проверяем, попадался ли такой индекс ранее - ищем его в списке List (если попадался, то генерируем до тех пор, пока не сгенерируем индекс, которого нет в этом списке);
Пополняем список List новым индексом;
Копируем строку с этим индексом из ListBox1 в ListBox3;
Повторяем все это столько раз, сколько строк в ListBox1.
 
D

DJKondakov

Складывается такое впечатление, что Find возвращает истину тогда, когда ему заблагорассудится. Везде, где можно, поставил showmessage для контроля, так он то выводит сообщение о добавлении индекса в list, когда такой там уже есть, то, наоборот, правильно сообщает, что генерируется новый индекс взамен существующего...
 
D

DJKondakov

procedure TForm1.Button8Click(Sender: TObject);
var
i, j, r, k: integer;
back: integer;
list: tstringlist;
label
m1;
begin
randomize;
list:=tstringlist.Create;
for i:=0 to listbox1.Items.Count do begin
listbox1.Visible:=false;
listbox3.Visible:=true;
randomize;
r:=random(listbox1.items.count-1);
showmessage('Внешка '+inttostr®);
m1: if list.Find(inttostr®, k) then begin
while list.Find(inttostr®, k) do begin
showmessage('Было!!!!!');
randomize;
r:=random(listbox1.items.count-1);
showmessage('Внутри '+inttostr®);
end;
goto m1;
end else begin
showmessage('Добавляется '+inttostr®);
list.Add(inttostr®);
listbox3.Items.Add(listbox1.items[r]);
listbox4.Items.Add(listbox2.items[r]);
end;
end;
end;


Попробовал сделать пошаговое выполнение, обнаружил ,что проблема в Find: она находит элемент в списке, даже возвращает его номер, но при этом остается равна false. Причем это происходит не всегда.
 
E

etc

Достаточно 1-ой таблетки.
Это еще откуда?? выверите код и покажите в нормальном виде, а то наверное так кинули, мол разбирайтесь ... так не пойдет! и эта, тут есть спец теги для кода.

Еще, зачем тут tstringlist? зачем тут label? ... вощем думать над тем что пишете.
 
D

DJKondakov

Извиняюсь за бардак в коде... больше не повторится...
Разобрался сам. Вместо кучи строк кода написал 7... И заработало...
Вот код:
Код:
procedure TForm1.Button8Click(Sender: TObject);
var
i, r: integer;
begin
listbox1.Visible:=false;
listbox2.Visible:=true;
randomize;
for i := 0 to ListBox1.Items.Count - 1 do begin
r:=Random(ListBox2.items.Count+1);
ListBox2.Items.Insert(r, ListBox1.Items[i]);
end;
end;
 
E

etc

Следующим этапом обучения предлагаю написать сортировку того что вы нарандомили тут. :)
 
D

DJKondakov

Зачем?!!! :) Я так старался, придумывал, а тут обратно сортировать... К тому же метод Sort для ListBox'a еще никто не отменял...
А так - школьная задачка - сортировка массива...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!