Announcement

Collapse
No announcement yet.

"Funktionsrückgabetypen" etwas zuweisen

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

  • "Funktionsrückgabetypen" etwas zuweisen

    Eine alte DB-Tabelle soll durch eine Textdatei ersetzt werden.
    Dazu ist eine Klasse TMyData zu entwickeln.

    Im Programm gibt es folgende Original-Befehle:

    DatenString := MyData.FieldByName('Name').AsTring;
    DatenInteger := MyData.FieldByName('Name').AsInteger;

    Diese Programmzeilen sollen ohne eine Änderung des Quellcodes
    durch die neue Klasse bedient werden.
    Das ist nicht weiter kompliziert und könnte wie folgt gelöst werden:

    In der neuen Klasse TMyData gibt es folgenden Record. Die Methode verwendet
    diesen Recordtypen

    Type RecMyRecord = Record
    AsString:String;
    AsInteger:Integer;
    end;


    function TMyData.FieldByName(const FieldName:String):RecMyRecord;
    var
    RReturn:RecMyRecord
    begin
    // Suche in der Textdatei nach 'FieldName'

    RReturn.AsString := 'ein Text';
    RReturn.AsInteger := 4711;

    FieldByName := RReturn;
    end;

    Auf diese Weise kann man den beiden Variablen
    DatenString
    DatenInteger
    die korrekten Werte übergeben

    Wie aber kann ich soetwas realisieren ???

    MyData.FieldByName('Name').AsString := 'XYZ';
    MyData.FieldByName('Name').AsInteger := 123;

  • #2
    Einen eigenen Rückgabedatentyp definieren der diese Funktionen unterstützt?

    Comment


    • #3
      Überhaupt nicht?

      Was sollte das ergeben?

      Soll das in die Klasse MyData geschrieben werden? -> Getter/Setter
      Christian

      Comment


      • #4
        Was hindert dich daran als Rückgabewert von FieldByName weiterhin TField oder einen Abkömmling von TField zu benutzen? Und wo wir gerade dabei sind wieso ist TMyData nicht einfach eine Ableitung von TDataset? Dann würdest du die Aufrufkonvention zwangsweise beibehalten.

        Comment


        • #5
          Originally posted by Christian Marquardt View Post
          Überhaupt nicht?

          Was sollte das ergeben?

          Soll das in die Klasse MyData geschrieben werden? -> Getter/Setter
          Also überhaupt nicht glaube ich nicht. Den Befehl

          MyData.FieldByName("XYZ").AsString := 'Meine Daten'

          habe ja nicht "erfunden". Den gibt es ja tonnenweise. Den will ich ja ersetzen

          Im Grund will ich verhindern, daß ich die Zeile von Hand wie folgt ändern muß.

          MyData.FieldByName("XYZ", 'Meine Daten');

          Comment


          • #6
            Originally posted by Ralf Jansen View Post
            Was hindert dich daran als Rückgabewert von FieldByName weiterhin TField oder einen Abkömmling von TField benutzen? Und wo wir gerade dabei sind wieso ist TMyData nicht einfach eine Ableitung von TDataset? Dann würdest du die Aufrufkonvention zwangsweise beibehalten.
            Nein, MyData soll nichts mehr mit irgendeiner Datenbank zu tun haben.

            Comment


            • #7
              TDataset hat nicht zwingend mit Datenbanken zu tun sondern ist einfach eine definierte Oberfläche für beliebige Datenquellen. Das kann genauso ein Textfile sein.
              Es würde mich nicht wundern wenn im Netz schon Tausende TCSVDataset's oder TINIDataset's rumlungern.

              Comment


              • #8
                Dann wirst du wohl := überladen müssen
                Christian

                Comment


                • #9
                  Originally posted by Ralf Jansen View Post
                  Was hindert dich daran als Rückgabewert von FieldByName weiterhin TField oder einen Abkömmling von TField zu benutzen? Und wo wir gerade dabei sind wieso ist TMyData nicht einfach eine Ableitung von TDataset? Dann würdest du die Aufrufkonvention zwangsweise beibehalten.
                  Der "Rückgabewert" als Rückgabewert ist ja nicht das Problem. Ich weiß nur nicht, wie ich dem "Rückgabewert" etwas zuweisen kann. Also wie in den folgenden Zeilen:

                  MyData.FieldByName('Name').AsString := 'XYZ';
                  MyData.FieldByName('Name').AsInteger := 123;

                  Wenn ich von TDataset ableite, komme ich doch auch nicht herum, mir ein eigenes FieldByName zu stricken. Dann bin ich ja wieder an der Stelle, an der ich nicht weiter weiß.

                  Comment


                  • #10
                    Wie gesagt := überladen, ist seit Delphi 2006 möglich

                    Nennt sich Operatorenüberladung
                    Christian

                    Comment


                    • #11
                      Originally posted by Christian Marquardt View Post
                      Wie gesagt := überladen, ist seit Delphi 2006 möglich

                      Nennt sich Operatorenüberladung
                      Danke, aber vom Überladen weiß ich ich doch immer noch nicht, was ich dann wirklich programmieren muß.

                      Solche Zeilenaufrufe will ich nicht ändern müssen
                      MyData.FieldByName('Name').AsString := 'XYZ';

                      Das ist meine neue Methode, mit der ich das machen will.
                      function TMyData.FieldByName(const FieldName:String):TField
                      begin
                      ....


                      Die Frage ist, wie kann ich 'XYZ' dem "TField" etwas "zuweisen" oder anders, wie wird das in der Original Methode FieldByName gemacht. In der Unit DB finde ich die Methode zwar, aber wie das in das "TField" hineinkommt, kann ich nicht erkennen. Wobei mir schon bewußt ist, daß TField kein Objekt ist

                      Comment


                      • #12
                        Irgendwie reden wir aneinander vorbei, bzw. ich kann mich nicht ausdrücken

                        Wenn du möchstest, dass das
                        MyData.FieldByName('Name').AsString := 'XYZ';
                        funktioniert muss der Operator := überladen werden

                        D.h.damit ist es dann möglich XYZ dem Object vor der Zuweisung zuzuweisen

                        http://www.delphi-treff.de/tutorials...on-operatoren/
                        Christian

                        Comment


                        • #13
                          Ja, ich glaube wir haben aneinander vorbei geredet.
                          Das werde ich mir mal ansehen. Das könnte es sein.
                          Danke

                          Comment

                          Working...
                          X