Announcement

Collapse
No announcement yet.

Eigene Frames ableiten

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

  • Eigene Frames ableiten

    Hi,

    ich schlage mich mit OOP und Frames rum! Dabei habe ich glaube ich irgendetwas nicht verstanden!!!

    Ich habe mir folgendes Modell zusammengebastelt (noch alles leere Klassen):<br>

    TEndFrame<br>
    |<br>
    TSourceFrame<br>
    |<br>
    TFrame<br>

    TEndFrame und TSourceFrame sind in zwei Units aufgeteilt die nicht einem Projekt zugeordnet werden. Das TEndframe soll(!!) in einem Formular (dem Hauptprogramm) erzeugt und einer Scrollbox zugewiesen werden.
    <br>
    <pre><code>
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    MyFrame := tEndframe.Create(Self);
    MyFrame.Parent := scrollbox1;
    end;
    <br>
    Aber swoeit kommt es gar nicht! Schon beim Create bricht das Programm ab und meldet den folgenden Fehler: <br>

    <b>Fehler beim lesen von EndFrame.OldCreateOrder: Eigenschaft existiert nicht.</b>
    <br>
    Irgendwo in den Tiefen von Delphi (nachdem ich bei Assembler gelandet bin) habe ich erst mal aufgegeben !!!!

    Kann mir irgendjemand eine Hilfe geben

    Vielen Dank im voraus
    gruss stephan

  • #2
    Hallo Stephan!

    Ich habe eben mal Dein Projekt nachgebastelt. Munter zwei Frames erstellt, der eine erbt vom anderen und das ganze dann zur Laufzeit ins Projekt eingefügt. Das klappt wie geschmiert.

    Die Eigenschaft OldCreateOrder existiert erst ab TCustomForm. TFrame erbt aber von TScrollingWinControl. Wie sieht es denn mit dem Formulardateien Deiner Klassen aus? Gibt es die überhaupt und hast Du vielleicht normale Fenster einfach umbenannt. Da steht nämlich im Stream OldCreateOrder drin und könnte die VCL-Mühle durcheinander bringen.

    Viel Erfolg

    OLL

    Comment


    • #3
      Hallo Anke,

      vielen Dank für den Test. Aber beim ersten mal hat das bei mir auch geklappt! Dann habe ich das Projekt zugemacht und wieder geöffnet und das ganze hat nicht mehr funktioniert!!<br>
      Als Vorlage für meine Frames habe ich direkt das aus dem Menü <i>Datei|Neuer Frame</i> genommen.<br>
      Aber ich gehe noch mal auf die Suche nach der Framehierachie!
      <p>
      vielen dank schon mal
      stepha

      Comment


      • #4
        Hallo nochmal,

        ich habe mich gerade durch die Objekthierachie durchgearbeitet und die DFM-Dateien mal angeschaut und welch Wunder:<br>
        In der DFM-Datei von tEndFrame sind zusätzlich zu den normalen Eigenschaften von Frames die Eigenschaften von <b> Formularen </b> (wie. Font. , <b> OldCreateOrder</b>, PixelsPerInch, TextHeight).

        Ich habe diese Werte direkt aus der DFM Datei gelöscht und sie neu in Delphi geladen. Beim Kompilieren der Sourcecodes hat Delphi aber wieder automatischen diese Werte mit eingefügt!!!!!

        Und dann wieder den alten Fehler erzeugt! Kein Wunder es wird ja auch ein Wert (OldCreateOrder) aus dem Stream gelesen der gar nicht in das eigentliche Objekt reingehört!!!! Also beim erzeugen (OOP) erkennt Delphi anscheinend schon das tEndFrame ein Frame ist und kein Form!

        Hilfe, wie bringe ich das dem Delphi bei?<br>
        Stepha

        Comment


        • #5
          HY Stephan!

          Hab jetzt Deinen Fehler nachvollziehen können. Und zwar liegt es daran, daß Dein Frame sich nicht direkt von TFrame ableitet. Offensichtlich speichert die IDE den dann als stinknormales Fenster.

          Also Projekt umstellen und die falschen Einträge aus der DFM-DAtei rauswerfen! Dann startet Dein Proggi wieder durch.

          Viel Erfolg

          OLLI

          Ps.: Schau doch mal bei www.Spotlight.de ins Delphi-Form. Da iss mehr Betrieb als hier

          Comment


          • #6
            Hallo, <p>
            wenn ich <br>
            <B>... die falschen Einträge aus der DFM-DAtei rauswerfen ... </B><br>
            dann muss ich immer wieder in die DFM-Datei rein und diese bearbeiten.<p>
            Einfacher gehts, wenn folgendes in der abgeleidenden Klasse vorgenommen wird<br>
            type<br>
            TDWframe = class(TCustomFrame)<br>
            { Private-Deklarationen }<br>
            private<br>
            m_OldCreateOrder : Boolean;<br>
            m_PixelsPerInch : Integer;<br>
            m_TextHeight : Integer;<br>
            ...<br>
            published<br>
            property OldCreateOrder : Boolean read m_OldCreateOrder write m_OldCreateOrder;<br>
            property PixelsPerInch : Integer read m_PixelsPerInch write m_PixelsPerInch;<br>
            property TextHeight : Integer read m_TextHeight write m_TextHeight;<br>
            <br>
            <br>
            Gruesse<br>
            Dietmar<br&gt

            Comment


            • #7
              Anderer Tipp:
              <p>
              in der DFM-Datei:<br>
              1. "object" durch "inherited" ersetzen, also z.B. statt "object MyFrame1: TMyFrame" -> "inherited MyFrame1: TMyFrame"<br>
              2. die nicht existierenden Eigenschaften wie "OldCreateOrder" usw. löschen<br>
              funktioniert zumindest unter D7 einwandfrei

              Comment

              Working...
              X