2009-06-05 22 views
9

xml etc ...ファイルの設定パターンを使用してDelphiアプリケーションのGUIを作成することは可能です。このような操作のためのフレームワークはすべて存在します。言語のようなスクリプトでは簡単ですが、Delphiでこの動作をシミュレートできますか?設定ファイルを使用した動的GUIの作成

私は無料のライブラリが必要です。

答えて

6

XI LibraryまたはEControlを見てみましょう。

+0

+1、このXIライブラリはグレーに見えますt。 – mghie

+0

XIは自分の要件を完全に満たしているようですが、それは無料ではありません。私は最初の質問でそのことを言及すべきだった。 – user114285

3

はい、可能です。このための擬似コードは、これには数TEDITや他のいくつかのコントロールが作成されます(たとえば、TAnotherEditOrAnotherControlTypeをしかし、あなたがのTControlとして編集変数を宣言した場合、あなたはあなたが必要とするすべてのコントロールを作成することができます)TPanel上のように宣言この

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; 

のようなものです親。 IF句の代わりに、大きなCASE文を宣言し、適切な型のコントロールを作成することができます。当社AParentパネルに 重要な行は(動的制御を自動的に解放することができるように)

  • は、動的制御コンストラクタのパラメータとして親を追加します
  • セットの動的コントロールの親 - この行は、実際には、親パネル上のコントロールを配置します。あなたがTorryの使用RTTIにここにいくつかの例を見つけることができます
1

はい、TMS SoftwareによってTMS Scripter Studio Proを見てみましょう。視覚的なフォームデザイナ、オブジェクトインスペクタ 、そしてより多くのと

ネイティブ Pascalや基本的なスクリプトとフルIDE (統合開発環境)を使用してアプリケーションに究極の柔軟性とパワー を追加 。

Scripter Studio Pro

2

Gladeも、実行時に作成されるGUIを記述するためにXMLファイルを使用します。ただし、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ファイルを読むことができます:)

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); 
関連する問題