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

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

3. Где найти инфу по созданию компонентов для продвинутых пользователей?
...
Рейтинг: 0 / 0
22.05.2003, 18:15
    #32166549
Создание оригинальных компонент в Дельфи
ну че кто нибудь ответит да? родные мои ответьте не бросайте меня на произвол судьбы
...
Рейтинг: 0 / 0
23.05.2003, 07:32
    #32166709
Создание оригинальных компонент в Дельфи
кто нибудь ответьте а?
...
Рейтинг: 0 / 0
23.05.2003, 09:03
    #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
23.05.2003, 09:09
    #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
23.05.2003, 12:40
    #32167080
olga1999
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание оригинальных компонент в Дельфи
1. Как сделать свойство с подсвойствами.

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

Published
prop:y

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

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

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


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

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

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

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

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

Все это в модуле controls.pas.
...
Рейтинг: 0 / 0
23.05.2003, 18:19
    #32167641
Создание оригинальных компонент в Дельфи
щас буду пробовать
...
Рейтинг: 0 / 0
23.05.2003, 19:31
    #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
23.05.2003, 19:35
    #32167700
Создание оригинальных компонент в Дельфи
походу никто не знает как это делается вот и ответы такие расплывчатые...
...
Рейтинг: 0 / 0
23.05.2003, 22:27
    #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
24.05.2003, 09:07
    #32167801
Создание оригинальных компонент в Дельфи
вот такие у меня траблы
...
Рейтинг: 0 / 0
24.05.2003, 10:03
    #32167806
mpro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание оригинальных компонент в Дельфи
Дык смотреть надо как другие это реализовывают. Ты в tdbgridcolumn видел свойство типа tfield? Там через фиелднэйм все работает чего и тебе советую
...
Рейтинг: 0 / 0
24.05.2003, 14:47
    #32167881
Создание оригинальных компонент в Дельфи
я понял тебя друг...только как сделать чтобы из фиелднэймов можно было выбирать значение....?
...
Рейтинг: 0 / 0
25.05.2003, 11:00
    #32168037
Создание оригинальных компонент в Дельфи
А?
...
Рейтинг: 0 / 0
26.05.2003, 00:58
    #32168162
mpro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание оригинальных компонент в Дельфи
понятия не имею:-)
Всегда ручками писал
Если нароешь где (например в исходниках) отпишись плиз
...
Рейтинг: 0 / 0
26.05.2003, 07:02
    #32168176
Создание оригинальных компонент в Дельфи
хорошо
...
Рейтинг: 0 / 0
26.05.2003, 12:56
    #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
26.05.2003, 16:40
    #32168740
Создание оригинальных компонент в Дельфи
щас будем пробовать....спасибо за такое внимание...
...
Рейтинг: 0 / 0
26.05.2003, 17:37
    #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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание оригинальных компонент в Дельфи / 25 сообщений из 32, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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