Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Простейший Редактор свойств [D7, WinXP]


Ilg ©   (2004-11-21 14:32:00) 

Здравствуйте!
У меня написано несколько компонентов, имеющих свойство About...
Для этого свойства написан простейший редактор свойств, который просто выводит информацию о компоненте. При переходе с Delphi 5 на Delphi 7 компоненты не удалось установить - выдается сообщение, что не найден модуль DsgnIntf. Если удалить вызов этого модуля, то не удастся обратиться к классу TStringProperty.
Что делать, можно ли чем-то заменить класс TStringProperty в данном случае?
Заранее, Большое Спасибо!
Вот текст модуля одного из компонентов:
unit SVFormFill;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DsgnIntf;

type
 TSVFormFill = class(TComponent)
 private
   { Private declarations }
   FAbout:string;
   FTexture:TPicture;
   .
   .
   .
 protected
   { Protected declarations }
   procedure SetAbout(Value:string);
   procedure SetTexture(Value:TPicture);
   procedure FormPaint(Sender:TObject);
 public
   { Public declarations }
   constructor Create(aOwner:TComponent);override;
 published
   { Published declarations }
   property About:string read FAbout write SetAbout;
   property Texture:TPicture read FTexture write SetTexture;
 end;

 TAboutProperty = class(TStringProperty)
 public
   procedure Edit;override;
   function GetAttributes:TPropertyAttributes;override;
 end;

procedure Register;

implementation

const
 CName:string='Компонент TSVFormFill для Delphi';
 CDescription:string='Компонент для ...';
 CVersion:string='Версия 2.0';

constructor TSVFormFill.Create(aOwner:TComponent);
var i:integer;
begin
inherited Create(aOwner);
.
.
.
About:='';

end;

procedure TSVFormFill.SetAbout(Value:string);
begin
FAbout:=CVersion;
end;

procedure TSVFormFill.SetTexture(Value:TPicture);
begin
FTexture.Assign(Value);
Form.Repaint;
end;

procedure TAboutProperty.Edit;
begin
SetValue('');
MessageBox(Application.Handle,
           PChar(CName+' ('+CVersion+')'+
                 #13'Автор: Волобуев С. А.'#13#13+CDescription),
           'О компоненте...',MB_OK+MB_ICONINFORMATION);
end;

function TAboutProperty.GetAttributes:TPropertyAttributes;
begin
result:=[paDialog];
end;

procedure Register;
begin
 RegisterComponents('SV Компоненты', [TSVFormFill]);
 RegisterPropertyEditor(TypeInfo(string), TSVFormFill, 'About', TAboutProperty);
end;

end.


Юрий Зотов   (2005-02-12 18:21:00) [1]

> Стас [8]

uses
'указать нужный модуль'


Стас   (2005-02-12 13:45:00) [2]

Undeclared identifier: 'TPropertyAttributes'


Стас   (2005-02-12 13:43:00) [3]

А вот у мя проблема: Создании пакета, и его установке, некоторые значения не найдены...


Ilg   (2004-11-24 13:43:00) [4]

Огромное Спасибо!


Юрий Зотов   (2004-11-23 00:10:00) [5]

У Вас сейчас так (на примере одного юнита с одним компонентом и одним редактором свойства):

unit MyComp;
interface
uses
 ..., DesignEditors; // Потребуется Proxies.
type
 TMyComp = class(...) // Компонент.
   ...
 end;
 TMyPropEdit = class(...) // Редактор свойства.
   ...
 end;
procedure Register;
implementation
{$R MyComp.res} // Иконка компонента для палитры.
... // Код компонента, редактора и процедуры Register.
end.

И этот юнит помещен в пакет MyPackage. Как видите, проект, использующий компонент будет требовать Proxies.

А надо сделать так. Разбиваем этот юнит на два:

unit MyCompRT;
interface
uses
 ...; // Уже без DesignEditors - поэтому Proxies не потребуется.
type
 TMyComp = class(...) // Компонент
   ...
 end;
// Уже без Register
implementation
// Уже без иконки
... // Здесь только код самого компонента.
end.

Этот юнит помещаем в пакет MyPackageRT, ставим в его опциях птичку Run-time only и компилируем в каталог, доступный по Path.

Пишем второй юнит:

unit MyCompDT;
interface
uses
 ..., DesignEditors, MyCompRT; // Потребуется Proxies.
type
 TMyPropEdit = class(...) // Редактор свойства.
   ...
 end;
procedure Register;
implementation
{$R MyComp.res} // Иконка компонента для палитры.
... // Здесь код редактора и процедуры Register.
end.

Этот юнит помещаем в пакет MyPackageDT, в его Requires добавляем DesignIDE и MyPackageRT, ставим в его опциях птичку Design-time only, компилируем в любой каталог и инсталлируем в IDE.

Вот и все. Как видите, в RT-пакет вошел код, используемый и приложениями, и самой Delphi, а в DT-пакет - код, используемый только самой Delphi. Приложения же к этому пакету не обращаются и поэтому им не будет нужен Proxies.


Ilg   (2004-11-22 23:32:00) [6]

Извините, я не очень понял... (или совсем не понял)
Как я понимаю, мне нужно:
1) Переписать модули компонентов так, чтобы они не содержали Register и описания редакторов свойств.
2) Все процедуры Register вынести в отдельный модуль.
3) Все редакторы свойств - в отдельный модуль.
4) В RT-пакет поместить все компоненты + что-то в Requires (Что? У меня сейчас там vcl и rtl)
5) В DT-пакет - все иконки компонентов, модули из п. 2),3) + что-то в Requires (DesignIDE.dcp+Что? Должен ли он ссылаться на RT?)

