2009-06-05 12 views
9

Es ist möglich, eine GUI für eine Delphi-Anwendung mit einem Konfigurationsmuster aus einer XML-Datei zu erstellen. Für eine solche Operation existieren beliebige Frameworks. Es ist einfach mit Scripting wie Sprachen, aber können wir dieses Verhalten in Delphi simulieren?Dynamische GUI-Erstellung mit Konfigurationsdateien

Ich brauche freie Bibliothek.

Antwort

6

Werfen Sie einen Blick auf XI Library oder EControl.

+0

+1, diese XI-Bibliothek sieht grea t. – mghie

+0

XI scheint meine Anforderungen vollständig zu erfüllen, aber eins. Es ist nicht kostenlos. Ich hätte das in der Frage an erster Stelle erwähnen sollen. – user114285

3

Ja, es ist möglich. Der Pseudo-Code für diese ist so etwas wie dieses

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; 

wird diese wenigen TEdit erstellen oder eine andere Steuerung (sagen wir, TAnotherEditOrAnotherControlType aber wenn Sie bearbeiten Variable als TControl deklarieren, können Sie keine Kontrolle erstellen Sie benötigen) auf TPanel erklärt als Ein Elternteil. Natürlich können Sie anstelle der IF-Klausel eine große CASE-Anweisung deklarieren und Steuerelemente des entsprechenden Typs erstellen. Wichtige Linien

  • add Elternteil als Parameter für die dynamische Steuerung Konstruktor sind (so dass eine dynamische Steuerung automatisch freigegeben werden kann)
  • setzen dynamische Kontrollen Eltern zu unserem AParent Panel - diese Linie stellt tatsächlich Kontrolle über Eltern-Panel.
1

Ja, haben Sie einen Blick auf TMS Scripter Studio Pro von TMS Software.

Fügen Sie die ultimative Flexibilität und Leistung in Ihre Anwendungen mit nativer Pascal oder Basic Scripting und voller IDE (Integrated Development Environment) mit visueller Form Designer, Inspektor Objekt und vieles mehr.

Scripter Studio Pro

2

Glade verwendet auch XML-Dateien, um eine GUI zu beschreiben, die dann zur Laufzeit erstellt wird. Ich weiß nicht, ob es mit Delphi verwendet werden kann.

+1

http://gtk2forpascal.sourceforge.net/ speziell libglade2.pas http://gtk2forpascal.cvs.sourceforge.net/viewvc/gtk2forpascal/gtk2/libglade/libglade2.pas?view=markup – Stobor

1

Ja können wir :) Ich habe dies für einen Page-Designer, der nur Textboxen, Regeln (Linien) und Grafiken verwendet, aber es sollte für alle registrierten Steuerelemente funktionieren.

[Aus der Manschette Code Annäherung]

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; 

Natürlich zuerst ein „Formular-Designer“ benötigen, die zunächst das Design speichern - das Speichern nur die Umkehrung der oben ist ... Ich werde lass das als Übung für den Leser. Mit ein wenig Modifikation könnten Sie Delphi verwenden und die DFM-Datei lesen :)

2

Sie können dfm-Dateien aus Streams und Dateien speichern und laden. Sie können ein gesamtes Formular oder nur eine Komponente und ihre untergeordneten Elemente speichern/laden.

Eg

Als binary:

AStream.WriteComponent(AComponent); 
MyComponent:= Result:= AStream.ReadComponent(AComponent); 

Als Text:

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; 

Sie müssen alle Klassen registrieren, die Sie mit Register laden oder speichern wollen:

RegisterClass(TPanel); 
Verwandte Themen