Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Ошибка с динамически созданными компонентами


Автор: ZufuS 16.12.2006, 17:08
Имеется компонент струкутры 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 сразу появляется ошибка, а при вводе другой цифры, пока не нажать очередную, всё нормально.

Автор: Bitter 16.12.2006, 20:26
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)


Автор: ZufuS 16.12.2006, 20:53
Код

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, то уже на второй.

Автор: Bitter 16.12.2006, 22:54
Код

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;

Автор: ZufuS 16.12.2006, 22:59
Спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)