Динамическое создание GUI с помощью конфигурационных файлов

Функциональные языки хорошо подходят для разработки веб-приложений, в частности Scala.

Посмотрите на Lift рамки для получения дополнительной информации.

9
задан user114285 11 June 2009 в 05:06
поделиться

7 ответов

Взгляните на XI Library или EControl .

6
ответ дан 4 December 2019 в 13:49
поделиться

Да, взгляните на TMS Scripter Studio Pro от TMS Software .

Добавьте максимальную гибкость и мощность в свои приложения с родным Паскаль или базовый сценарий и полная IDE (Интегрированная среда разработки) с визуальным дизайнером форм, объект инспектор и др.

Scripter Studio Pro

1
ответ дан 4 December 2019 в 13:49
поделиться

Да, это возможно.Псевдокод для этого примерно такой

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 и создать элементы управления соответствующего типа. Важными строками являются

  • добавить родительский элемент в качестве параметра для конструктора динамического элемента управления (чтобы динамический элемент управления мог быть освобожден автоматически)
  • установить динамический элемент управления родительским элементом для нашей родительской панели - эта строка фактически помещает элемент управления на родительскую панель.
3
ответ дан 4 December 2019 в 13:49
поделиться

Здесь вы можете найти несколько примеров использования RTTI у Торри:

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

0
ответ дан 4 December 2019 в 13:49
поделиться

Да, мы можем :) Я сделал это для дизайнера страниц, который использует только текстовые поля, правила (линии) и графику, но он должен работать для всех зарегистрированных элементов управления.

[Аппроксимация кода манжеты]

    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
ответ дан 4 December 2019 в 13:49
поделиться

Вы можете сохранять и загружать файлы 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
ответ дан 4 December 2019 в 13:49
поделиться

Glade также использует файлы XML для описания графического интерфейса пользователя, который затем создается во время выполнения. Однако не знаю, можно ли его использовать с Delphi.

2
ответ дан 4 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: