使用配置文件创建动态GUI界面

9

是否可能使用来自xml等文件的配置模式为Delphi应用程序创建GUI。是否存在任何框架可用于此类操作。使用脚本语言非常容易,但我们能否在Delphi中模拟此行为?

我需要免费的库。

7个回答

6

XI似乎完全符合我的要求,但有一个问题。它不是免费的。我应该在问题中首先提到这一点。 - user114285

3

是的,这是可能的。实现伪代码如下:

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子句,并创建适当类型的控件。

  • 将Parent作为动态控件构造函数的参数添加(以便可以自动释放动态控件)
  • 将动态控件的Parent设置为我们的AParent面板 - 这行实际上将控件放置在父面板上。

2
你可以从流和文件中保存和加载dfm文件。你可以保存/加载整个表单,或者只是一个组件及其子组件。
例如:
二进制格式:
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);

2

Glade 也使用XML文件来描述GUI,然后在运行时创建。不过我不知道它是否可以与Delphi一起使用。


1
http://gtk2forpascal.sourceforge.net/,特别是libglade2.pas文件:http://gtk2forpascal.cvs.sourceforge.net/viewvc/gtk2forpascal/gtk2/libglade/libglade2.pas?view=markup - Stobor

1

没问题 :) 我已经为一个只使用文本框、规则(线条)和图形的页面设计者完成了这项工作,但它应该适用于所有已注册的控件。

[随意编写的代码近似值]

    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;

当然,你首先需要一个可以保存设计的“表单设计器” - 保存只是上述过程的反向操作...我会把这留给读者作为练习。稍加修改,你可以使用Delphi并读取DFM文件 :)

1

是的,请看看TMS Scripter Studio Pro,它是由TMS Software开发的。

通过本地Pascal或Basic脚本和完整的IDE(集成开发环境)以及可视化表单设计器、对象检查器等功能,将终极灵活性和强大功能添加到您的应用程序中。

Scripter Studio Pro


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接