Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Присылайте нам Донат :), напишите за что прислали )


Ответ
 
Опции темы
Старый 10.05.2019, 12:15   #1
niockasd
Форумчанин
 
Регистрация: 01.12.2015
Сообщений: 55
Репутация: 10
По умолчанию [РЕШЕНО][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 в 14:45.
niockasd вне форума   Ответить с цитированием
Старый 10.05.2019, 12:42   #2
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,860
Репутация: 2195
По умолчанию

создаете вы с привязкой на один компонент (включаете в список)
Цитата:
Код:

btn:=TToolButton.Create(FileTransferForm.LocalDiskPanel);

а искать пытаетесь совсем в другом
Цитата:
Код:

  for b := 0 to FileTransferForm.ComponentCount-1 do

__________________
программа — запись алгоритма на языке понятном транслятору

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

Да... есть такое, поправил
Код:

         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, 14:32   #4
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,860
Репутация: 2195
По умолчанию

Код:

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 в 14:41.
evg_m на форуме   Ответить с цитированием
Старый 10.05.2019, 14:49   #5
niockasd
Форумчанин
 
Регистрация: 01.12.2015
Сообщений: 55
Репутация: 10
По умолчанию

Цитата:
Сообщение от 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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


09:50.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru