Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Object inspector


Автор: Frees 21.3.2006, 16:32
Суть проблемы : делаю родительскую форму в ней в блоке published описываю ряд property

после того как создаю потомков от етой формы хотелось бы чтобы созданные в родителе property были видны
в Object inspector, но етого не происходит

Как решить такую проблему,

PS использую Delphi 2006

Автор: bems 21.3.2006, 17:11
имхо никак

иначе бы все невизуальные компоненты типа "форма с заливкой" или "непрямоугольная форма" были бы наследниками формы, а не невизуальными компонентами

Автор: Romikgy 21.3.2006, 17:11
Имхо твою форму надо зарегестрировать в дельфи, а вот как я не в курсе smile
(это по аналогии с компонентами говорю)

Автор: Frees 22.3.2006, 07:14
Цитата

Имхо твою форму надо зарегестрировать в дельфи, а вот как я не в курсе


а кто нить в курсе?

Автор: Snowy 22.3.2006, 10:00
IMHO никак.

Автор: Alexeis 22.3.2006, 11:01
Я думаю что способ всетаки есть. Ведь в delphi ничего уникального для класса tform не делалось, а работает ведь. Вообше среда делфи может много (даже програмировать себя). Сам ищу подобную информацию.
Frees, не унывай я считаю что ответ "никак" здесь не совсем верный.

Автор: Alex 22.3.2006, 11:46
Ответ ни как конечно не совсем точен, т.к. кто мешает эту форму оформить ввиде компонента и вы получите, что хотите.

Object Inspector показывает published свойства компонентов, а вы создаете свою форму на основе некой базовой, но для Object Inspector она как была обычной формой так формой и осталась.

Автор: Alexeis 22.3.2006, 12:00
Вообщем нашел решение правда для делфи 4.
Есть для этого оказываетя специальный пакет
http://www.torry.ru/vcl/experts/ide/cfpack4.zip

Автор: Frees 22.3.2006, 15:53
как то с етим компонентом в В2006 глухо

Автор: Msl 23.3.2006, 09:21
Хотел бы напомнить: У Борланд есть два ключевых момента,
связанных с основным отличием Delphi/Builder от всех прочих
визуальных сред программирования.


1. RTTI -механизм/способ доступа к зарегистрированным
(помеченным как published) свойствам объектов

2. ToolsAPI -способ доступа к зарегистрированным объектам и
зарегистрированным свойствам объектов под Delphi IDE

Думается, что Все идеи, которые изложены ниже относятся к ко всем версиям Delphi

C Delphi 2005-2006 не работал, но думаю что Борланд свой конек сохранила и там.

Для начала проверь, есть ли аналоги процедур

RegisterClass, RegisterClasses,RegisterCustomModule в библиотеках Delphi 2006.


См. книги и примеры Delphi Developer HandBook, Mastering Delphi (на marcocantu.com)

{
This explains how to set up a new form descendant which will have editable
properties via the object inspector
}

Код


{In Delphi 3.0 there is a new approach which you can use that I will try
to briefly describe.  The idea is to use a custom module to create a new
form class that has new properties etc.  This can be done by registering a
classtype with the IDE by calling RegisterCustomModule (in the expert API).
 With a custom module you can add your own new properties to forms which
will appear in the object inspector.  The mechanism to get this to work is
as follows: 

- Create a unit that declares your new form class descending from TCustomForm
- Create an expert that will generate a new instance of the above class in
  the IDE
- Install the expert in the IDE by including the expert unit below in a new
  package and simply install the package.

Once you have followed these steps you will have a new item on the Form
page of the File|New dialog which will be your new form class.

The new form class unit:}
>>>> Begin unit <<<<<<

unit myForm;

interface

uses Messages, Windows, SysUtils, Classes, Controls, Forms;

type
  TMyForm = class(TCustomForm)
  private
    FNewProp: String;  
  protected
  public
  published
    property NewProp: String read FNewProp write FNewProp;  // ex. of a new form property
    property ActiveControl;
    property Align;
    property AutoScroll;
    property BorderStyle;
    property BorderIcons;
    property Caption stored True;
    property ClientHeight;
    property ClientWidth;
    property Color;
    property DragCursor;
    property DragMode;
    property Enabled;
    property Font;
    property Height stored True;
    property HorzScrollBar;
    property KeyPreview;
    property ParentColor;
    property ParentCtl3D;
    property ParentFont;
    property ParentShowHint;
    property PixelsPerInch;
    property PopupMenu;
    property PrintScale;
    property Scaled;
    property ShowHint;
    property TabStop;
    property VertScrollBar;
    property Width stored True;
    property OnActivate;
    property OnClick;
    property OnClose;
    property OnCloseQuery;
    property OnCreate;
    property OnDblClick;
    property OnDestroy;
    property OnDeactivate;
    property OnDragDrop;
    property OnDragOver;
    property OnHide;
    property OnHelp;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnPaint;
    property OnResize;
    property OnShow;
  end;

