mal wieder was zu ReadComponent



  • Hast Du schon mal versucht, TestForm nicht per new zu erstellen?
    Die Form soll ja schließlich geladen werden (wobei ich den Sinn
    dahinter nicht verstehe).
    Also, z.B.:

    void __fastcall TForm1::laden1Click(TObject *Sender)
    {
            TForm2 *TestForm; //=new TForm2(this);
            TestForm->Parent = this;
            RegisterClass(__classid(TScrollBox));
            if(LoadComponentFromFile("Basis", TestForm))
            TestForm->Show();
    }
    

    Gruß,

    Alexander



  • hab auch ohne das Formular zu erzeugen probiert das Objekt aus der Datei zu laden. Der Effekt bleibt der selbe 😞



  • Hast Du auch schon mal versucht, TestForm einen anderen Typ zu geben?
    Wenn Du TestForm vom Typ TForm2 hast, dann ist natürlich automatisch
    auch Deine ScrollBox darauf.
    LoadComponent funktioniert dann aber nur, wenn TForm2 dem ClassLoader bekannt
    ist.

    TForm *TestForm;
    

    Gruß,

    Alexander



  • so, ich erzeuge jetzt die Komponenten zur Laufzeit. dann wird es ja korrekt hin und hergespeichert. Das Problem was jetzt noch bleibt ist, wie ich die in Behälter eingebetteten Objekte mit speichern kann. Bsp.: TImage in TScrollbox wird nicht mitgespeichert auch wenn ich es als Subkomponente freigebe.
    Wenn jemand dafür 'ne Lösung hätte...



  • Sprotti schrieb:

    so, ich erzeuge jetzt die Komponenten zur Laufzeit.

    Vielleicht kannst Du mal zeigen, wie Du das machst.

    Sprotti schrieb:

    dann wird es ja korrekt hin und hergespeichert.

    Daran habe ich Zweifel.

    Sprotti schrieb:

    Das Problem was jetzt noch bleibt ist, wie ich die in Behälter eingebetteten Objekte mit speichern kann.

    Das verstärkt meine Zweifel noch.

    Wenn Du das Ganze so angehst, wie Du's oben schon mal gezeigt hast - also
    Instanziierung eines Objekts vom Typ TForm2 - dann vermute ich, daß zu diesem
    Zeitpunkt schon eine TScrollBox-Komponente auf Deinem Formular existiert.
    (Das läßt sich überprüfen, indem Du mal alles nach der Erzeugung wegläßt und
    das Objekt mit WriteComponent() speicherst)
    Wenn Du später die Komponente schreibst, bekommst Du (vermutlich) mehr oder
    weniger eine Kopie Deiner DFM-Datei von TForm2.
    Um das zu überprüfen, könntest Du mal ein Formular-Objekt vom Standardtyp TForm
    erstellen und den Rest wie gehabt lassen. Wenn dann in der gespeicherten Datei
    die ScrollBox-Komponente fehlt, stimmen meine Vermutungen wahrscheinlich. Ist
    die Komponente vorhanden, dann kannst Du ja mal noch mit InsertComponent() rum-
    experimentieren.
    Vielleicht liege ich mit meinen Vermutungen daneben, aber einen Versuch ist's
    ja wert, wenn Du Dich schon so lange damit beschäftigst.

    Gruß,

    Alexander



  • habe es auch mit TForm probiert. Auch hier erhalte ich eine Fehlermeldung.

    ... eine Exception der Klasse EReadError aufgetreten. Meldung: 'Ungültiger Eigenschaftswert'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

    @Alexander: Deine Zweifel sind unbegründet. Wenn ich die Komponenten so wie oben erzeuge, wird Form und Scrollbox korrekt gespeichert und geladen. Nur das Image eben nicht.

    ... vermute ich das zu diesem Zeitpunkt schon eine Scrollbox existiert

    das Form2 ist zu diesem Zeitpunkt komplett leer. (könnte also auch TForm sein)

    Hier noch die gespeicherte Datei

    object Basis: TForm2
      Left = 0
      Top = 0
      Width = 682
      Height = 385
      Caption = 'Basis'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      FormStyle = fsMDIChild
      OldCreateOrder = False
      Visible = True
      OnClose = FormClose
      PixelsPerInch = 96
      TextHeight = 13
      object TScrollBox
        Left = 0
        Top = 0
        Width = 185
        Height = 41
        TabOrder = 0
      end
    end
    


  • Die Fehlermeldung ist ja relativ eindeutig und läßt für mich nur drei
    Interpretationen offen:
    Im Falle, daß das Objekt (=Formular-Variable), in das Du die Komponente lädst,
    keine Komponente mit Namen ScrollBox1 enthält:
    1. Deine Lade-Routinen enthalten einen Fehler (weiß ich nicht - kenne Deinen
    Quellcode nicht) und Du lädst aus irgendwelchen Gründen die Komponente zweimal.
    2. Die Lade-Routinen von Borland haben einen Bug (aus meiner eigenen Erfahrung
    mit den Routinen relativ unwahrscheinlich) und laden die Komponente zweimal.

    Andernfalls:
    3. Das Objekt (=Formular-Variable), in das Du die Komponente lädst enthält bereits
    eine Komponente mit Namen ScrollBox1 und Du hast noch irgendwas übersehen.

    Kann natürlich sein, daß es noch andere Interpretationen gibt, aber ich sehe keine
    anderen. Möglichkeit 2 ist die bequemste, da dies bedeuten würde, daß Du keinen
    Fehler gemacht hast. Leider würde Dich das nicht weiterbringen und es würde mich
    sehr verwundern, wenn in so grundlegenden Dingen ein Bug drin wäre.
    Also würde ich empfehlen, Dich auf die anderen Möglichkeiten zu stürzen.
    Mein heißer Favorit ist nach wie vor 3. - auch wenn Du das vollkommen ablehnst.

    Gruß,

    Alexander



  • Ich habe gerade mal die von Dir generiert Objekt-Datei in einem Testprogramm
    von mir ausprobiert und konnte das Formular ohne Fehler laden. Dabei lösche
    ich allerdings beim Einlesen die Event-Behandlungsroutinen und benenne den
    Formulartyp in TForm - also den Standardtyp - um.

    Gruß,

    Alexander



  • Habe gerade gesehen, daß Du noch was in Deinem posting ergänzt hast.

    Sprotti schrieb:

    habe es auch mit TForm probiert. Auch hier erhalte ich eine Fehlermeldung.

    ... eine Exception der Klasse EReadError aufgetreten. Meldung: 'Ungültiger Eigenschaftswert'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

    Das liegt wahrscheinlich an der Zeile

    FormStyle = fsMDIChild
    

    in Deiner Objekt-Datei. Entweder mußt Du die Form von einem MDI-Fenster aus
    laden oder die Zeile beim Einlesen löschen.

    Gruß,

    Alexander



  • Hallo, habe das Problem jetzt endlich gelöst. Der Grund für die Fehlermeldung das die Objekte die ich reinladen wollte schon vorhanden wären, lag wirklich daran, daß die Komponenten nicht aus der .dfm Datei gelesen werden durften. Das erreicht man durch den Form Konstruktor TForm(Owner, Dummy). Hierbei dient der Dummy nur zur Unterscheidung der Konstruktoren.
    Vielen Dank an alle Hilfsbereiten 👍


Anmelden zum Antworten