Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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™

min@y™ (статус: Доктор наук), 6 февраля 2011, 20:14 [#1]:

Ctrl + C, Ctrl + V.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Адмирал

Адмирал (статус: Посетитель), 6 февраля 2011, 20:16 [#2]:

а не всё я понял
min@y™

min@y™ (статус: Доктор наук), 6 февраля 2011, 20:42 [#3]:

Цитата (Адмирал):

а не всё я понял

Опять тупишь, школота?
"Ctrl + C" - скопировать, "Ctrl + V" - вставить.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

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

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;
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
DNK

DNK (статус: Студент), 13 февраля 2011, 10:38 [#6]:

Amidamaru: TComponent не имеет свойства Parent. В самом широком смысле слова "любой компонент" твой код использовать нельзя. Напоримся на EClassNotFound. Превоночально с помощью RegisterClass или RegisterClasses необходимо зарегистрировать классы, объекты которых предпологается загружать. Даные процедуры рекомендуются прописывать в секцию initialization. Хотя для тех классов, компоненты которых уже присутствуют на форме, это действие не обязательно.
"Digital Networked Knight"

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:29
Выполнено за 0.03 сек.