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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2019, 11:15   #1
niockasd
Пользователь
 
Регистрация: 01.12.2015
Сообщений: 82
По умолчанию [РЕШЕНО][Delphi] Уничтожение динамически созданного компонента

Решение проблемы в постах ниже

Народ, привет.
Хочу сделать кнопки для дисков, динамически создаваемые.
Пытаюсь это провернуть так:

Код:
function CreateNameComponent(Article,Drive: String): String;
begin
  Drive := ExtractFileDrive(Drive);
  Drive :=StringReplace(Drive, ':', '', [rfReplaceAll, rfIgnoreCase]);
  result:=Article+Drive;
end;
...
...
...

Procedure  FindDiskLocal;
var
  i, j: integer;
  buf: array [0..499] of char;
  DrvStr: array [0..9] of char;
  LogDrives: set of 0..25;

  btn: TToolButton;
  b: Integer;
begin
  integer(LogDrives) := GetLogicalDrives;

  GetLogicalDriveStrings(1000, buf);
  i := 0;
  repeat
    FillChar(DrvStr, SizeOf(DrvStr), #0);
    j := 0;
    repeat
      DrvStr[j] := buf[i];
      inc(j);
      inc(i);
    until
      (buf[i] = #0) or (j > 9);
    inc(i);
         FileTransferForm.DiskListLocal.Items.Add(DrvStr);


         for b := 0 to FileTransferForm.ComponentCount-1 do
            if FileTransferForm.Components[i].Name = CreateNameComponent('LocalDisk',DrvStr) then
               begin

                 FileTransferForm.Components[i].Free;
               end;


         btn:=TToolButton.Create(FileTransferForm.LocalDiskPanel);
         btn.Parent:=FileTransferForm.LocalDiskPanel;
         btn.Width:=60;
         btn.Caption:= DrvStr;
         btn.Name:=CreateNameComponent('LocalDisk',DrvStr);


  until
    ((buf[i-1] = #0) and (buf[i] = #0)) or (i > 499);

    FileTransferForm.DiskListLocal.ItemIndex:=0;
    FileTransferForm.PathLocalEdit.Text:=FileTransferForm.DiskListLocal.Items.Strings[FileTransferForm.DiskListLocal.ItemIndex];
end;
Все создается, но мне нужно периодически пересоздавать этот список..
на этом месте программа вылетает с ошибкой компонент уже существует.
Пытался удалять кодом
Код:
         for b := 0 to FileTransferForm.ComponentCount-1 do
            if FileTransferForm.Components[i].Name = CreateNameComponent('LocalDisk',DrvStr) then
               begin

                 FileTransferForm.Components[i].Free;
               end;
но судя по всему не в этом направлении капаю, хотя логично выглядит)...

Последний раз редактировалось Вадим Мошев; 13.05.2019 в 13:45.
niockasd вне форума Ответить с цитированием
Старый 10.05.2019, 11:42   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

создаете вы с привязкой на один компонент (включаете в список)
Цитата:
Код:
btn:=TToolButton.Create(FileTransferForm.LocalDiskPanel);
а искать пытаетесь совсем в другом
Цитата:
Код:
  for b := 0 to FileTransferForm.ComponentCount-1 do
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.05.2019 в 11:44.
evg_m на форуме Ответить с цитированием
Старый 10.05.2019, 13:17   #3
niockasd
Пользователь
 
Регистрация: 01.12.2015
Сообщений: 82
По умолчанию

Да... есть такое, поправил
Код:
         for b := 0 to FileTransferForm.LocalDiskPanel.ComponentCount-1 do
           if (FileTransferForm.LocalDiskPanel.Components[b] as ttoolbutton).Name = CreateNameComponent('LocalDisk',DrvStr) then
               begin
                 FileTransferForm.LocalDiskPanel.Components[b].Free;

               end;

               btn:=TToolButton.Create(FileTransferForm.LocalDiskPanel);
               btn.Parent:=FileTransferForm.LocalDiskPanel;
               btn.Width:=60;
               btn.Caption:= DrvStr;
               btn.Name:=CreateNameComponent('LocalDisk',DrvStr);
Теперь выбивает "argument of range" при попытке второй раз кнопоки создать)
niockasd вне форума Ответить с цитированием
Старый 10.05.2019, 13:32   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
for b := 0 to FileTransferForm.LocalDiskPanel.ComponentCount-1 do
после удаления число компонент меняется, но...
границы цикла for считаются ровно один раз (до начала цикла)
после удаления начального [0], следующий за ним ТОЖЕ станет начальным [1]-->[0]
а [1] станет недействительным
Цитата:
Теперь выбивает "argument of range"
Код:
 for b :=FileTransferForm.LocalDiskPanel.ComponentCount-1 downto 0 do
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.05.2019 в 13:41.
evg_m на форуме Ответить с цитированием
Старый 10.05.2019, 13:49   #5
niockasd
Пользователь
 
Регистрация: 01.12.2015
Сообщений: 82
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
for b := 0 to FileTransferForm.LocalDiskPanel.ComponentCount-1 do
после удаления число компонент меняется, но...
границы цикла for считаются ровно один раз (до начала цикла)
после удаления начального [0], следующий за ним ТОЖЕ станет начальным [1]-->[0]
а [1] станет недействительным

Код:
 for b :=FileTransferForm.LocalDiskPanel.ComponentCount-1 downto 0 do
спасибо, запомнил. Все работает. )
niockasd вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение данных из динамически созданного компонента Кинельски Общие вопросы Delphi 1 08.05.2011 18:39
Access Violation на вызове события динамически созданного компонента JoLan Компоненты Delphi 1 14.03.2011 00:37
Как отловить Events динамически созданного компонента? W0LF Общие вопросы Delphi 2 06.11.2009 20:35
Поиск динамически созданного компонента GAGARIN-NEW Общие вопросы Delphi 2 30.01.2008 17:21
Поиск динамически созданного компонента GAGARIN-NEW Компоненты Delphi 2 16.12.2007 17:07