implementation

end.
>>>>  end unit <<<<

{Here is the expert necessary to create instances of this class from the IDE:}
>>>> begin expert <<<<
unit newmod;

interface

procedure Register;

implementation

uses Windows, SysUtils, Classes, Controls, Forms, ExptIntf, ToolIntf,
VirtIntf,
  IStreams, DsgnIntf, MyForm;

type
  TMyFormExpert = class(TIExpert)
    function GetName: string; override;
    function GetComment: string; override;
    function GetGlyph: HICON; override;
    function GetStyle: TExpertStyle; override;
    function GetState: TExpertState; override;
    function GetIDString: string; override;
    function GetAuthor: string; override;
    function GetPage: string; override;
    function GetMenuText: string; override;
    procedure Execute; override;
  end;

{ TMyFormExpert }

function TMyFormExpert.GetName: string;
begin
  Result := 'My Form';
end;

function TMyFormExpert.GetComment: string;
begin
  Result := 'Custom form';
end;

function TMyFormExpert.GetGlyph: HICON;
begin
  Result := LoadIcon(HInstance, '');
end;

function TMyFormExpert.GetStyle: TExpertStyle;
begin
  Result := esForm;
end;

function TMyFormExpert.GetState: TExpertState;
begin
  Result := [esEnabled];
end;

function TMyFormExpert.GetIDString: string;
begin
  Result := 'MyForm.Expert';
end;

function TMyFormExpert.GetAuthor: string;
begin
  Result := 'Borland';
end;

function TMyFormExpert.GetPage: string;
begin
  Result := 'Forms';
end;

function TMyFormExpert.GetMenuText: string;
begin
  Result := '';
end;

const
  FormUnitSource =
    'unit %0:s;'#13#10 +
    #13#10 +
    'interface'#13#10 +
    #13#10 +
    'uses Windows, SysUtils, Messages, Classes, Graphics, Controls,'#13#10 +
    '  StdCtrls, ExtCtrls, MyForm;'#13#10 +
    #13#10 +
    'type'#13#10 +
    '  T%1:s = class(TMyForm)'#13#10 +
    '  private'#13#10 +
    '    { Private declarations }'#13#10 +
    '  public'#13#10 +
    '    { Public declarations }'#13#10 +
    '  end;'#13#10 +
    #13#10 +
    'var'#13#10 +
    '  %1:s: T%1:s;'#13#10 +
    #13#10 +
    'implementation'#13#10 +
    #13#10 +
    '{$R *.DFM}'#13#10 +
    #13#10 +
    'end.'#13#10;

  FormDfmSource = 'object %s: T%0:s end';

procedure TMyFormExpert.Execute;
var
  UnitIdent, Filename: string;
  FormName: string;
  CodeStream: TIStream;
  DFMStream: TIStream;
  DFMString, DFMVCLStream: TStream;
begin
  if not ToolServices.GetNewModuleName(UnitIdent, FileName) then Exit;
  FormName := 'MyForm' + Copy(UnitIdent, 5, 255);
  CodeStream :=
TIStreamAdapter.Create(TStringStream.Create(Format(FormUnitSource,
    [UnitIdent, FormName])), True);
  try
    CodeStream.AddRef;
    DFMString := TStringStream.Create(Format(FormDfmSource, [FormName]));
    try
      DFMVCLStream := TMemoryStream.Create;
      try
        ObjectTextToResource(DFMString, DFMVCLStream);
        DFMVCLStream.Position := 0;
      except
        DFMVCLStream.Free;
      end;
      DFMStream := TIStreamAdapter.Create(DFMVCLStream, True);
      try
        DFMStream.AddRef;
        ToolServices.CreateModuleEx(FileName, FormName, 'TMyForm', '',
          CodeStream, DFMStream, [cmAddToProject, cmShowSource, cmShowForm,
            cmUnNamed, cmMarkModified]);
      finally
        DFMStream.Free;
      end;
    finally
      DFMString.Free;
    end;
  finally
    CodeStream.Free;
  end;
end;

procedure Register;
begin
  RegisterCustomModule(TMyForm, TCustomModule);
  RegisterLibraryExpert(TMyFormExpert.Create);
