powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание оригинальных компонент в Дельфи
32 сообщений из 32, показаны все 2 страниц
Создание оригинальных компонент в Дельфи
    #32166433
Три вопроса на повестке дня:
1. Как сделать published property c вложенныеми property
например как свойство Constraints и его "подсвойства" - MaxHeight,MinHeight,
MaxWidth,MinWidth, чтобы в design time в Object Inspector выглядело так же...

2. У кого есть книга Рея Конопки "Разработка оригинальных компонент для Дельфи"

3. Где найти инфу по созданию компонентов для продвинутых пользователей?
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32166549
ну че кто нибудь ответит да? родные мои ответьте не бросайте меня на произвол судьбы
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32166709
кто нибудь ответьте а?
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32166739
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Object Properties that are themselves classes often have their own property editors, specified in the component's registration procedure. If the class held by a property has its own published properties, the Object Inspector lets the developer to expand the list (by double-clicking) to include these properties and edit them individually. Object properties must descend from TPersistent.

2. У меня нет.

3. Delphi Help -> Creating Custom Components
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32166742
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Delphi 5. Руководство разработчика.

Часть 1. http://delphi.hostmos.ru/download.php?docs&go=8
Часть 2. http://delphi.hostmos.ru/download.php?docs&go=7

Во второй части это есть.
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32167080
olga1999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Как сделать свойство с подсвойствами.

Это просто Published свойство тип set. Object Inspector автоматически так отображает его.
Например
x = (MAxHeight, MaxWidth)
y = set of x

Published
prop:y

2. У меня есть эта книга. Три недели назад купил за 18 грн. Абсолютно новая книга.

3. В этой книге ксе есть.
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32167090
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 olga1999

Это просто Published свойство тип set. Object Inspector автоматически так отображает его.
Например
x = (MAxHeight, MaxWidth)
y = set of x


Вы путаете свойство типа Set (когда для каждого из входящих в расрываем списке указывается True/False) со свойством объектного типа, такого как Constraints от TControl (когда для каждого свойства можно указать значение определенного типа).
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32167172
так че? как делать - то? ...

один одно...другой другое... была мысля что надо set использовать.....но еще не проверял....
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32167176
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так че? как делать - то? ...

Если как ты приводил пример с Constraints в первом посте, то это свойство типа объекта, такие свойства создаются наследованием от TPersistent.
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32167213
olga1999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Йорик:
pkarklin прав. Свойства set будут иметь только true или false. Невнимательность...
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32167224
а код не можете чиркнуть? я бы вас отблагодарил....че нить прислать могу по эл почте полезное...скринсейвер заставку....проги взломанные компоненты...
фастрепорт тот же 2.47 есть взломатый QReport Professional всех версий ну и тп
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32167258
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, ну а исходники Borland для чего тебе давал? Там все можно найти. Берем то же свойство Constraints у TControl

Код: plaintext
1.
2.
...
property Constraints: TSizeConstraints read FConstraints write SetConstraints;
...

Находим объявление TSizeConstraints, смотрим, переделываем как надо. Не забываем про реализацию SetConstraints.

Все это в модуле controls.pas.
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32167641
щас буду пробовать
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32167697
нифига не получается....привожу код...

TRules = class(TPersistent)
private
FFieldName : TField;
published
property LevelID : TField index 0 read FFieldName write FFieldName default nil;
property ItemID : TField index 1 read FFieldName write FFieldName default nil;
property ItemName : TField index 2 read FFieldName write FFieldName default nil;
property ParentID : TField index 3 read FFieldName write FFieldName default nil;
end;

TRuTreeView = class(TTreeView)
private
FDataSet : TDataSet;
FRules : TRules;
{ Private declarations }
protected
{ Protected declarations }
public
property Rules : TRules read FRules write FRules;
{ Public declarations }
published
property DataSet : TDataSet read FDataSet write FDataSet;
{ Published declarations }
end;



