Форум: "Компоненты";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
ВнизПростейший Редактор свойств Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.049 c