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

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

  1. DJKondakov

    DJKondakov Гость

    Репутация:
    0
    Доброго времени суток! Есть задача: перемешать строки в 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 Гость

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

    DJKondakov Гость

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

    DJKondakov Гость

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

    etc Гость

    Репутация:
    0
    Вы покажите последний код ..
     
  6. DJKondakov

    DJKondakov Гость

    Репутация:
    0
    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 Гость

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

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

    DJKondakov Гость

    Репутация:
    0
    Извиняюсь за бардак в коде... больше не повторится...
    Разобрался сам. Вместо кучи строк кода написал 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 Гость

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

    DJKondakov Гость

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

    etc Гость

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

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