Delphi; рабочий пример StringToComponent, ComponenttoString - PullRequest
1 голос
/ 11 января 2020

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

Я использую эти примеры для Delphi документации

function TfmTableEdit.MComponentToString(Component: TComponent): string;
var
  BinStream:TMemoryStream;
  StrStream: TStringStream;
  s: string;
begin
  BinStream := TMemoryStream.Create;
  try
    StrStream := TStringStream.Create(s);
    try
      BinStream.WriteComponent(Component);
      BinStream.Seek(0, soFromBeginning);
      ObjectBinaryToText(BinStream, StrStream);
      StrStream.Seek(0, soFromBeginning);
      Result:= StrStream.DataString;
    finally
      StrStream.Free;
    end;
  finally
    BinStream.Free
  end;
end;
function TfmTableEdit.MStringToComponent(Value: string): TComponent;
var
  StrStream:TStringStream;
  BinStream: TMemoryStream;
begin
  StrStream := TStringStream.Create(Value);
  try
    BinStream := TMemoryStream.Create;
    try
      ObjectTextToBinary(StrStream, BinStream);
      BinStream.Seek(0, soFromBeginning);
      Result:= BinStream.ReadComponent(nil);
    finally
      BinStream.Free;
    end;
  finally
    StrStream.Free;
  end;
end;

Итак, я использовал ее для компонента UniDBEdit5 для тестирования и получил это значение.

'объект UniDBEdit5: TUniDBEdit' # $ D # $ A 'Left = 288' # $ D # $ A 'Top = 376' # $ D # $ A 'Ширина = 121' # $ D # $ A ' Высота = 22 '# $ D # $ A' Подсказка = '' '' '# $ D # $ A' TabOrder = 5 '# $ D # $ A'end'

, поэтому я удалил компонент, чтобы увидеть, Я мог бы вернуть это. Я получаю фатальную ошибку, «контроль не может быть создан с нулевым владельцем», но это использование прямо из документации.

Моя цель - сохранить множество элементов управления в базе данных, и когда пользователь выбирает конкретную форму, во время выполнения соответствующие элементы управления будут загружены в форму в определенной конфигурации. Форма не будет знать заранее, какие элементы управления будут добавлены, но у меня должна быть эта информация в строке, поэтому, например, я мог бы заранее вызвать RegisterClass (TUniDBEdit).

Кто-нибудь правильно использует эти функции? Я посмотрел ... Спасибо! Дуг

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...