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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2011, 22:47   #1
Sullla
Пользователь
 
Регистрация: 27.05.2011
Сообщений: 24
По умолчанию Проблема с FindComponent

Процедура нормально работает, но только с формы, на которой размещена. С других форм вызывается, но FindComponent компонент не находит. Компонент создается динамически. В чем причина?
Код:
procedure TfrmMain.DestroyWindowLabel(formCaption:string);
var
  pnlLabelWindow:TComponent;
  i,delIndex:integer;
begin
  for i:=1 to 10 do
  begin
    if self.FindComponent('pnlLabelWindow'+IntToStr(i))<>nil then
    begin
      pnlLabelWindow:=self.FindComponent('pnlLabelWindow'+IntToStr(i));
      if  (pnlLabelWindow <> nil) then
      begin
        if TPanel(pnlLabelWindow).Caption=formCaption then
        begin
          TPanel(pnlLabelWindow).Free;
          delIndex:=i;
        end
        else if i>delIndex then
          TPanel(pnlLabelWindow).Left:=TPanel(pnlLabelWindow).Left+(delIndex-2)*200+1;
      end;
    end
    else showMessage('pnlLabelWindow'+IntToStr(i)+' not found!');
  end;
end;
Sullla вне форума Ответить с цитированием
Старый 26.09.2011, 22:57   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

self.FindComponent ищет на той форме где расположен, в данном случае frmMain
хотите на другой искать - вместо Self - указатель на другую форму
? зачем дважды проверку на <>nil
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.09.2011 в 23:02.
Аватар вне форума Ответить с цитированием
Старый 26.09.2011, 22:58   #3
Sullla
Пользователь
 
Регистрация: 27.05.2011
Сообщений: 24
По умолчанию

Пробовал
Цитата:
frmMain.FindComponent('pnlLabelWind ow'+IntToStr(i))<>nil
Все равно не работает
Sullla вне форума Ответить с цитированием
Старый 26.09.2011, 23:06   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Я правильно понял - вы хотите эту процедуру использовать для поиска компонент только на frmMain, но вызывать ее с других форм? Или для поиска в т.ч. на других формах?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.09.2011, 23:09   #5
Sullla
Пользователь
 
Регистрация: 27.05.2011
Сообщений: 24
По умолчанию

frmMain - материнская форма, там же и находятся искомые компоненты. С других форм процедура успешно вызывается, но компоненты не находит
Sullla вне форума Ответить с цитированием
Старый 26.09.2011, 23:29   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В логике процедуры после первого обращения и удаления pnlLabelWindow1 остальные обращения всегда будут давать "'pnlLabelWindow1 not found!". Так задумано?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.09.2011 в 23:33.
Аватар вне форума Ответить с цитированием
Старый 26.09.2011, 23:44   #7
Sullla
Пользователь
 
Регистрация: 27.05.2011
Сообщений: 24
По умолчанию

Предварительно создаю компоненты, а Эта процедура удаляет те, которые нужно удалить, а другие при этом изменяют свое местоположение. С mainForm все работает без проблем
Sullla вне форума Ответить с цитированием
Старый 26.09.2011, 23:52   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну вот вы обратились первый раз:
DestroyWindowLabel('Caption1');
допустим pnlLabelWindow1.Caption='Caption1'
Эта панель удалится.

Обращаетесь второй раз с любым параметром.
для i=1 имя 'pnlLabelWindow1' сразу же не найдется, поскольку уже удалена эта панель. Что получите?

Посмотрите по-шагово

add

Обратите внимание - начальное значение delIndex перед циклом не присвоено, можете вырулить на него при сравнении. Присвойте 11 например
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.09.2011 в 23:58.
Аватар вне форума Ответить с цитированием
Старый 27.09.2011, 00:22   #9
Sullla
Пользователь
 
Регистрация: 27.05.2011
Сообщений: 24
По умолчанию

Смотрим так
Цитата:
for i:=1 to 10 do
begin
if self.FindComponent('pnlLabelWindows '+IntToStr(i))<>nil then
begin
...
end
else showMessage('pnlLabelWindow'+IntToS tr(i)+' not found!');
end;
Sullla вне форума Ответить с цитированием
Старый 27.09.2011, 03:55   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

fftopic

Цитата:
зачем дважды проверку на <>nil
Второй - контрольный.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FindComponent WOLFak Общие вопросы Delphi 9 07.07.2012 23:29
FindComponent Enclounter Windows Forms 14 26.04.2012 22:45
findcomponent и tedit zotox Общие вопросы Delphi 12 30.05.2010 04:37
FindComponent StartMis Общие вопросы Delphi 3 15.12.2009 20:03
В чем я ошибся? FindComponent zotox Помощь студентам 5 29.09.2009 02:27