| 
| 
 | Вопрос # 5 002/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Как можно создавать на форме компоненты, информация о которых указанна в файле к примеру из такой инфы
 object Shape6: TShape
 Left = 128
 Top = 64
 Width = 65
 Height = 65
 
|  |   Вопрос задал: Адмирал (статус: Посетитель)Вопрос отправлен: 6 февраля 2011, 20:12
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: DNK Здравствуйте, stason!Баловался в свое время такой штукой. Файл немного надо поправить, ты end в конце забыл. Если нужны только шейпы, то примерно вот так:
 
 const FILE_NAME = 'c.dfm';
 
procedure TForm1.Button1Click(Sender: TObject);
var FileStream: TFileStream;
    BinStream: TMemoryStream;
    Shape: TShape;
begin
  Shape := TShape.Create(Self);
  FileStream := TFileStream.Create(ExtractFilePath(Application.ExeName) + FILE_NAME, fmOpenRead);
  try
    BinStream := TMemoryStream.Create;
    try
      ObjectTextToBinary(FileStream, BinStream); // Конвертация из текста в бинарный формат
      BinStream.Seek(0, soFromBeginning);
      BinStream.ReadComponent(Shape);            // Читаем свойства объекта
    finally
      BinStream.Free;
    end;
  finally
    FileStream.Free;
  end;
  Shape.Parent := Self;
end;Если же класс объекта заранее неопределён, всё немного сложнее.
|  | Ответ отправил: DNK (статус: Студент)Время отправки: 22 февраля 2011, 22:51
 
 |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 13 февраля 2011, 10:38; участников в обсуждении: 4. 
|   | min@y™ (статус: Доктор наук), 6 февраля 2011, 20:14 [#1]:Ctrl + C, Ctrl + V. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Адмирал (статус: Посетитель), 6 февраля 2011, 20:16 [#2]:а не всё я понял |  
|   | min@y™ (статус: Доктор наук), 6 февраля 2011, 20:42 [#3]: Цитата (Адмирал): а не всё я понял  Опять тупишь, школота?
 "Ctrl + C" - скопировать, "Ctrl + V" - вставить.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | DNK (статус: Студент), 7 февраля 2011, 09:31 [#4]:Баловался в свое время такой штукой. Файл немного надо поправить, ты end в конце забыл. Если нужны только шейпы, то примерно вот так: 
 const FILE_NAME = 'c.dfm';
 
procedure TForm1.Button1Click(Sender: TObject);
var FileStream: TFileStream;
    BinStream: TMemoryStream;
    Shape: TShape;
begin
  Shape := TShape.Create(Self);
  FileStream := TFileStream.Create(ExtractFilePath(Application.ExeName) + FILE_NAME, fmOpenRead);
  try
    BinStream := TMemoryStream.Create;
    try
      ObjectTextToBinary(FileStream, BinStream); // Конвертация из текста в бинарный формат
      BinStream.Seek(0, soFromBeginning);
      BinStream.ReadComponent(Shape);            // Читаем свойства объекта
    finally
      BinStream.Free;
    end;
  finally
    FileStream.Free;
  end;
  Shape.Parent := Self;
end;Если же класс объекта заранее неопределён, всё немного сложнее."Digital Networked Knight" |  
|   | Amidamaru (статус: 4-ый класс), 12 февраля 2011, 20:24 [#5]:очень неплохой способ, но если вчитаться в описание метода ReadComponent, то можно создать таким способом любой компонент: 
 var FileStream: TFileStream;
    BinStream: TMemoryStream;
    NewCmp: TComponent;
begin
  FileStream := TFileStream.Create({имя файла с текстом компонента}, fmShareDenyNone);
  try
    BinStream := TMemoryStream.Create;
    try
      ObjectTextToBinary(FileStream, BinStream); // Конвертация из текста в бинарный формат
      BinStream.Seek(0, soFromBeginning);
      NewCmp:=BinStream.ReadComponent(nil); // Будет создан компонент
// и все его дочерние компоненты с заданными свойствами (так написано в хелпе)
    finally
      BinStream.Free;
    end;
  finally
    FileStream.Free;
  end;
  NewCmp.Parent := Self;
end; |  
|   | DNK (статус: Студент), 13 февраля 2011, 10:38 [#6]:Amidamaru: TComponent не имеет свойства Parent. В самом широком смысле слова "любой компонент" твой код использовать нельзя. Напоримся на EClassNotFound. Превоночально с помощью RegisterClass или RegisterClasses необходимо зарегистрировать классы, объекты которых предпологается загружать. Даные процедуры рекомендуются прописывать в секцию initialization. Хотя для тех классов, компоненты которых уже присутствуют на форме, это действие не обязательно. "Digital Networked Knight" |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |