Form von einer bestehenden ableiten und implementieren



  • Hallo zusammen,

    hab ein kleines Problem. Naja vielmehr ein großes 😞

    Ich setze die ExpressScheduler Komponenten von DevExpress ein.
    Dort versuche ich nun die EventEditor Form zu modifizieren und in mein Projekt zu integrieren. Das hinzufügen zum Projekt und die modifizierung der Form ist dabei kein Problem. Ich bekomm das einfach nicht hin, dass anschließend meine modifizierte Form aufgerufen wird, wenn versucht wird ein Neues Ereignis zu erfassen.

    Es gibt zwar in der KnowledgeBase von DevExpress einen Eintrag, wie man dies bewerkstelligt aber damit komm ich nicht wirklich klar. Ist für Delphi und ich habe keine Ahnung wie ich das auf C++ portiere.

    Wär super, wenn jemand einen Tipp für mich hätte.

    Hier der Link zum Knowledgebase Eintrag. Vielleicht versteht das jemand von euch.

    https://www.devexpress.com/kb=A2352

    Es geht mir einfach nur darum, wie bekomme ich denn folgenden Delphi Code nach C++

    [Delphi]
    
    unit CustomizedEventEditorForm;
    // ...
    type
      TcxSchedulerEventEditorCustomized = class(TcxSchedulerEventEditor)
        gbClient: TcxGroupBox;
        lbFirstName: TcxLabel;
        teFirstName: TcxTextEdit;
        lbLastName: TcxLabel;
        teLastName: TcxTextEdit;
        lbGender: TcxLabel;
        cbGender: TcxComboBox;
      private
        { Private declarations }
      protected
        procedure LoadEventValuesIntoControls; override;
        procedure UpdateEventValuesFromControls; override;
      public
        { Public declarations }
      end;
    
    var
      cxSchedulerEventEditorCustomized: TcxSchedulerEventEditorCustomized;
    
    implementation
    
    uses
      cxSchedulerDialogs;
    
    {$R *.dfm}
    
    procedure TcxSchedulerEventEditorCustomized.LoadEventValuesIntoControls;
    begin
      // call the parent’s method to load the data into the inherited editing controls 
      // located on the form
      inherited LoadEventValuesIntoControls; 
      try
        // load the data into the custom editing controls
        // no checking for a null value is needed. 
        // The null value is automatically replaced with empty string in the editing controls
        teFirstName.EditValue := Event.GetCustomFieldValueByName('FName');
        teLastName.EditValue := Event.GetCustomFieldValueByName('LName');
        cbGender.EditValue := Event.GetCustomFieldValueByName('Gender');
      except
        on E: Exception do
          ShowMessage('Can''t load data' + #13#10 + E.Message);
      end;
    end;
    
    procedure TcxSchedulerEventEditorCustomized.UpdateEventValuesFromControls;
    begin
      // call the parent’s method to post the data from the inherited editing controls
      // located on the form
      inherited UpdateEventValuesFromControls; 
      try
        // post the data from the custom editing controls
        Event.SetCustomFieldValueByName('FName', teFirstName.EditValue);
        Event.SetCustomFieldValueByName('LName', teLastName.EditValue);
        Event.SetCustomFieldValueByName('Gender', cbGender.EditValue);
        FModified := True;
      except
        on E: Exception do
          ShowMessage('Can''t post data' + #13#10 + E.Message);  
      end;
    end;
    
    initialization
      // to use the cxEventEditorClass constant include the cxSchedulerDialogs unit in the uses clause
      // indicate that the new Event modal dialog will be invoked at runtime
      cxEventEditorClass := TcxSchedulerEventEditorCustomized;
    

    Danke schonmal vorab

    mfg
    bopp2



  • Hallo

    Ich versuch mal eine Konvertierung

    // Header
    class TcxSchedulerEventEditorCustomized : public TcxSchedulerEventEditor
    {
    
      private :
        TcxGroupBox *gbClient;
        TcxLabel* lbFirstName;
        TcxTextEdit* teFirstName;
        TcxLabel* lbLastName;
        TcxTextEdit* teLastName;
        TcxLabel* lbGender;
        TcxComboBox* cbGender;
      protected :
        virtual void LoadEventValuesIntoControls();
        virtual void UpdateEventValuesFromControls;
      public :
    
    };
    
    // Unklar ob Stack oder Heap, Initialisierung muß in die Implementation
    TcxSchedulerEventEditorCustomized cxSchedulerEventEditorCustomized;
    
    // Implementation
    
    #include "cxSchedulerDialogs.h"
    
    void TcxSchedulerEventEditorCustomized::LoadEventValuesIntoControls()
    {
      TcxSchedulerEventEditor::LoadEventValuesIntoControls();
      try
      {
        // Event hier unbekannt?!
        teFirstName->EditValue = Event.GetCustomFieldValueByName("FName");
        teLastName->EditValue = Event.GetCustomFieldValueByName("LName");
        cbGender->EditValue = Event.GetCustomFieldValueByName("Gender");
      }
      catch(Exception e)
      {
        ShowMessage(AnsiString("Can't load data\r\n") + e.Message());
      }
    }
    
    void TcxSchedulerEventEditorCustomized::UpdateEventValuesFromControls()
    {
      TcxSchedulerEventEditor::UpdateEventValuesFromControls();
      try
      {
        // Event auch hier unbekannt?
        Event.SetCustomFieldValueByName("FName", teFirstName->EditValue);
        Event.SetCustomFieldValueByName("LName", teLastName->EditValue);
        Event.SetCustomFieldValueByName("Gender", cbGender->EditValue);
        FModified = true;
      }
      catch(Exception& e)
      {
        ShowMessage(AnsiString("Can't post data\r\n") + e.Message());  
      }
    }
    
    // Sinn unklar, Variable heißt hier anders als in der Headerdatei?
    cxEventEditorClass = TcxSchedulerEventEditorCustomized();
    

    bis bald
    akari



  • Hallo,

    vielen Dank für deine Antwort. Werde es nachher ausprobieren und berichten, ob es funktioniert hat. Vielen Dank nochmal.

    mfg
    bopp2



  • Hab das jetzt mal getestet, funktioniert aber nicht wirklich.
    Bekomme den Fehler, dass

    void TcxSchedulerEventEditorCustomized::LoadEventValuesIntoControls()
    

    kein Element von TcxSchedulerEventEditorCustomized ist.

    Vielleicht kennt noch jemand diese Komponente und hat dies schon erfolgreich umgesetzt. Bin für jeden Tipp dankbar.

    Gruss
    bopp2



  • Hallo

    dann überprüf den Header, wo die Deklaration von TcxSchedulerEventEditorCustomized sein muß. Und zwar in so einer Form innerhalb des class-Scopes

    virtual void LoadEventValuesIntoControls();
    

    bis bald
    akari



  • Hab ich gemacht aber sobald das wie folgt deklariert wird,

    virtual void LoadEventValuesIntoControls();
    

    gibt folgenden Fehler:

    [C++ Fehler] formEventForm.h(40): E2113 Virtuelle Funktion 'TcxSchedulerEventEditorCustomized::LoadEventValuesIntoControls()' verursacht Konflikte mit der Basisklasse 'TcxSchedulerEventEditorForm'
    


  • So bin schon mal etwas weiter.

    Wenn ich aber versuche die initialisierung vorzunehmen....

    __fastcall TcxSchedulerEventEditorCustomized::TcxSchedulerEventEditorCustomized(TComponent* Owner)
            : TcxSchedulerEventEditorForm(Owner)
    {
    cxEventEditorClass = TcxSchedulerEventEditorCustomized;
    }
    

    Bekomme ich den Fehler:

    [C++ Fehler] formEventForm.cpp(36): E2108 Ungültige Verwendung von typedef 'TcxSchedulerEventEditorCustomized'
    

    Hat diesbezüglich vielleicht noch jemand einen Tipp für mich ?



  • Hallo

    wie und wo genau hast du denn cxEventEditorClass deklariert?

    Desweiteren bist du dir hoffentlich im klaren, das du da semantischen Unsinn schreibst.
    In dem Konstruktor von TcxSchedulerEventEditorCustomized soll ein weitere Instanz von TcxSchedulerEventEditorCustomized erstellt werden, für die natürlich auch der Konstruktor aufgerufen wird...
    Das ist ein klarer Flaa von Stack-Overflow. Das steht garantiert nicht so im Delphi-Quellcode.

    bis bald
    akari



  • Also ich versuche folgendes aus dem Delphi Code umzusetzen:

    initialization 
      // to use the cxEventEditorClass constant include the cxSchedulerDialogs unit in the uses clause 
      // indicate that the new Event modal dialog will be invoked at runtime 
    
      cxEventEditorClass := TcxSchedulerEventEditorCustomized;
    

    Die cxEventEditorClas ist im cxSchedulerDialogs.hpp deklariert, welche inkludiert ist.

    Zur meiner Verteidigung muss ich sagen, dass ich bisher nicht wirklich was mit Klassen etc. gemacht habe. Steh da noch am Anfang. Mir wär für den Anfang schon geholfen, wenn ich wüsste wie ich das ganze initialisiere.


Anmelden zum Antworten