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

Тема в разделе "Delphi - FAQ", создана пользователем DJKondakov, 19 мар 2009.

  1. DJKondakov

    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;

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

    Silver Wind Гость

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

    DJKondakov Гость

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

    DJKondakov Гость

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

    etc Гость

    Вы покажите последний код ..
     
  6. DJKondakov

    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. Причем это происходит не всегда.
     
  7. etc

    etc Гость

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

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

    DJKondakov Гость

    Извиняюсь за бардак в коде... больше не повторится...
    Разобрался сам. Вместо кучи строк кода написал 7... И заработало...
    Вот код:
    Код (Text):
    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;
     
  9. etc

    etc Гость

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

    DJKondakov Гость

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

    etc Гость

    Так и сабжевая не олимпиадная :)
     
Загрузка...

Поделиться этой страницей