[Delphi 7] Nonpublished property in Object Inspector?

Pagina: 1
Acties:

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 18:37

Tomatoman

Fulltime prutser

Topicstarter
Korte vraag met wellicht een gecompliceerd antwoord: is het mogelijk om (via een zelfgeschreven property editor) een nonpublished property weer te geven in de Object Inspector?

De reden van deze vraag is dat ik een event in de Object Inspector wil weergeven, terwijl de event in werkelijkheid niet als property bestaat in de component. Er is dus ook geen RTTI aanwezig.

Een goede grap mag vrienden kosten.


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

Een korte vraag => kort antwoord (en daarna :Z )
kweet niet of dit in delphi hetzelfde is als in c#, maar vooruit :
Klik
Maak dus zelf rtti aan voor dit event...

[ Voor 13% gewijzigd door D4Skunk op 20-04-2005 01:55 . Reden: iets te snel gepost grmbl |:( ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 18:37

Tomatoman

Fulltime prutser

Topicstarter
Nee, dat is niet hetzelfde. Je kunt in Delphi niet zomaar RTTI aanmaken, dat doet de compiler.

Een goede grap mag vrienden kosten.


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

Ow, ok, ik veronderstel Delphi 7 != Delphi.Net... :+
Dan heb ik er eerlijk gezegd geen idee van. Als er niet zoiets als propertydescriptors bestaat moet je dan waarschijnlijk een afgeleide of wrapper class maken...

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nee, dat is niet mogelijk. Waarom kan je het event niet published maken?

We adore chaos because we like to restore order - M.C. Escher


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Property editors gebruik je toch niet om een property in de Object inspector weer te geven maar om de waarde van een bepaalde property te veranderen. De enige mogelijkheid om properties in de Object Inspector te krijgen is via published.
Delphi help
Published members have the same visibility as public members. The difference is that runtime type information (RTTI) is generated for published members. RTTI allows an application to query the fields and properties of an object dynamically and to locate its methods. RTTI is used to access the values of properties when saving and loading form files, to display properties in the Object Inspector, and to associate specific methods (called event handlers) with specific properties (called events).
Of er moet een andere manier zijn om voor een bepaalde property RTTI generatie aan te swengelen. Vraag blijft natuurlijk waarom je het event bij juist dit component wilt laten zien (terwijl het er eigenlijk niet bij hoort?).

www.fendt.com | Nikon D7100 | PS5


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 18:37

Tomatoman

Fulltime prutser

Topicstarter
Ik heb een component met als property LoginDlgOptions. Dat is een class TDBLoginDlgOptions, een descendant van TPersistent. Alle subproperties van die property worden netjes weergegeven.

Afbeeldingslocatie: http://img259.echo.cx/img259/1765/props8rv.gif

Tot zover niets aan de hand. Het probleem bevindt zich bij de events. LoginDlgOptions heeft ook een paar published events, maar die zijn niet zichtbaar in de tree structure. Je ziet alleen een published event van DialogManager. Blijkbaar geeft de Object Inspector events niet genest aan zoals het bij de properties wel doet.

Afbeeldingslocatie: http://img253.echo.cx/img253/3851/events12rd.gif

Dat het wel degelijk mogelijk is bewijst Developer Express. Hier zie je van de property PanelStyle alle events.

Afbeeldingslocatie: http://img253.echo.cx/img253/3254/events24mv.gif

Dat is precies wat ik voor mijn component wil weergeven in de Object Inspector. Het probleem is echter niet de property editor, maar de truc die Developer Exptress gebruikt om de events weer te geven. De published PanelStyle property gebruiken zij om alle properties weer te geven, maar niet de events. Voor het weergeven van de events gebruiken zij een published property die PanelStyleEvents heet.

Delphi:
1
2
3
4
5
6
7
8
type
  TPanels = class(TCollectionItem)
    ...
  published
    PanelStyle: TdxStatusBarTextPanelStyle read FPanelStyle write SetPanelStyle;
    PanelStyleEvents: TNotifyEvent read FPanelStyleEvents
      write FPanelStyleEvents;
  end;
PanelStyleEvents wordt in de Object Inspector bij de events weergegeven, omdat het ook daadwerkelijk een event is (TNotifyEvent). Vervolgens haalt de property editor van PanelStyleEvents wat smerige trucjes uit; zo geeft hij als naam niet PanelStyleEvents weer maar PanelStyle en als waarde niet (TNotifyEvent) maar (TdxStatusBarTextPanelStyle). Het lijkt daardoor alsof je de events van PanelStyle ziet, maar eigenlijk zie je events die kunstmatig worden weergegeven als subproperties van een event!

Deze oplossing wil ik niet gebruiken, omdat je dan een published event hebt die puur dient voor de weergave in de Object Inspector. Iemand die de broncode zit door te lezen vraagt zich vervolgens af wat die property eigenlijk doet (niets dus).

Nog een laatste ontdekking: het lijkt erop dat de Object Inspector alleen 'echte' events weergeeft op het tabblad met events en dat hij niet te bewegen is om daar classes weer te geven.

Een goede grap mag vrienden kosten.


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Developer Express heeft dit zo opgelost omdat het niet anders kan. Als je dit niet wilt, is het gewoon niet mogelijk.

Je zou alle event kunnen wrappen in je hoofdcomponent, maar dat is m.i. echt smerig. Je maakt dan events van subitems onderdeel van je hoofditem.
Pagina: 1