2009-06-05 15 views

Respuesta

6

Tome un vistazo a XI Library o EControl.

+0

+1, esta biblioteca XI luce grea t. – mghie

+0

XI parece cumplir mis requisitos por completo, menos uno. No es gratis Debería haber mencionado eso en la pregunta en primer lugar. – user114285

3

Sí, es posible. El pseudocódigo para esto es algo como esto

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; 

Esto creará unos pocos TEdit o algún otro control (por ejemplo, TAnotherEditOrAnotherControlType pero si se declara Editar variable como una TControl, puede crear cualquier control que necesita) en TPanel declarado como Un padre. Por supuesto, en lugar de la cláusula IF, puede declarar una declaración CASE grande y crear controles del tipo apropiado. líneas importantes son

  • complemento de Padres como parámetro de constructor de control dinámico (de modo que el control dinámico puede ser liberado automáticamente)
  • conjunto dinámico controles de los padres a nuestro panel PARA LOS PADRES - esta línea realidad pone el control en el panel de los padres.
1

Sí, echar un vistazo a TMS Scripter Studio Pro por TMS Software.

Añadir la flexibilidad y potencia definitiva en sus aplicaciones nativas con Pascal o Basic Scripting e IDE completo (entorno de desarrollo integrado) con el diseñador de forma visual, objeto inspector, y mucho más.

Scripter Studio Pro

2

Glade también utiliza archivos XML para describir una GUI que luego se crea en tiempo de ejecución. Sin embargo, no sé si se puede usar con Delphi.

+1

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

1

Sí, podemos :) He hecho esto para un diseñador de página que utiliza solo cuadros de texto, reglas (líneas) y gráficos pero debería funcionar para todos los controles registrados.

[Apagado el código manguito aproximación]

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; 

Por supuesto, primero necesita un "diseñador de formularios" que puede guardar el diseño inicial - el ahorro es justo al revés de lo anterior ... Voy a deja eso como un ejercicio para el lector. Con una pequeña modificación, puede usar Delphi y leer el archivo DFM :)

2

Puede guardar y cargar archivos dfm de secuencias y archivos. Puede guardar/cargar un formulario completo, o solo un componente y sus hijos.

Ej

Como binaria:

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

como texto:

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; 

Es necesario registrar ninguna clase que desea guardar o cargar con RegisterClass:

RegisterClass(TPanel); 
Cuestiones relacionadas