是否可能使用来自xml等文件的配置模式为Delphi应用程序创建GUI。是否存在任何框架可用于此类操作。使用脚本语言非常容易,但我们能否在Delphi中模拟此行为?
我需要免费的库。
是否可能使用来自xml等文件的配置模式为Delphi应用程序创建GUI。是否存在任何框架可用于此类操作。使用脚本语言非常容易,但我们能否在Delphi中模拟此行为?
我需要免费的库。
是的,这是可能的。实现伪代码如下:
var
AParent:Tpanel;
Edit:TControl;
for i := 0 to ConfigItems.Count - 1 do
begin
if (ConfigItems[i].Type = 0) then Edit := TEdit.Create(AParent) as TControl
else Edit := TAnotherEditOrAnotherControlType.Create(APanel) as TControl;
//assume 20 pixels for each control, so thay will be placed one below another
Edit.Top := i * 20;
//Left in this case can be fixed
Edit.Left := 10;
Edit.Parent := AParent;
end;
这将在声明为AParent的TPanel上创建一些TEdit或其他控件(例如,TAnotherEditOrAnotherControlType),但如果您将Edit变量声明为TControl,则可以创建所需的任何控件。
当然,您可以声明一个大CASE语句,而不是IF子句,并创建适当类型的控件。
AStream.WriteComponent(AComponent);
MyComponent:= Result:= AStream.ReadComponent(AComponent);
作为文本:
procedure WriteComponentAsText(AStream: TStream; AComponent: TComponent);
var
BinStream:TMemoryStream;
begin
BinStream := TMemoryStream.Create;
try
BinStream.WriteComponent(AComponent);
BinStream.Seek(0, soFromBeginning);
ObjectBinaryToText(BinStream, AStream);
finally
BinStream.Free
end;
end;
function ReadComponentAsText(AStream: TStream; AComponent: TComponent): TComponent;
var
BinStream:TMemoryStream;
begin
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(AStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result:= BinStream.ReadComponent(AComponent);
finally
BinStream.Free
end;
end;
您需要使用RegisterClass注册您想要保存或加载的任何类:
RegisterClass(TPanel);
Glade 也使用XML文件来描述GUI,然后在运行时创建。不过我不知道它是否可以与Delphi一起使用。
没问题 :) 我已经为一个只使用文本框、规则(线条)和图形的页面设计者完成了这项工作,但它应该适用于所有已注册的控件。
[随意编写的代码近似值]
var
i, itemCount: Integer;
AClassName: string;
AnItemClass: TSomeBaseClass;
AnItem: TSomeDrivedBaseClass
ARect: TRect;
begin
// just so we have an initail size
ARect.Left := 100;
ARect.Top := 100;
ARect.Bottom := 200;
ARect.Right := 200;
// Alist is a specialised TStringList
for i := 0 to itemCount - 1 do
begin
AClassName := Alist.ByKey['Class' + IntToStr(i)]; // locate class name
AnItemClass := TSomeBaseClass(GetClass(AClassName)); // ClassName must be registered
AnItem := AnItemClass.Create(OwnerComponent, ARect, AParent);
AnItem.LoadFromFile(IntToStr(i), AList); // specialised loader that reads and sets all necessary properties
AddItemToComponentList(AnItem); // Add to form / frame / panel whatever
end;
end;
是的,请看看TMS Scripter Studio Pro,它是由TMS Software开发的。
通过本地Pascal或Basic脚本和完整的IDE(集成开发环境)以及可视化表单设计器、对象检查器等功能,将终极灵活性和强大功能添加到您的应用程序中。