Announcement

Collapse
No announcement yet.

Event an Objekte weiterreichen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Event an Objekte weiterreichen

    Hallo zusammen,

    ich habe hier ein Stringgrid, an dem hängen an jeder Zeile verschiedene Objekte vom Typ TFixzeile, die in den Zeilen Berechnungen vornehmen:
    StringGrid1->Objects[0][1] = new TFixzeile("Materialkosten", 1000, 0, true);

    Jetzt sollen alle TFixzeile(n) mitkriegen, wenn im StringGrid1 OnExit ausgelöst wird. Wie kriege ich das hin? Am liebsten wäre mir das, wie die Reaktion auf eine Windows-Botschaft zu lösen. Hier mal in Pseudo-Code:
    BEGIN_MESSAGE_MAP
    VCL_MESSAGE_HANDLER(ONEXIT, TMessage, OnExit);
    END_MESSAGE_MAP(TFixzeile);

    Aber irgendwie bin ich da auf dem Holzweg.

    Ich muß irgendwie den Methodenzeiger OnExit vom Stringgrid auf ALLE TFixzeile(n) umbiegen. Auf eine wäre ja kein Problem.

    Danke schon mal für die Hilfe.

    CodeGier

  • #2
    Das wird nur gehen, wenn du alle TFixzeile einzeln mit ihrem Eventhandler zu OnExit auf das OnExit des Grid deuten lässt.

    Das setzt voraus, das TFixzeile

    - eine Komponente/Klasse i.S. der VCL ist
    - und die das Event kennt

    Ist diese Klasse neu?
    Christian

    Comment


    • #3
      Verstehe nicht genau was du wilst.

      Eher dachte ich das immer nur eine der TFixZeile angesprochen werden muss. Nämlich nur bei die Row wo sie anhängt. Weshalb soll mann sie sonst in Objects[][] hängen?

      So etwas wenn immer nur eine:

      Code:
      void __fastcall TForm1::StringGrid1Exit(TObject *Sender)
      {
           TFixZeile *FixZeile = dynamic_cast<TFixZeile*>(StringGrid1->Objects[0][StringGrid1->Row]);
      
            if ( FixZeile )
              FixZeile->StringGridExit();
      }

      Comment


      • #4
        Originally posted by Christian Marquardt View Post
        Das wird nur gehen, wenn du alle TFixzeile einzeln mit ihrem Eventhandler zu OnExit auf das OnExit des Grid deuten lässt.
        Ist diese Klasse neu?
        Hallo Christian,
        Hallo Hans,

        danke für die Hilfeversuche. Ich sehe schon, so ganz klar konnte ich mein Vorhaben noch nicht machen.

        Das Endprodukt meiner Arbeit ist eine Kalkulationstabelle. Es werden Material- und Lohnkosten eingetragen, aufsummiert, auf die Summe Gemeinkosten aufgeschlagen, etc. Der User kann darin Werte ändern, die Tabelle sollte immer korrekt berechnet werden.

        Diese Berechnungen wollte ich jetzt mit verschiedenen Klassen erschlagen. TFixZeile für die festen Werte, TSummenZeile für Aufsummierungen und TProzentZeile für Prozentrechnen, TParserZeile für Formeln, die der User selbst in die Tabelle eingibt.

        Arbeiten werde ich auch nicht mit dem TStringGrid sondern mit dem TAdvStringGrid von TMS, da gibt es ein Event OnCellValidate. Dieses wird ausgelöst, wenn eine Zelle verändert wurde. Auf dieses Event sollten meine Objekte reagieren. Tritt OnCellValidate auf, sollen z.B. die TSummenZeile ihre Summen neu berechnen, etc.

        Die Objekte werden in einer Liste gehalten. Wenn ein ein Objekt via OnCellValidate erfährt, daß es in seiner Zeile änderungen gegeben hat, dann soll das Listenobjekt alle Objekte dazu auffordern sich der Reihe nach neu zu berechnen. Jetzt wäre natürlich eine Möglichkeit nur das Listenobjekt auf das Event reagieren zu lassen.

        Hm, vielleicht liegt das Problem auch im Design. Wie würdet Ihr das lösen?

        ciao

        CodeGier

        Comment


        • #5
          OnCellValidate auf, sollen z.B. die TSummenZeile ihre Summen neu berechnen

          Gehe davon aus, dass du die Berechnungen selbst machst und nicht über TADVStringGrid.

          Schreibe eine Methode "berechne"
          Darin werden alle notwendigen Berechnungen für deine Felder durchgeführt.

          Die kannst du bei Bedarf aufrufen
          Christian

          Comment


          • #6
            Hallo Codegier,
            vielleicht solltest Du Dein Konzept mal überdenken. Warum willst Du Deine Rechenlogik an die Oberflläche binden? Du hast eine Businesslogik, die Berechnungen durchführt, und im Grid darstellt. Dabei sollte es doch egal sein, ob es das StringGrid ist (was sicher eine schlechte Wahl ist), das TAdvStringGrid von TMS oder ein Grid von devExpress. Desto unabhängiger Du von dem jeweiligen Grid bist, umso besser.

            Wenn sich in den Zellen etwas ändert, kannst Du die jeweiligen Methoden des Grids verwenden, die aber nur oberflächenunabhängige Methoden der Businesslogik aufrufen, die die Veränderungen wieder visualisieren.

            Wenn dann das Ende naht (OnExit), hast Du auch die Objekte im Griff, und kannst sie sauber eleminieren, und musst nicht mit Events agieren, die Du weitergibst.

            Schöne Grüße

            Volker

            Comment


            • #7
              Hallo Christian,
              Hallo Volker,

              das ist genau der Punkt: Ich will die Logik von der Oberfläche trennen. Deshalb habe ich mit (zumindest geistig) von der Bindung ans Grid verabschiedet. Ich führe in einer Objektliste alle meine Berechnungsobjekte deren Index mit der Zeilennummer des Grid übereinstimmt.

              Ich werde es jetzt so lösen, das im OnCellValidate des Grid meiner Objektliste mitgeteilt wird, was sich verändert hat. Den Rest erledigt die Liste mit den angehängten Objekten. So wird es wohl am saubersten klappen.

              Danke für Euer Hirnschmalz.

              CodeGier

              Comment

              Working...
              X