Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Простейший Редактор свойств   Найти похожие ветки 

 
Ilg   (2004-11-21 14:32) [0]

Здравствуйте!
У меня написано несколько компонентов, имеющих свойство 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.


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

> Ilg   (21.11.04 14:32)  

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

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

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


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

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


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

> 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 23:32) [4]

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

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

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


 
Юрий Зотов ©   (2004-11-23 00:10) [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-24 13:43) [6]

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


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

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


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

Undeclared identifier: "TPropertyAttributes"


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

> Стас [8]

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



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.043 c
4-1125504553
moyavital
2005-08-31 20:09
2005.11.06
Програмно открыть ComboBox


6-1121775131
SlyFox
2005-07-19 16:12
2005.11.06
Простенький SMTP-сервер


2-1129464892
Vladimir88
2005-10-16 16:14
2005.11.06
Отключение проверки на переполнение


1-1129547919
WondeRu
2005-10-17 15:18
2005.11.06
ActiveX Form by GUID?


3-1127394613
Igo
2005-09-22 17:10
2005.11.06
Pervasive 2000 & компоненты