end;
end.
>>>> end expert <<<<

{To get the expert installed you have to add the unit to a package and
install the package.  Once this is complete your new form class will be
available from the File|New dialog.}


Удачи!

Автор: Romikgy 23.3.2006, 09:56
Вот еще на этуже тему
Добавлено @ 09:58
Название незахотело писаться smile
Открытые интерфейсы среды программирования Delphi

Автор: Seldon 26.7.2006, 10:25
Цитата(Msl @ 23.3.2006,  08:21)
{
This explains how to set up a new form descendant which will have editable
 properties via the object inspector
}


Под D7 пришлось чуть-чуть подправить исходник, но в целом всё поставилось и новые свойства отображаются в OI.

Под BDS (D2006) появились проблемы:

П: компилятор не мог найти модули ExptIntf,ToolIntf,VirtIntf,IStreams,DesignIntf,DesignEditors
Р: добавил %BDS%\Source\ToolsAPI к путям поиска
---
П: в модуле ToolsAPI.pas (на который ссылаются вышеуказанные модули) ругань на
{$IFDEF MSWINDOWS}
uses Windows, SysUtils, Classes, ActiveX, TypInfo, DockForm, DesignIntf, Menus,
  ActnList, Graphics, ImgList, Forms, Controls, ComCtrls, XMLIntf;
{$ENDIF}
[Pascal Fatal Error] ToolsAPI.pas(20): F1026 File not found: 'DockForm.dcu' 
Р: поиск модуля DockForm по папке с дистрибом BDS результатов не дал. пришлось убрать этот модуль из uses

что интересно, при поиске по дистрибу, был найден файл DOCKFORM.HPP, который был сгенерирован по Dockform.pas
// (DO NOT EDIT: machine generated header) 'Dockform.pas' rev: 10.00
---
П: теперь ругань в нескольких местах ToolsAPI.pas на отсутствие класса TDockableForm
Р: поиск по дистрибу файла с описанием класса TDockableForm результатов не дал. я заменил TDockableForm на TCustomForm - просто чтобы успокоить компилятор
---
П: в модуле DesignEditors.pas ругань на
uses DesignConst, Consts, RTLConsts, Contnrs, Proxies, ToolsAPI, ActnList;
[Pascal Fatal Error] DesignEditors.pas(609): F1026 File not found: 'Proxies.dcu'
Р: поиск модуля Proxies по папке с дистрибом BDS результатов не дал (правда опять нашёлся файл PROXIES.HPP). пришлось убрать этот модуль из uses
---
П: теперь ругань на функцию IsProxyClass в двух местах
Р: пришлось их закомментировать
---
это были проблемы в используемых кодом модулях, теперь проблемы в самом коде

П: ругань на TIStream
Р: заменил на IStream и подключил модуль ActiveX, где он объявлен
---
П: ругань на последний параметр (true) в
CodeStream:=TIStreamAdapter.Create(TStringStream.Create(Format(FormUnitSource,[UnitIdent,FormName])),true);
Р: убрал его
---
П: ругань на CodeStream.AddRef;
Р: заменил на _AddRef
---
П: ругань на последний параметр (true) в
DFMStream:=TIStreamAdapter.Create(DFMVCLStream,true);
Р: убрал его
---
П: ругань на DFMStream.AddRef;
Р: заменил на _AddRef
---
П: ругань на DFMStream.Free; и CodeStream.Free;
Р: убрал их

в результате оно скомпилировалось
но в репозитарии новых объектов не появилось. все вышеперечисленные проблемы к этому отношения, по видимому, не имеют т.к. за появление эксперта в репозитарии отвечает единственная строчка 
RegisterLibraryExpert(TMiBFormExpert.Create);

вот такие пироги... сдаётся мне, что в BDS4 ToolsAPI просто не доделан. 

Автор: drkot 4.8.2006, 14:42
Цитата(Seldon @  26.7.2006,  10:25 Найти цитируемый пост)
сдаётся мне, что в BDS4 ToolsAPI просто не доделан

здается неправильно здается. StarTeam, темплеты кодов подсветка и все прочие навароты сделаны на ToolAPI.

там просто поменялись интерфейсы. После причесвания приведенного Msl  примера и установки его под BDS2006 результат оказался нулевой. 
Все наследники Extert-а можно прописать только в меня help.
Для добавления в другие места оболочки используются NTA интерфейсы (тока примеров их использования нет). Те примеры что поставляются с делфей расчитаны на ранние версии (D7), хотя компилятся замешательно, но при инсталяции в оболочку не прописываются.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)