Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Ereignis erschient nicht im Property editor (https://www.delphipraxis.net/153107-ereignis-erschient-nicht-im-property-editor.html)

idefix2 21. Jul 2010 10:06

Ereignis erschient nicht im Property editor
 
Hallo,

ich verwende ein Basisformular, das ich der Objektablage hinzugefügt habe. Von dem Formular habe ich einige neue Formulare abgeleitet, das funktioniert soweit wunderbar.
Jetzt wollte ich in meinem Basisformular zwei published Properties vom Typ procedure of object einführen, die werden aber im Object Inspector unter den Ereignissen nicht angezeigt. Was könnte da falsch sein?

Delphi-Quellcode:
type
  proc = procedure of object;
  SatzMode = (modeShow,modeNew,modeCopy,modeEdit);
  TfrmSatz = class(TForm)
      Panel1: TPanel;
      bbOk: TBitBtn;
      bbAbort: TBitBtn;
      procedure bbAbortClick(Sender: TObject);
      procedure bbOkClick(Sender: TObject);
      procedure FormClose(Sender: TObject; var Action: TCloseAction);
    private
      FGetspecial, FSetSpecial: proc;
      FId: integer; // id des aktuellen Datensatzes, bei Neueingabe 0
    protected
      FMode: sSatzMode;
      FAlleSpalten: TStrings; //
      FFrom: String;  //
      function GetData: boolean;
    public
      constructor create (AOwner: TComponent; AMode: SatzMode; AId: integer;
                          ASpalten: TStrings; AFrom: String); reintroduce;
      property Mode: SatzMode read FMode;
    published
      property GetSpecial: proc read FGetSpecial write FGetSpecial;
      property SetSpecial: proc read FSetSpecial write FSetSpecial;
    end;
edit:
Ich habe mich jetzt noch ein bißchen gespielt - gar keine von meinen Properties werden angezeigt, ich habe jetzt noch eine integer Property "test" hinzugefügt, auch die gibt es im Object Inspector nicht. Aber Objekte, die ich im Formulardesigner hinzufüge, erscheinen richtig in allen abgeleiteten Formularen.

idefix2 22. Jul 2010 13:41

AW: Ereignis erschient nicht im Property editor
 
Keine Vorschläge?

Uwe Raabe 22. Jul 2010 13:52

AW: Ereignis erschient nicht im Property editor
 
Ich habe mal eine Anleitung von Jeff Overcash gelesen, in der grob beschrieben wird, wie man das macht (sorry, Englisch):

Zitat:

As others have said you need to publish your properties. Second you need a
constructor to set the initial values you want. Finally to see them in the
Object inspector you will need to

1) Add the form to the Repository
2) Add the form to a new package
3) Add a Register procedure to that package and it should read something like

procedure Register
begin
RegisterCustomModule(TWM_FORM, TCustomModule);
end;

4) Install the package.

Now just make sure you inherit from the base form and you should see your additional properties. Do not copy or use the form, but inherit from it.
I'm not certain where RegisterCustomModule is these days, but I'd guess it would be in DesignIDE.


idefix2 22. Jul 2010 18:36

AW: Ereignis erscheint nicht im Property editor
 
Danke für die Antwort.

Ich frage mich, was sich Borland/Embarcadero/wer-auch-immer dabei denken, wenn sie ein Produkt wie Delphi mit wirklich genialen Features herausbringen und das dann durch eine wirklich ganz und gar erbärmliche Produktdokumentation wieder ruinieren.

idefix2 26. Jul 2010 21:04

AW: Ereignis erschient nicht im Property editor
 
Ich muss sagen, ich blicke da einfach nicht durch.

Ich habe jetzt verschiedenes probiert, aber mir ist nicht einmal klar, welche Parameter RegisterCustomModule wirklich braucht. Ich bin aber auch etwas skeptisch, ob das der richtige Ansatz ist, weil im Quelltext von designintf (dort ist registercustommodule definiert) steht vor dieser Prozedur folgender Kommentar:
A custom module allows containers that descend from classes other than TForm to be created and edited by the form designer.
Das will ich ja gar nicht, meine Klassen stammen doch von TForm ab, also dürften es wohl keine Custommodules sein.

Aber vielleicht kann man TForms doch auch irgendwie auf diese Art registrieren, nur wie? In der Unit Forms selbst kommt keine wie auch immer geartete Register-Prozedur vor.

Stevie 27. Jul 2010 05:34

AW: Ereignis erschient nicht im Property editor
 
Also bei mir klappt das.
Habe folgende Schritte durchgeführt:
  1. neues Package erstellt und als Design only markiert
  2. neues Form dem Package hinzugefügt
  3. published properties im Form hinzugefügt
  4. Rechtklick aufs Form und "Add to repository..."
  5. neue Unit dem Package hinzugefügt
  6. procedure Register in diese Unit geschrieben (
    Delphi-Quellcode:
    RegisterCustomModule(TMyForm, TCustomModule);
    , DesignIntf, DesignEditors ins uses und DesignIde in required Packages)
  7. Package kompiliert und installiert
  8. Unter File->New->Other... mein Form ausgewählt und darunter den RadioButton "Inherit" ausgewählt

idefix2 28. Jul 2010 18:26

AW: Ereignis erschient nicht im Property editor
 
Jetzt gehe ich einmal auf urlaub, dann werde ich die Sache noch einmal mit neuem Schwung angehen.

Im Package landen also zwei Units, die eigentliche Form und die Unit zum Registrieren der Form.
Die register-Prozedur hast Du wahrscheinlich in eine separate Unit geschrieben, damit sie nicht mit einem ganzen Rattenschwanz an zugehörigen Units in die Exe eingebunden wird?

Und noch eine Frage: Wie markiert man ein package als Design only, und was bewirkt das?

mjustin 29. Jul 2010 16:59

AW: Ereignis erschient nicht im Property editor
 
Marco Cantu schrieb auch mal etwas zum Thema:

The TCustomModule Class and the RegisterCustomModule Procedure
http://www.marcocantu.com/ddh/ddh15/ddh15e.htm

Auf MustangPeak fand ich dies:

OTA - Forms with Published Properties Visible in the Object Inspector
http://www.mustangpeak.net/ota_publishedprop_forms.htm

Auf SO fand ich unter dieser Frage
http://stackoverflow.com/questions/9...ties-to-a-form

diesen Hinweis zum MustangPeak Artikel:
Zitat:

The article is detailed, but the only part I really needed was RegisterCustomModule. I simply added "RegisterCustomModule(TfrmEasyIPBase, TCustomModule);" to my register unit and everything now works perfectly :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz