Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка с динамически созданными компонентами 
V
    Опции темы
ZufuS
Дата 16.12.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Имеется компонент струкутры TEdit. При изменении его текста на форме (в ScrollBox) должны разместиться Label'ы в количестве, указанном в тексте Edit'a.
Код

procedure TForm2.Edit1Change(Sender: TObject);
var
    i: integer;
begin
  Form1.n := StrToInt(Edit1.Text);
  SetLength(Label, Form1.n);
  for i:=0 to Form1.n do
  begin
    Label[i] := TLabel.Create(self);
    with Label[i] do
    begin
      Caption := 'C'+IntToStr(i);
      SetBounds(8, 11+i*15, 8+14, 11+15+i*15);
      Parent := ScrollBox1;
    end;
  end;
end;

При первом нажатии цифры всё хорошо, а при втором появляется ошибка. Подскажите как нужно производить уничтожение этих компонентов и почему при вводе 0 сразу появляется ошибка, а при вводе другой цифры, пока не нажать очередную, всё нормально.
PM   Вверх
Bitter
Дата 16.12.2006, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 6
Всего: 27



1. Перед созданием компонентов напиши

    for i:=0 to Form1.n do  if Assigned(Label[i]) then Label[i].Free; // это удаление предыдущих лабелов.

2. При вводе 0 получаешь SetLength( бла-бла, 0 ). т.е. в списке ноль элементов, после чего производится попытка создать один элемент (for от НОЛЬ до НОЛЬ   т.е один проход цикла). Надо писать 

 for i:=1 to Form1.n do

   Label[i-1] .....
   .....

тогда на ноль реакции не будет.

3. Ошибка, возникающая после ввода второй цифры связана с тем, что уже созданным элементам списка присваевается значение TLabel.Create(self). Этого делать нельзя (см. пункт 1)


PM MAIL ICQ Skype   Вверх
ZufuS
Дата 16.12.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Код

procedure TForm2.Edit1Change(Sender: TObject);
var
    i: integer;
begin
  for i:=0 to Form1.n do  if Assigned(LabelCoef[i]) then LabelCoef[i].Free;
  Form1.n := StrToInt(Edit1.Text);
  SetLength(LabelCoef, Form1.n);
  for i:=0 to Form1.n do
  begin
    LabelCoef[i] := TLabel.Create(self);
    with LabelCoef[i] do
    begin
      Caption := 'C'+IntToStr(i);
      SetBounds(8,11+i*15,8+14,11+15+i*15);
      Parent := ScrollBox1;
    end;
  end;
end;

Всё ли я правильно написал? Ничего не изменилось. Хочу заметить, что если ввести что-нибудь от 100 до 109, то все 3 цифры вводятся нормально и ругаться начинает на четвертой. А если ввести, например, 55, то уже на второй.
PM   Вверх
Bitter
Дата 16.12.2006, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 6
Всего: 27



Код

var i: integer;
begin
  for i:=1 to Form1.n do  if Assigned(LabelCoef[i-1]) then LabelCoef[i-1].Free;

  if Edit1.Text='' then
  begin
   Form1.n:=0;
   Exit;
  end;

  Form1.n := StrToInt(Edit1.Text);
  SetLength(LabelCoef, Form1.n);
  for i:=1 to Form1.n do
  begin
    LabelCoef[i-1] := TLabel.Create(self);
    with LabelCoef[i-1] do
    begin
      Caption := 'C'+IntToStr(i);
      SetBounds(8,11+(i-1)*15,8+14,11+15+(i-1)*15);
      Parent := ScrollBox1;
    end;
  end;

PM MAIL ICQ Skype   Вверх
ZufuS
Дата 16.12.2006, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 237
Регистрация: 12.7.2006

Репутация: нет
Всего: нет



Спасибо

Это сообщение отредактировал(а) ZufuS - 26.3.2007, 23:48
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0644 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.