Что-то я запутался...
И еще RT и DT-пакеты создаются одинаково: я должен как-то пометить их, или будет понятно по содержимому?

А может, я все усложняю? (Простите, сталкиваюсь с этим впервые)


Юрий Зотов   (2004-11-22 22:03:00) [7]

> Ilg   (22.11.04 21:05) [2]

> При компиляции проекта, содержащего данные компоненты возникла
> ошибка - не найден файл DesignEditors.pas

Потому что Вы все поместили в один пакет. Это нехорошо, но в D5 и ниже проходило, а начиная с D6 уже не проходит.

Пакет разбиваете на два: run-time и design-time.

RT-пакет содержит ТОЛЬКО код самих компонентов и больше НИЧЕГО. Ни один его модуль не должен ссылаться в uses ни на один модуль DT-пакета. В его секции Requires могут содержаться ТОЛЬКО run-time модули VCL.

Компилируется RT-пакет в любой каталог, доступный через пути поиска IDE, либо через переменную системного окружения Path. Инсталлировать в IDE его не нужно.

DT-пакет содержит процедуру Register, иконки компонентов и все design-time редакторы (свойств и компонентов), если такие есть. Любой его модуль может ссылаться в uses на любой модуль из RT-пакета. В его секцию Requires и подключается DesignIDE.dcp. Компилируется он куда угодно и должен инсталлироваться в IDE.

Таким образом, в конечные приложения будут подключаться только модули RT-пакета, в которых нет ссылок на DesignEditors - а тогда не потребуется и Proxies. Кроме того, в конечный проект не будут подтягиваться ненужные в run-time код и ресурсы из DT-пакета.


Ilg   (2004-11-22 21:05:00) [8]

Спасибо, Юрий Зотов!
Я все сделал, как было сказано, даже paReadOnly - Компоненты установились.
Но возникла новая проблема:
При компиляции проекта, содержащего данные компоненты возникла ошибка - не найден файл DesignEditors.pas. После добавления пути Source\ToolsAPI в список поиска возникла следующая ошибка - не найден файл Proxies (На него ссылается DesignEditors в разделе uses). Такой файл мне найти не удалось. Что делать?


Юрий Зотов   (2004-11-21 21:25:00) [9]

> Ilg   (21.11.04 14:32)  

> Что делать, можно ли чем-то заменить класс TStringProperty в
> данном случае?

Не надо его менять. В uses замените DsgnIntf на DesignEditors, а к секции requires пакета подколючите DesignIDE.dcp. Вcе.

А в GetAttributes не помешало бы добавить paReadOnly. Тогда и вызов SetValue из Edit не потребуется.
:о)


Наверх

Титульная страница Поиск, карта сайта Написать письмо