使用配置文件创建动态GUI

时间:2009-06-05 15:07:06

标签: xml delphi forms user-interface generics

可以使用xml etc ...文件中的配置模式为Delphi应用程序创建GUI。这种操作存在任何框架。使用类似语言的脚本很容易,但是我们可以在Delphi中模拟这种行为吗?

我需要免费的图书馆。

7 个答案:

答案 0 :(得分:6)

查看XI LibraryEControl

答案 1 :(得分: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;

这将创建一些TEdit或其他控件(例如,TAnotherEditOrAnotherControlType,但如果您将Edit变量声明为TControl,则可以创建所需的任何控件)在TPanel上声明为AParent。 当然,不是IF子句,您可以声明大CASE语句,并创建适当类型的控件。 重要的是

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

答案 2 :(得分:2)

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

答案 3 :(得分: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);

答案 4 :(得分:1)

是的,请TMS Scripter Studio Pro查看TMS Software

  

增加最大的灵活性和力量   用本机进入你的应用程序   Pascal或Basic脚本和完整的IDE   (综合发展环境)   与视觉形式设计师,对象   检查员等等。

Scripter Studio Pro

答案 5 :(得分: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;

当然,你首先需要一个可以最初保存设计的“表单设计器” - 保存与上面相反......我将把它作为Reader的练习。如果稍作修改,您可以使用Delphi并阅读DFM文件:)

答案 6 :(得分:0)

你可以在这里找到Torry使用RTTI的一些例子:

http://www.torry.net/quicksearchd.php?String=RTTI&Title=Yes