вот так нихрена не работает как надо то?
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32167700
походу никто не знает как это делается вот и ответы такие расплывчатые...
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32167755
Вот что у меня теперь получилось... вроде работает...но один трабл ....если удалить объекты TField и они уже выбраны в соответствующих свойствах - то возникает access violation и глючит ДЕльфя прям во время desin time ...как от этого избавиться ...со свойством DataSet такого нет...если удалить Дата Сет то и свойство просто обнуляется...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
 unit RuTreeView;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls,DB;
type
  TRules = class(TPersistent)
  private
    FItemID : TField;
    FParentID:  TField;
    FLabelName: TField;
    FLevelID : TField;
  public
    procedure Assign(Source: TPersistent);
  published
    property ItemID : TField read FItemID write FItemID default nil;
    property ParentID : TField read FParentID write FParentID default nil;
    property LabelName : TField read FLabelName write FLabelName default nil;
    property LevelID : TField read FLevelID write FLevelID default nil;
  end;

  TRuTreeView = class(TTreeView)
  private
    FDataSet : TDataSet;
    FRules   : TRules;
    procedure SetRules(Value: TRules);
   { Private declarations }
  protected
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent);override;
    destructor Destroy; override;
    { Public declarations }
  published
    property DataSet : TDataSet read FDataSet write FDataSet;
    property Rules  : TRules read FRules write SetRules;
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TRuTreeView]);
end;

constructor TRuTreeView.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FRules:=TRules.Create;
end;

destructor TRuTreeView.Destroy;
begin
FRules.Free;
inherited Destroy;
end;

procedure TRuTreeView.SetRules(Value: TRules);
begin
if Assigned(Value) then FRules.Assign(Value);
end;

procedure TRules.Assign(Source: TPersistent);
begin
if Source is TRules
then
 begin
   FItemID:=TRules(Source).ItemID;
   FParentID:=TRules(Source).ParentID;
   FLabelName:=TRules(Source).LabelName;
   FLevelID:=TRules(Source).LevelID;
   inherited Assign(Source);
 end;
end;
end.
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32167801
вот такие у меня траблы
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32167806
mpro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык смотреть надо как другие это реализовывают. Ты в tdbgridcolumn видел свойство типа tfield? Там через фиелднэйм все работает чего и тебе советую
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32167881
я понял тебя друг...только как сделать чтобы из фиелднэймов можно было выбирать значение....?
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32168037
А?
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32168162
mpro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понятия не имею:-)
Всегда ручками писал
Если нароешь где (например в исходниках) отпишись плиз
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32168176
хорошо
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32168446
Lana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот может поможет...... подправила компонент, но в данном случае поля выбираются из списка....

особо не отлаживала.... но на первый взгляд работает... поля выбираются

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
unit RuTreeView;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, DB, DesignIntf, DesignEditors, Typinfo;
type
  TRules = class(TPersistent)
  private
    Owner : TComponent;

    FItemFieldName : string;
    FParentFieldName : string;
    FLabelFieldName : string;
    FLevelFieldName : string;

    function GetDataSet : TDataSet;

    function GetItemID : TField;
    function GetParentID : TField;
    function GetLabelName : TField;
    function GetLevelID : TField;

    procedure SetItemID ( Value : TField);
    procedure SetParentID ( Value : TField);
    procedure SetLabelName ( Value : TField);
    procedure SetLevelID ( Value : TField);
  public
    property ItemID : TField read GetItemID write SetItemID default nil;
    property ParentID : TField read GetParentID write SetParentID default nil;
    property LabelName : TField read GetLabelName write SetLabelName default nil;
    property LevelID : TField read GetLevelID write SetLevelID default nil;

    property DataSet : TDataSet read GetDataSet;

    Constructor Create(AOwner  : TComponent);
    procedure Assign(Source: TPersistent);
  published
    property ItemFieldName : string read FItemFieldName write FItemFieldName;
    property ParentFieldName : string read FParentFieldName write FParentFieldName;
    property LabelFieldName : string read FLabelFieldName write FLabelFieldName;
    property LevelFieldName : string read FLevelFieldName write FLevelFieldName;
  end;

  TRuTreeView = class(TTreeView)
  private
    FDataSet : TDataSet;
    FRules   : TRules;
    procedure SetRules(Value: TRules);
   { Private declarations }
  protected
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent);override;
    destructor Destroy; override;
    { Public declarations }
  published
    property DataSet : TDataSet read FDataSet write FDataSet;
    property Rules  : TRules read FRules write SetRules;
    { Published declarations }
  end;

  // редактор свойств для выбора полей из списка
  TFieldNameProperty = class(TStringProperty)
  public
    function GetAttributes: TPropertyAttributes; override;
    procedure GetValueList(List: TStrings); virtual;
    procedure GetValues(Proc: TGetStrProc); override;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TRuTreeView]);

  RegisterPropertyEditor(TypeInfo(string),TRules,'ItemFieldName',TFieldNameProperty);
  RegisterPropertyEditor(TypeInfo(string),TRules,'ParentFieldName',TFieldNameProperty);
  RegisterPropertyEditor(TypeInfo(string),TRules,'LabelFieldName',TFieldNameProperty);
  RegisterPropertyEditor(TypeInfo(string),TRules,'LevelFieldName',TFieldNameProperty);

