Динамическое создание графического интерфейса с использованием файлов конфигурации - PullRequest
9 голосов
/ 05 июня 2009

Можно создать графический интерфейс для приложения Delphi, используя шаблон конфигурации из файла xml и т. Д. ... Существуют какие-либо рамки для такой операции. Это легко с помощью скриптовых языков, но можем ли мы имитировать такое поведение в Delphi?

Мне нужна бесплатная библиотека.

Ответы [ 7 ]

6 голосов
/ 05 июня 2009

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

3 голосов
/ 05 июня 2009

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

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 в качестве параметра для конструктора динамического управления (чтобы динамическое управление можно было автоматически освобождать)
  • установить динамические элементы управления Parent для нашей родительской панели - эта строка фактически помещает элемент управления на родительскую панель.
2 голосов
/ 20 июня 2009

Вы можете сохранять и загружать файлы 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 голосов
/ 19 июня 2009

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

1 голос
/ 20 июня 2009

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

[Приближение кода манжеты]

    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 :)

1 голос
/ 05 июня 2009

Да, посмотрите на TMS Scripter Studio Pro от TMS Software .

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

Scripter Studio Pro

0 голосов
/ 05 июня 2009

Вы можете найти несколько примеров здесь, где Torry использует RTTI:

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

...