Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2012, 21:35   #1
StrangeR_965
Новичок
Джуниор
 
Регистрация: 02.07.2011
Сообщений: 1
По умолчанию Проблема с удалением динамического объекта

Всем доброго времени суток!
Прошу прощения за мою тупость, в программировании я шарю, как оказалось, чуть больше чем осьминог в проектировании реактивных двигателей, поэтому будьте не сильно строги.
Такая вот проблема у меня.
Создаю Edit, куда вводятся числа.
Имеется динамический массив объектов типа TLabel.
Нужно сделать следующее: чтобы при изменении значения Edit-а на форме, а вернее на Panel создавался массив Label-ов той же длины, что и введенное в Edit число.
Часть процедуры сделал, и, по всей видимости, крайне криво.

Как у меня реализовано: Процедура Edit1Change проверяет было ли что-то написано в Edit1 до изменения, если нет, то просто создает Label-ы. Если же было, то запоминает введенное до изменения число и если это число меньше, чем новое введенное, то считает разницу между новым и старым числом и до-создает еще такое количество Label-ов. Если же новое введенное в Edit1 число меньше, чем то, что было до изменения, то соответственно нужно удалить лишние Label-ы. Вот тут то и возникает проблема. Не могу удалить их внутри процедуры Edit1Change. Внутри другой, например если повесить удаление на нажатие Button, то все нормально, а внутри Edit1Change, хоть убей - никак.
Код:
procedure TForm1.Edit1Change(Sender: TObject);
var i:integer;                // Счетчик
    OldLevels:integer;        // Старое введенное число
    Levels:integer;            // Новое введенное число
    LabelsP1:array of TLabel; // Массив Label-ов
begin
  OldLevels:=Levels;            // в процедуре Form1Activate Levels:=0
  if Edit1.Text<>'' then
  begin
    Levels:=StrToInt(Edit1.Text);
    Panel1.Visible:=True;
    SetLength(LabelsP1,Levels);
  end else
  begin
    Levels:=0;
    Panel1.Visible:=False;
  end;
  if ((OldLevels=0)and(Levels<>0)) then
  begin
    for i:=1 to Levels do
    begin
      LabelsP1[i-1]:=TLabel.Create(Self);
      LabelsP1[i-1].Parent:=Panel1;
      LabelsP1[i-1].Left:=0;
      LabelsP1[i-1].Top:=i*20+25;
      LabelsP1[i-1].Caption:=IntToStr(i)+'-é óðîâåíü';
    end;
  end;
  if ((OldLevels<>0)and(Levels<>0)) then
  begin
    if OldLevels<Levels then
    begin
      for i:=OldLevels to Levels do
      begin
        LabelsP1[i-1]:=TLabel.Create(Self);
        LabelsP1[i-1].Parent:=Panel1;
        LabelsP1[i-1].Left:=0;
        LabelsP1[i-1].Top:=i*20+25;
        LabelsP1[i-1].Caption:=IntToStr(i)+'-é óðîâåíü';
      end;
    end;
    if OldLevels>Levels then
    begin

     // Рак мозгов! Перепробовал все что в голову пришло, не могу удалять лишние LabelsP1

    end;
  end;
end;
Парни, помогите, туплю...
Могу прицепить весь проект, если нужно.

Последний раз редактировалось Stilet; 01.02.2012 в 11:10.
StrangeR_965 вне форума Ответить с цитированием
Старый 01.02.2012, 01:06   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

- Присвоение неинициализированного значения локальной переменной (OldLevels:=Levels;).
- Сокращение длины массива до того как освобождены объекты, на которые ссылались удаленные элементы массива.

Даже этих логических ошибок достаточно, чтобы на коде в таком варианте поставить крест.

Для удаления любого объекта, в том числе и визуального применяется метод Free
К примеру, LabelsP1[i].Free;
Прик вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
роблема с созданием объекта динамического массива Класса GDA230105 C++ Builder 3 26.07.2011 09:25
Проблема с удалением файла Dimarik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 25.06.2011 20:15
проблема с удалением массива в vc++ scripto Общие вопросы C/C++ 9 13.12.2010 21:48
динамический родитель динамического объекта russianstrike Компоненты Delphi 6 03.10.2008 22:07
Проблема с удалением файлов. Dj_smart Общие вопросы Delphi 4 22.03.2008 12:32