для spark.local.dir
, он будет перемещать только искровые временные файлы, но файл snappy-xxx все еще будет существовать в каталоге / tmp. Хотя он и не нашел способ искры автоматически очистить его, но вы можете установить опцию JAVA:
JVM_EXTRA_OPTS=" -Dorg.xerial.snappy.tempdir=~/some-other-tmp-dir"
, чтобы заставить его перемещаться в другой каталог, так как большая часть системы имеет небольшой размер / tmp.
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:
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;
To simplify the runtime component creation process, you can use GExperts.
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;
Очень просто. Вызовите Create. Пример:
procedure test
var
b : TButton;
begin
b:=TButton.Create(nil);
b.visible:=false;
end;
Это создает компонент (TButton - это компонент) во время выполнения и устанавливает свойство visible.
Для конструктора: передайте nil, если вы хотите управлять памятью самостоятельно. Передайте указатель на другой компонент, если вы хотите, чтобы он был уничтожен, когда другой компонент будет уничтожен.
Некоторые компоненты переопределяют метод 'Loaded'. Этот метод не будет вызываться автоматически, если вы создадите экземпляр во время выполнения. Он будет вызван Delphi после завершения загрузки из файла формы (DFM).
Если метод содержит код инициализации, ваше приложение может показать неожиданное поведение при создании во время выполнения. В этом случае проверьте, использовал ли компонент записи этот метод.
Если вы вкладываете элементы управления победой в блоки групп / элементы управления страницами / и т. Д., Я думаю, что полезно, чтобы блок родительской группы также был владельцем. Я заметил резкое уменьшение времени закрытия окна при этом, в отличие от того, что владелец всегда был главной формой.
Но если я точно не знаю, сколько компонентов я хочу создать, например, если это зависит от решения пользователя. Итак, как я могу объявлять компоненты динамически?
Ответ был предложен - самый простой способ - это список объектов (компонентов). 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;
Список объектов может содержать любой визуальный объект или нет, но это дает вам дополнительные накладные расходы на сортировку, какие элементы являются какими - лучше иметь связанные списки, например, если вам нужно несколько динамических элементов управления на одинаковых панелях.
Примечание : как и другие комментаторы, я, возможно, слишком упростил для краткости, но я надеюсь, что вы уловили идею. Вам нужен механизм для управления объектами после их создания, и списки отлично подходят для этого.
Во время исследования «создания формы delphi с использованием шаблона на основе xml» я нахожу кое-что полезным, указывая на RTTI и используя открытые инструменты api ( Думаю, ToolsApi.pas). Посмотрите на интерфейсы в устройстве.