Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Найти компонент по имени

Delphi , Компоненты и Классы , Компоненты

Найти компонент по имени

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{Instead of writing: / Anstatt so was zu schreiben:}

 Edit1.Text := 'Text 1';
 Edit2.Text := 'Text 2';
 Edit3.Text := 'Text 3';
 Edit4.Text := 'Text 4';
 {...}
 Edit9.Text := 'Text 9';

 {...it's easier to write / ...geht's so einfacher:}

 { 
  Use the forms FindComponent to find a component on the form. 
  TypeCast the Result of FindComponent to the TComponent to be able to use it. 
}


 for i := 1 to 9 do
   TEdit(FindComponent('Edit'+IntToStr(i))).Text := 'Text' + IntToStr(i);

 {or/oder:}

 for i:= 1 to 9 do
   (Findcomponent('Edit'+IntToStr(i)) as TEdit).Text := IntToStr(i);



 { 
  Another example: find a component on any form with 
  a search string like this: 'MyForm10.Edit2' 

  Ein anderes Beispiel: 
  Eine Komponente auf irgendeiner Form finden mittels einer 
  solchen Zeichenfolge: 'MyForm10.Edit2' 
}

 function FindComponentEx(const Name: string): TComponent;
 var
   FormName: string;
   CompName: string;
   P: Integer;
   Found: Boolean;
   Form: TForm;
   I: Integer;
 begin
   // Split up in a valid form and a valid component name 
  P := Pos('.', Name);
   if P = 0 then
   begin
     raise Exception.Create('No valid form name given');
   end;
   FormName := Copy(Name, 1, P - 1);
   CompName := Copy(Name, P + 1, High(Integer));
   Found    := False;
   // find the form 
  for I := 0 to Screen.FormCount - 1 do
   begin
     Form := Screen.Forms[I];
     // case insensitive comparing 
    if AnsiSameText(Form.Name, FormName) then
     begin
       Found := True;
       Break;
     end;
   end;
   if Found then
   begin
     for I := 0 to Form.ComponentCount - 1 do
     begin
       Result := Form.Components[I];
       if AnsiSameText(Result.Name, CompName) then Exit;
     end;
   end;
   Result := nil;
 end;

 procedure TFrom1.Button1Click(Sender: TObject);
 var
   C: TComponent;
 begin
   C := FindComponentEx('MyForm10.Edit2');
   TEdit(C).Caption := 'Hello';
 end;

Программный код на Delphi, демонстрирующий поиск компонента на форме по его имени и изменение свойств компонента.

Вот разбивка кода:

  1. Первая секция defines a loop, который устанавливает свойство текста для множества компонентов TEdit (Edit1 до Edit9) с помощью цикла for.
  2. Вторая секция использует функцию FindComponent для поиска компонента на форме с конкретным именем и затем кастит его в TEdit-компонент, чтобы избежать ошибок времени выполнения при работе с компонентами, не являющимися конкретного класса.
  3. Третья секция демонстрирует использование функции FindComponentEx для поиска компонента на любой форме с строкой поиска, например, 'MyForm10.Edit2'. Функция разбивает имя на валидное имя формы и валидное имя компонента, находит форму в коллекции Screen.Forms и затем ищет компонент в этой форме.
  4. Последняя секция defines a procedure (Button1Click), который вызывается при клике кнопки Button1 на Form1. Код использует функцию FindComponentEx для поиска компонента 'MyForm10.Edit2', кастит его в TEdit-компонент и устанавливает свойство caption в 'Hello'.

Вот некоторые предложения по улучшению кода:

  • Вместо использования цикла for для установки свойств текста для множества TEdit-компонентов, рассмотрите возможность использования массива или списка для хранения имён компонентов и затем использовать одиночный цикл для перебора массива или списка.
  • Рассмотрите добавление обработки ошибок в функцию FindComponentEx в случае, если компонент не найден или форма не существует.
  • Вместо жесткого кодирования имени формы и компонента в функции FindComponentEx рассмотрите возможность сделать их параметрами, чтобы функция могла быть использована с разными формами и компонентами.

Вот альтернативное решение с помощью словаря для хранения имён форм и соответствующих компонентов:

uses
  SysUtils;

type
  TFormDictionary = TObjectDictionary<string, TComponent>;

var
  FormDict: TFormDictionary;

function FindComponentEx(const Name: string): TComponent;
begin
  if FormDict = nil then
    FormDict := TFormDictionary.Create;

  // Split up the name into a valid form and a valid component name
  P := Pos('.', Name);
  if P = 0 then
    raise Exception.Create('No valid form name given');

  FormName := Copy(Name, 1, P - 1);
  CompName := Copy(Name, P + 1, High(Integer));

  // Find the form in the dictionary
  if FormDict.TryGetValue(FormName, Result) then
  begin
    // The component is found, return it
    Exit;
  end;

  // If not found, raise an exception
  raise Exception.Create('Component not found');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  C: TComponent;
begin
  C := FindComponentEx('MyForm10.Edit2');
  TEdit(C).Caption := 'Hello';
end;

В этом решении используется TObjectDictionary для хранения имён форм и соответствующих компонентов. Функция FindComponentEx разбивает имя на валидное имя формы и валидное имя компонента, находит форму в словаре, и затем возвращает компонент, если он найден. Если не найден, она выбрасывает исключение. Это решение более гибкое и масштабируемое, чем оригинальный код.

Статья посвящена описанию методов поиска компонентов в приложении Delphi, включая использование функции FindComponent и создание собственного алгоритма поиска с помощью процедуры FindComponentEx.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Компоненты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-07 00:54:58/0.0033972263336182/0