Bazı özel bileşenler için bir özel özellik düzenleyicisi oluşturmaya çalışıyorum. özel özellik editörüÖzel TSetProperty özellik düzenleyicisi oluşturma
type
TButtonOption = (boOption1, boOption2, boOption3);
TButtonOptions = set of TButtonOption;
benim özellik düzenleyici TSetProperty sınıfından iner gibi bazı dizi özellik düzenlemek için tasarlanmıştır. Sorun şu ki: özel mülk düzenleyicim kayıt altına alınmadı ve Delphi IDE kendi varsayılan set özellik düzenleyicisini kullanıyor gibi görünüyor, çünkü ShowMessage() özelliği, özellik düzenleyicisi yöntemlerini çağırmaz; Bu sorunu göstererek, olabildiğince basit bir örnek paket/bileşen oluşturdum.
unit Button1;
interface
uses
System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls, DesignIntf, DesignEditors;
type
TButtonOption = (boOption1, boOption2, boOption3);
TButtonOptions = set of TButtonOption;
TButtonEx = class(TButton)
private
FOptions: TButtonOptions;
function GetOptions: TButtonOptions;
procedure SetOptions(Value: TButtonOptions);
published
property Options: TButtonOptions read GetOptions write SetOptions default [];
end;
TMySetProperty = class(TSetProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure GetProperties(Proc: TGetPropProc); override;
function GetValue: string; override;
end;
procedure Register;
implementation
uses
Dialogs;
// TButtonEx - sample component
function TButtonEx.GetOptions: TButtonOptions;
begin
Result := FOptions;
end;
procedure TButtonEx.SetOptions(Value: TButtonOptions);
begin
if FOptions <> Value then
begin
FOptions := Value;
end;
end;
// register stuff
procedure Register;
begin
RegisterComponents('Samples', [TButtonEx]);
RegisterPropertyEditor(TypeInfo(TButtonOptions), nil, '', TMySetProperty);
end;
function TMySetProperty.GetAttributes: TPropertyAttributes;
begin
ShowMessage('GetAttributes');
Result := inherited GetAttributes;
end;
procedure TMySetProperty.GetProperties(Proc: TGetPropProc);
begin
ShowMessage('GetProperties');
inherited;
end;
function TMySetProperty.GetValue: string;
begin
ShowMessage('GetValue');
Result := inherited GetValue;
end;
end.
lütfen unutmayın:
- Bir TButtonOptions özelliğine sahip TÜM bileşenler için yeni özellik editörü (TMySetProperty) kayıt ediyorum İşte kodudur. Bunu sadece TButtonEx için yapmaya çalıştım, ancak sonuç aynı.
- Özel özellik düzenleyicimin tüm geçersiz yöntemlerinin içinde ShowMessage() çağrılarını ve bu yöntemleri ASLA aramamayı ekledim.
- Zaten paketi debugged ettik ve RegisterPropertyEditor() yürütür. Yine de, geçersiz kılınan yöntemlerde özel kodum asla yürütülmez.
- Eski Delphi IDE'lerinde çalışan bu tür bir özellik düzenleyicisi (TSetProperty) kullanarak diğer üçüncü taraf bileşenleri gördüm ve kodla ilgili herhangi bir farklılık bulamadım. Belki Delphi XE2 + başka bir şey ister?
Soru şu: Neden özel özellik düzenleyicim kayıt/çalışma yapmıyor?
Not: Bu sorun en azından Delphi XE2, XE3, XE4 ve XE5'te gerçekleşir. Diğer IDE'ler test edilmemişti ama muhtemelen aynı davranışa sahipti.
Aynı pakette bileşeni ve editörü uygulayamaz: Bazı kriterlere dayalı, gösteri ya da benim set tabanlı mülkiyet bazı seçenekleri gizlemek: İşte benim de bunun için bazı ilginç bir uygulama gösteren, çalışan kod, değiştirilir . Bileşenin kendi çalışma zamanı paketinde olması gerekiyor ve editörün çalışma zamanı paketini gerektiren kendi tasarlamasızlık paketinde olması gerekiyor. –
Merhaba Remy. Cevabınız için teşekkürler. Maalesef sorunun nerede olduğu bu değil. Bu kod burada basitleştirilmiştir (açıklık için) ve tüm kod aynı birim içinde yer almaktadır. Gerçek kodum 2 farklı paket kullanıyor, biri çalışma zamanı malzemesi ve diğer tasarım zamanı eşyaları için. Sorun aynı. Özel özellik düzenleyicisi iki şekilde çalışmaz. – Alexandre
XE2'deki problemi yeniden üretebilirim, neden çalışmadığına dair bir fikrim yok. Açıkçası tasarım zamanı paketi "RegisterComponents()" çalışması sayesinde çalışır. Bu yüzden, 'Tamsayı' temelli bir özellik daha ekledim ve bunun için bir editör kaydettim ve iyi çalıştı. Bu nedenle sorun, IDE'nin 'Set' tabanlı özellikleri özellikle ele alma biçimi ile ilgili bir sorun olmak zorunda. –