Tag allerseits,
Eines Kurz vorweg:
Wie der Prefix schon sagt ist es eigentlich ein hilfreicher Kniff, weswegen dieses "Tutorial" nicht all zu lang werden sollte, außerdem setze ich Erfahrung im Bereich der Komponenntenentwicklung voraus(Wenn es sie gegeben hätte, hätte ich es eher in die Tips&Tricks Ecke gepackt
).
Folgende Problemstellung(ich nutze D2010):
Ihr entwickelt eine Komponennte mit Designtime und Runtime
Package. Eure Komponennte ist von einer anderen Komponennte abgeleitet, bei der einige ihrer Published Properties zwar für die
IDE verfügbar, aber für den Anwender unsichtbar sein sollen.
Bei mir ergab sich z.B. folgendes:
Ich wollte eine neue TreeView Komponennte schreiben(wie TTreeView, nur mit einigen zusätzlichen Dingen, abgeleitet von TCustomTreeView).
Dabei, war auch vorgesehen einen neuen Editor für den NodeTree zu erstellen(mit zusätzlichen Möglichkeiten). Problem war allerdings, dass die ITEMS Property bereits für die Designtime einen Editor zugewiesen bekommen hatte(kleiner Knopf an der rechten Seite des Propertyeintrags im OBInspector). Der Anwender sollte aber nur den neuen Editor nutzen und nicht auf den alten zugreifen können(wegen Inkompatibilität).
Wie also sollte der Eintrag unsichtbar gemacht werde, aber gleichzeitig für die
IDE vollständig zur verfügung stehen? Beim plazieren wird z.B. automatisch der NodeTree initialisiert und ausgelesen, was nicht gehen würde wenn man entweder ITEMS brachial aus PUBLISHED entfernen würde, oder ReadOnly setzt. Es muss ja auch noch reingeschrieben werden können.
Lösung:
Nach stundenlangem durchblättern von sogenannten "Lösungsansätzen" ergab sich eine, sehr einfache und saubere Lösung.
Es wird nämlich NICHTS dafür extra in der Klasse selbst geändert, sondern bei der Registrierung der Komponennte für die
IDE selbst.
Wenn eure Komponnente z.B. so registriert wurde(DesigntimePackage):
Code:
procedure Register;
begin
RegisterComponents('MeineTools', [TMeinTreeView])
end
Muss es folgendermasen abgeändert werden:
Code:
procedure Register;
begin
RegisterComponents('MeineTools', [TMeinTreeView])
UnlistPublishedProperty(TMeinTreeView, 'Items');
end
Diese Zeile, macht nichts weiter als die angegebene Property aus dem ObjectInspector zu nehmen, die Property selbst bleibt in Takt(und kann somit noch immer per Code angesteuert werden. Z.B. für Editoren etc.).
Dies wirkt sich nicht auf die Komponennte aus von der eure Komponennte abgeleitet wurde, wird jedoch eine weitere Komponennte von eurer abgeleitet, so betrifft es diese auch.
Auch wenn vielleicht einige diese Lösung kennen sollten, war besagte Funktion auf diesem Board(laut Sufu) noch nicht erwähnt worden.
Vielleicht kann so auch anderen geholfen werden.
MFG
Memnarch