2016-07-09 20 views
4

In RAD Studio 10.1 Berlin einiges hat sich gegenüber der Vorversion geändert. In FMX gibt es einige zuvor veröffentlichte Ereignisse, die nun geändert wurden, um nur noch öffentlich zu sein.Wie kann ich einen Ereignishandler für ein nicht veröffentlichtes, aber öffentliches Ereignis in Delphi erstellen?

Ich habe ein Multi-Plattform-Projekt, das eine TStringGrid-Komponente und das OnDblClick-Ereignis verwendet. Beim Öffnen dieses Projekts in Studio 10.1 werde ich gewarnt, dass das Property OnDblClick nicht existiert.

Die Frage ist nun, wie ich das nicht mehr veröffentlichte Event nutzen kann?

(Ich muss sagen, dass es schwer zu verstehen ist, warum sie Mausereignisse nicht mehr auf Published setzen. Soweit ich weiß, haben die meisten normalen PCs und OSX-Maschinen keinen Touch. Ein echtes Multi-Target-Projekt sollte sein in der Lage, diese Systeme ohne Probleme wie in Studio 10 Seattle

+1

Bekannter Fehler https://quality.embarcadero.com/browse/RSP-14683 –

+0

Ok, ich verstehe. Das Lustige daran ist, dass die Hilfedatei den geänderten Status dieser Ereigniseigenschaften widerspiegelt. Deshalb dachte ich, dass es beabsichtigt war. Oder vielleicht war es absichtlich, aber dachte nicht wirklich durch? – TheAviator

+0

Die Hilfe wird von der Quelle erstellt. Also dieser Bug ist auch dokumentiert; o) –

Antwort

2

Ziel eine Lösung ist, um Ihre eigene Komponente zu machen, wo Sie die FMX.TStringGrid erweitern, Event-Handler wieder veröffentlicht haben.

Sehen Sie hier, wie eine neue FMX-Komponente zu erstellen: creating a firemonkey component

Hier ist der Code ist die Mausereignisse neu zu veröffentlichen.

unit MyStringGrid; 

interface 

uses FMX.Grids; 

type 
    TMyStringGrid = class(TStringGrid) 
    published 
    property OnDblClick; 
    property OnMouseDown; 
    property OnMouseMove; 
    property OnMouseUp; 
    property OnMouseWheel; 
    property OnMouseEnter; 
    property OnMouseLeave; 
    end; 

procedure Register; 

implementation 

uses FMX.Types; 

procedure Register; 
begin 
    RegisterComponents('NewPage', [TMyStringGrid]); 
end; 

initialization 
    RegisterFmxClasses([TMyStringGrid]); 
end. 
+0

Danke Johan! Das würde definitiv funktionieren, aber gibt es einen anderen einfacheren Weg?Jedes Mal, wenn Embarcadero eine neue Implementierung einer Standardkomponente veröffentlicht, müssen neue Komponenten erstellt werden. – TheAviator

3

Falls die Ereignishandler bereits vorhanden sein (was ich mit der Fehlermeldung impliziert), können Sie diese Handler ihre Veranstaltungen in Formcreate zuweisen.

procedure TForm1.FormCreate; 
begin 
    StringGrid1.OnDblClick := StringGrid1DblClick; 
end; 
+0

Danke Uwe! Genau das habe ich gesucht. Es ist mir ein bisschen peinlich, dass ich das nicht selbst bekommen habe ... – TheAviator

2

Dies war reported as a bug here.

Mit Blick auf den Quellcode in Delphi 10.1 berlin das öffentliche OnDblClick Ereignis wird tatsächlich von TControl Klasse vererbt.

Ähnlich wird das OnDblClick -Ereignis auch von der TControl-Klasse geerbt, mit der Ausnahme, dass es wie viele andere Ereignisse, die von TControl˙-Klasse geerbt werden, öffentlich gemacht wird.

Jede Art und Weise scheint es, dass Jungs bei Embarcadero wurden durch die Reinigung der Mutter Eigenschaft redeclarations˙ (nicht sicher, ob dies der richtige Begriff ist) etwas Refactoring tun wie:

type 
    TParentClass = clas(Tobject) 
    public 
    property ParentPropery: Integer read GetParentProperty write SetParentProperty; 

    TExampleClass = class(TParentClass) 
    public 
    property ParentPropery; 
    end; 
im obigen Fall

erneut deklariert ParentProperty ist Wird nicht benötigt, da es in allen untergeordneten Klassen verfügbar ist, es sei denn, Sie möchten die Sichtbarkeit beispielsweise von public zu published ändern.

Wenn man sich Delphi 10 Quellcode Seattle Sie sehen, dass Eigenschaft OnDblClick in mehreren TStringGrid Elternklassen neu deklariert wird in TCustomScrollBox zum ersten Mal veröffentlicht.