end;

// ****** TRuTreeView ********
constructor TRuTreeView.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FRules:=TRules.Create(self);
end;

destructor TRuTreeView.Destroy;
begin
  FRules.Free;
  inherited Destroy;
end;

procedure TRuTreeView.SetRules(Value: TRules);
begin
  if Assigned(Value) then FRules.Assign(Value);
end;
// End TRuTreeView

// ***********  TRules  ********************
constructor TRules.Create(AOwner  : TComponent);
begin
  Owner := AOwner;

  ItemID := nil;
  ParentID := nil;
  LabelName := nil;
  LevelID := nil;

end;

procedure TRules.Assign(Source: TPersistent);
begin
  if Source is TRules then begin
    ItemID:=TRules(Source).ItemID;
    ParentID:=TRules(Source).ParentID;
    LabelName:=TRules(Source).LabelName;
    LevelID:=TRules(Source).LevelID;
    inherited Assign(Source);
  end;
end;

function TRules.GetDataSet : TDataSet;
begin
  if Owner is TRuTreeView then Result := TRuTreeView(Owner).DataSet;
end;

function TRules.GetItemID : TField;
begin
  Result:=nil;
  if DataSet <> nil then
    if FItemFieldName <> '' then Result := DataSet.FieldByName(FItemFieldName);
end;
function TRules.GetParentID : TField;
begin
  Result:=nil;
  if DataSet <> nil then
    if FParentFieldName <> '' then Result := DataSet.FieldByName(FParentFieldName);
end;
function TRules.GetLabelName : TField;
begin
  Result:=nil;
  if DataSet <> nil then
    if FLabelFieldName <> '' then Result := DataSet.FieldByName(FLabelFieldName);
end;
function TRules.GetLevelID : TField;
begin
  Result:=nil;
  if DataSet <> nil then
    if FLevelFieldName <> '' then Result := DataSet.FieldByName(FLevelFieldName);
end;

procedure TRules.SetItemID ( Value : TField);
begin
  if Value<> nil then
    FItemFieldName := Value.FieldName;
end;
procedure TRules.SetParentID ( Value : TField);
begin
  if Value<> nil then
    FParentFieldName := Value.FieldName;
end;
procedure TRules.SetLabelName ( Value : TField);
begin
  if Value<> nil then
    FLabelFieldName := Value.FieldName;
end;
procedure TRules.SetLevelID ( Value : TField);
begin
  if Value<> nil then
    FLevelFieldName := Value.FieldName;
end;

// end TRules

// TFieldNameProperty
function GetPropertyValue(Instance: TPersistent; const PropName: string): TPersistent;
var
  PropInfo: PPropInfo;
begin
  Result := nil;
  PropInfo := TypInfo.GetPropInfo(Instance.ClassInfo, PropName);
  if (PropInfo <> nil) and (PropInfo^.PropType^.Kind = tkClass) then
    Result := TObject(GetOrdProp(Instance, PropInfo)) as TPersistent;
end;

