Создание компонентов во время выполнения - Delphi

для spark.local.dir, он будет перемещать только искровые временные файлы, но файл snappy-xxx все еще будет существовать в каталоге / tmp. Хотя он и не нашел способ искры автоматически очистить его, но вы можете установить опцию JAVA:

JVM_EXTRA_OPTS=" -Dorg.xerial.snappy.tempdir=~/some-other-tmp-dir"

, чтобы заставить его перемещаться в другой каталог, так как большая часть системы имеет небольшой размер / tmp.

20
задан Lukáš Neoproud 5 June 2015 в 22:38
поделиться

7 ответов

It depends if it is a visual or non-visual component. The principle is the same, but there are some additional considerations for each kind of component.

For non-visual components

var
  C: TMyComponent;
begin
  C := TMyComponent.Create(nil);
  try
    C.MyProperty := MyValue;
    //...
  finally
    C.Free;
  end;
end;

For visual components:

In essence visual components are created in the the same way as non-visual components. But you have to set some additional properties to make them visible.

var
  C: TMyVisualComponent;
begin
  C := TMyVisualComponent.Create(Self);
  C.Left := 100;
  C.Top := 100;
  C.Width := 400;
  C.Height := 300;
  C.Visible := True;
  C.Parent := Self; //Any container: form, panel, ...

  C.MyProperty := MyValue,
  //...
end;

A few explanations to the code above:

  • By setting the owner of the component (the parameter of the constructor) the component gets destroyed when the owning form gets destroyed.
  • Setting the Parent property makes the component visible. If you forget it your component will not be displayed. (It's easy to miss that one :) )

If you want many components you can do the same as above but in a loop:

var
  B: TButton;
  i: Integer;
begin
  for i := 0 to 9 do
  begin
    B := TButton.Create(Self);
    B.Caption := Format('Button %d', [i]);
    B.Parent := Self;
    B.Height := 23;
    B.Width := 100;
    B.Left := 10;
    B.Top := 10 + i * 25;
  end;
end;

This will add 10 buttons at the left border of the form. If you want to modify the buttons later, you can store them in a list. (TComponentList ist best suited, but also take a look at the proposals from the comments to this answer)

How to assign event handlers:

You have to create an event handler method and assign it to the event property.

procedure TForm1.MyButtonClick(Sender: TObject);
var
  Button: TButton;
begin
  Button := Sender as TButton; 
  ShowMessage(Button.Caption + ' clicked');
end;

B := TButton.Create;
//...
B.OnClick := MyButtonClick;
66
ответ дан 29 November 2019 в 22:28
поделиться

To simplify the runtime component creation process, you can use GExperts.

  1. Create a component (or more components) visually and set its properties.
  2. Select one or more components and execute GExperts, Components to Code.
  3. Paste the generated code into your application.
  4. Remove component(s) from the visual form designer.

Example (TButton-creation code generated in this way):

var
  btnTest: TButton;

btnTest := TButton.Create(Self);
with btnTest do
begin
  Name := 'btnTest';
  Parent := Self;
  Left := 272;
  Top := 120;
  Width := 161;
  Height := 41;
  Caption := 'Component creation test';
  Default := True;
  ParentFont := False;
  TabOrder := 0;
end;
24
ответ дан 29 November 2019 в 22:28
поделиться

Очень просто. Вызовите Create. Пример:

procedure test
var
  b : TButton;
begin
  b:=TButton.Create(nil);
  b.visible:=false;
end;

Это создает компонент (TButton - это компонент) во время выполнения и устанавливает свойство visible.


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

0
ответ дан 29 November 2019 в 22:28
поделиться

Некоторые компоненты переопределяют метод 'Loaded'. Этот метод не будет вызываться автоматически, если вы создадите экземпляр во время выполнения. Он будет вызван Delphi после завершения загрузки из файла формы (DFM).

Если метод содержит код инициализации, ваше приложение может показать неожиданное поведение при создании во время выполнения. В этом случае проверьте, использовал ли компонент записи этот метод.

0
ответ дан 29 November 2019 в 22:28
поделиться

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

0
ответ дан 29 November 2019 в 22:28
поделиться

Но если я точно не знаю, сколько компонентов я хочу создать, например, если это зависит от решения пользователя. Итак, как я могу объявлять компоненты динамически?

Ответ был предложен - самый простой способ - это список объектов (компонентов). TObjectList - самый простой в использовании (в элементах управления). Списки отличные!

  In Form1 Public
  MyList: TObjectList;
  procedure AnyButtonClick(Sender: TObject); 

// Вы можете усложниться и объявить // TNotifyevents и назначить их, но давайте не будем усложнять :) . . .

procedure Tform1.AnyButtonClick(Sender: TObject);
begin
  If Sender is TButton then
  begin
    Case Tbutton(Sender).Tag of 
    .
    .
    .
// Or You can use the index in the list or some other property 
// you have to decide what to do      
// Or similar :)
  end;
end;

procedure TForm1.BtnAddComponent(Sender: TObJect)
var
  AButton: TButton;
begin
  AButton := TButton.Create(self);
  Abutton. Parent := [Self], [Panel1] [AnOther Visual Control];
  AButton.OnClick := AnyButtonClick;
// Set Height and width and caption ect.
  .
  .
  . 
  AButton.Tag := MyList.Add(AButton);
end;

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

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

1
ответ дан 29 November 2019 в 22:28
поделиться

Во время исследования «создания формы delphi с использованием шаблона на основе xml» я нахожу кое-что полезным, указывая на RTTI и используя открытые инструменты api ( Думаю, ToolsApi.pas). Посмотрите на интерфейсы в устройстве.

1
ответ дан 29 November 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: