Zur Laufzeit Objekt erstellen



  • Morgen.

    Ich weiss wie man neue Komponenten erstellt, aber ich verstehe momentan nicht folgenden Delphi Code.

    Es gibt von dem Block verschiedene Dinge. Wie Linien, Rechtecke und Kreise.
    Ich möchte einen vorhandenen Block kopieren, aber komme mit dem Delphi Syntax nicht klar.

    Normalerweise:

    var
      L: Block;
    begin
      L := Line.Create(nil);
    

    Daraus mache ich in CBuilder

    Block *L = new Ddoc::Line(BlockEditor->Document);
    

    BlockEditor->Document sagt im das er in dieser Komponente plaziert werden soll und klappt auch

    Probleme habe ich jetzt mit diesem Code

    BlockClass = class of Block;
    
    procedure Block.CopyFrom(Source: Block);
    var
      S: Block;
    begin
      S := BlockClass(Source.ClassType).Create(nil);
    

    Wie hat die letzte Zeile denn in C++ auszusehen? Kann da wer helfen?



  • Der Delphi Code sagt mir nicht viel, was soll es denn bewirken?



  • ClassType gehört wohl zu CBuilder/Delphi: "ClassType gibt die Klassenreferenz der Objektklasse zurück."

    Wie schon gesagt kann der Block eine Linie,Rechteck oder Kreis sein. Das sind seine Klassen und dieses ClassType erzeugt einen neuen Block mit der Klasse des im Funktionskopf übergebenen Musterblock den ich ja kopieren möchte und anschliessend bearbeiten.

    Das heisst, ich muss nicht wissen von welcher Klasse der übergebene Block kommt, um ihn entsprechend zu erstellen, sondern er macht gleich daraus den richtigen Block mit der richtigen Klasse von Block Source.



  • Die erste Zeile ist in Ordnung, nunja, jedenfalls kein compiler Fehler 😉
    Aber wie kann ich das jetzt in Zeile 2 einbinden? So wie jetzt ist es falsch...

    TClass ClassRef = Source->ClassType();
    Block *block = new (ClassRef*)(BlockEditor->Document);
    


  • Ist Delphi soweit CBuilder überlegen das das garnicht geht? Wau! Ich glaub ich steige lieber komplett um. 🙄



  • Du wirfst hier Codebrocken von völlig unbekannten Klassen oder Komponenten hin und wunderst dich, dass dir niemand helfen kann?



  • Hat das nicht ausgereicht? *verdutzt guck* Ich wüsste jetzt garnicht was da jetzt noch schreiben müsste.
    Man bekommt eine Komponente und soll anhand dieser ein Dublikat erstellen.

    Wie man dessen Klasse rausbekommt habe ich schon rausgefunden

    TClass ClassRef = Source->ClassType();
    AnsiString Name = ClassRef->ClassName();
    

    Aber was fange ich damit an, um eine Komponente dieser Klasse zu erstellen?

    Block = class(TComponent)
    end;
    
    BlockClass = class of Block;
    
    Rect = class(Block)
    end;
    
    Ellipse = class(Block)
    end;
    

    In C++ mach ich dann entweder

    Block *L = new Ddoc::Rect(BlockEditor->Document);
    Block *L = new Ddoc::Ellipse(BlockEditor->Document);
    

    Und ich würde jetzt gerne wissen, wie man das zusammenfassen kann, so das ich einen Block bekomme und egal ob er ein Rect oder Ellipse ist eine Kopie von erstellen kann. 🤡

    Bitte bitte helfen 🙂


Anmelden zum Antworten