function TFieldNameProperty.GetAttributes: TPropertyAttributes;
begin
  Result := [paValueList, paSortList];
end;

procedure TFieldNameProperty.GetValueList(List: TStrings);
var
  DataSet: TDataSet;
  Comp : TPersistent;
  i : integer;
begin
  if GetComponent( 0 ) is TRules then Comp := TRules(GetComponent( 0 )).Owner
                               else Exit;
  DataSet := GetPropertyValue(Comp, 'DataSet') as TDataSet;
  if (DataSet <> nil) and (DataSet.Fields.Count > 0 ) then
    for i:= 0  to DataSet.Fields.Count- 1  do
       List.Add(DataSet.Fields[i].FieldName);
end;

procedure TFieldNameProperty.GetValues(Proc: TGetStrProc);
var
  I: Integer;
  Values: TStringList;
begin
  Values := TStringList.Create;
  try
    GetValueList(Values);
    for I :=  0  to Values.Count -  1  do Proc(Values[I]);
  finally
    Values.Free;
  end;
end;
// End TFieldNameProperty
end.

...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32168740
щас будем пробовать....спасибо за такое внимание...
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32168823
1. Для Дельфи 5 нужно заменить в uses DesignIntf, DesignEditors на Dsintf,dsgnintf
2. Процедура SetRules должна выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
procedure TRuTreeView.SetRules(Value: TRules);
begin
//  if Assigned(Value) then FRules.Assign(Value); {здесь ошибка - не проводится
проверка.Пример - присвоили свойство , а потом удалили этот датасет - будет глюк.С проверкой его нет.}
if Assigned(Value) then if (FRules<>NIL) then FRules.Assign(Value);
end;
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32168886
Lana
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще неплохо сделать для свойства DataSet функцию чтения,
я сталкивалась с глюками в случае, когда в дезайне компонент удалялся
Компонент не уничтожается а принимает статусc sDestroying, в таком случае лучше сразу уничтожить ссылку на такой объект.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
property DataSet : TDataSet read GetDataSet write FDataSet;


function TRuTreeView.GetDataSet : TDataSet;
begin
  if (FDataSet <> nil) and (csDestroying in FDataSet.ComponentState)
   then  FDataSet:=nil;

  Result:=FDataSet;
end;
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32168956
Господа...предлагаю создать библиотеку оригинальных компонент для Дельфи по принципу OpenSource ...
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32172114
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>то возникает access violation и глючит ДЕльфя прям во время desin time
Чтобы этого не было, надо перекрывать метод Notification, где можно отследить удаление компонента и освободить ссылку... а иначе ошибочка.

Вот выдержка из хелпа:
A component can, if needed, act on the notification that a component is being inserted or removed. For example, if a component has object fields or properties that contain references to other components, it can check the notifications of component removals and invalidate those references as needed.

Note: Notification is not called for components that are freed implicitly (because their Owner is freed).


Вот реальный пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TpFIBDataSet.Notification(AComponent: TComponent; Operation: TOperation); //override;
var i:integer;
begin
 inherited Notification(AComponent,Operation);
 case Operation of
  opRemove:  if (AComponent=FContainer)  then FContainer:=nil
             else
             if (AComponent is TField) and not (csDestroying in ComponentState) then
             begin
               i:=FFNFields.IndexOfObject(AComponent);
               if i<>- 1  then FFNFields.Delete(i);
             end;
 end;
end;
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32172289
да я в SetRules добавил проверку if<>nil и всё.... всё теперь работает...
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32173551
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>да я в SetRules добавил проверку if<>nil и всё.... всё теперь работает...
А откуда ты знаешь существует еще компонент или его уже удалили с формы??
Единственный способ это узнать Notification...
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32173601
ну не знаю что ты там вообразил - у меня всё работает
...
Рейтинг: 0 / 0
Создание оригинальных компонент в Дельфи
    #32204742
Vald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi All!
Мне досталась по случаю книга Рея Конопки, первое издание, но при ней не было дискеты. Может ли кто-нибудь из владельцев этой книги прислать мне контент этой дискеты?
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание оригинальных компонент в Дельфи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]