FindComponent не находит компоненты, созданные во время выполнения

Я использую Delphi 7 с рядом сторонних компонентов. Мое основное приложение-заглушка загружает несколько DLL, которые представляют собой различные модули, такие как кредиторы, должники, заказы на поставку и т. Д.

У меня проблема FindComponent(). 99% времени, он работает так, как должен. Но не для кода ниже.

Я пытался создать отчеты о форме, где я сохраняю все детали критериев выбора отчетов в таблице, а затем создаю критерии «на лету». Теоретически, он должен работать отлично, но по какой-то причине после создания компонентов FindComponent()их не найти.

try
  for i := gbSelectionCriteria.ComponentCount - 1 downto 0 do begin
    ShowMessage(gbSelectionCriteria.Components[i].Name);
    gbSelectionCriteria.Components[i].Free;
  end;

  // The above loop to remove the components from the groupbox works fine

  // Creating the components works

  fSysData.tbSelectionCriteria.First;
  while not fSysData.tbSelectionCriteria.EOF do begin
    case fSysData.tbSelectionCriteriaComponentType.AsInteger of
      1 : begin  // TMyAdvEdit
        with TMyAdvEdit.Create(gbSelectionCriteria) do begin
          Visible := False;
          Parent := gbSelectionCriteria;
          Name := fSysData.tbSelectionCriteriaName.AsString;
          Left := fSysData.tbSelectionCriteriaLeft.AsInteger;
          Top := fSysData.tbSelectionCriteriaTop.AsInteger;
          Width := fSysData.tbSelectionCriteriaWidth.AsInteger;
          LabelCaption := fSysData.tbSelectionCriteriaCaption.AsString;
          LabelPosition := AdvEdit.lpLeftCenter;
          LabelAlwaysEnabled := True;
          LabelTransparent := True;
          EditType :=  MyEditType[fSysData.tbSelectionCriteriaDataType.AsInteger];
          Text := '';

          OnClick := GetClickEvent(fSysData.tbSelectionCriteriaOnClickEvent.AsString);
          OnDblClick := GetClickEvent(fSysData.tbSelectionCriteriaOnDblClickEvent.AsString);
          OnKeyPress := GetKeyPressEvent(fSysData.tbSelectionCriteriaOnKeyPressEvent.AsString);

          Visible := True;

          // at this point findComponent finds nothing

          if FindComponent(Name) <> nil then
            ShowMessage(Name+' Created');
        end;

        edEdit.OnClick := GetClickEvent(fSysData.tbSelectionCriteriaOnClickEvent.AsString);
        edEdit.OnDblClick := GetClickEvent(fSysData.tbSelectionCriteriaOnDblClickEvent.AsString);
        edEdit.OnKeyPress := GetKeyPressEvent(fSysData.tbSelectionCriteriaOnKeyPressEvent.AsString);
        edEdit.Visible := True;

        if FindComponent(edEdit.Name) <> nil then
          ShowMessage(edEdit.Name+' Created');

      end;

      2 : begin
      end;

      3 : begin
      end;

      4 : begin
      end;

      5 : begin
      end;

      6 : begin
      end;

      7 : begin
      end;

      8 : begin
      end;
    end;

    fSysData.tbSelectionCriteria.Next;
  end;

  if fSysData.tbSysReports.Locate('ReportID', TAdvOfficeRadioButton(Sender).Tag, []) then begin
    ReportData.ReportID := TAdvOfficeRadioButton(Sender).Tag;
    ReportData.RepName := fSysData.tbSysReportsReportName.AsString;
    ReportData.RepTitle := fSysData.tbSysReportsReportTitle.AsString;
    ReportData.RepModule := fSysData.tbSysReportsModule.AsString;
    ReportData.RepOrientation := fSysData.tbSysReportsReportOrientaton.AsString;
    ReportData.RepPageIndex := fSysData.tbSysReportsCriteriaPageIndex.AsInteger;
  end;
finally
end;

Процесс отчетов:

  1. Пользователь нажимает кнопку

  2. Радио кнопки создаются с помощью кнопки click

  3. Пользователь нажимает на переключатель

  4. Критерий отчета создается из щелчка переключателем

  5. Пользователь вводит данные или DblClicks для выбора данных из списка.

  6. Пользователь щелкает кнопку Preview для просмотра отчета - это где , если длина ( TMyAdvEdit ( FindComponent ( 'edQuoteReference' )). Текст ) > 0 , то qryTempTable . SQL . Добавить ( 'и q.UserReference = "' + TMyAdvEdit ( FindComponent ( 'edQuoteReference' )). Текст + '' ' ); сбой и возвращает нуль.

Весь код работал до того, как я создал все критерии во время разработки, а затем добавил код выше.

Приведенный ниже код является частью того, что необходимо добавить в запрос для получения данных для отчета:

FindComponent()

Это первый раз FindComponentне удается и не идет дальше.

Я пробовал различные способы создания компонентов, но каждый из них приводит к нарушению доступа, потому что компонент равен нулю.

Я повсюду искал и пытался все, что мог придумать, для решения этой проблемы.

delphi,delphi-7,

0

Ответов: 2


6

FindComponentищет компоненты, принадлежащие субъекту вызова метода. Вы вызываете gbSelectionCriteriaформу, и поэтому ищите компонент среди тех компонентов, которыми владеет эта форма. Но элемент управления, который вы ищете, не принадлежит форме, он принадлежит Owner, и это то, что вы передали конструктору FindComponentэлемента управления в качестве аргумента.

Если вы хотите использовать FindComponentтак, как вы это делаете, вам необходимо сделать форму владельцем создаваемых элементов управления. Затем, когда вы вызываете FindComponentформу, она может найти элемент управления, потому что он является владельцем. Перейдите Selfк конструктору элемента управления, чтобы это произошло:

TMyAdvEdit.Create(Self)

Мне нужно сделать некоторые довольно большие догадки. Возможно, этот код фактически находится в модуле данных, а не в форме. Но основной принцип будет, как я уже сказал.


1

Во-первых, я извиняюсь, если это не в том месте.

Спасибо за ответ и ответ, я делаю это в течение многих лет, и я не могу поверить, что пропустил что-то такое маленькое.

это, если FindComponent (Name) <> nil, тогда

должно быть, это, если gbSelectionCriteria.FindComponent (Name) <> nil then

Обычно я не использую, это был всего лишь один способ протестировать создание компонента. Я установил видимость компонентов в false до и после этого до истины после ее создания, чтобы остановить мерцание по мере его создания.

Еще раз спасибо..

Delphi, Delphi 7
Похожие вопросы