eigene komponente mit stringlist



  • im kontruktor, oder wie meinst du das?

    gruß gerd



  • jo, wo denn sonst?



  • ok, danke, werde es mal probieren

    gruß gerd



  • soweit klappt es ja, nur bekomme ich jetzt immer "zugriffsverletzung..."

    sowie ich die komponente einbinde?!

    hier der komplette code:

    h

    //---------------------------------------------------------------------------
    
    #ifndef DTAusH
    #define DTAusH
    //---------------------------------------------------------------------------
    #include <SysUtils.hpp>
    #include <Controls.hpp>
    #include <Classes.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class PACKAGE TDTAus : public TComponent
    {
    private:
        AnsiString sDateiName;
        TStringList *FStringList;
    
    protected:
    public:
        __fastcall TDTAus(TComponent* Owner);
        __fastcall ~TDTAus(void);
        AnsiString __fastcall GetDateiName(void);
        void __fastcall SetDateiName(AnsiString Name);
    
    __published:
        __property String DateiName= {read=GetDateiName, write=SetDateiName};
        __property TStringList* StringList = {read = FStringList, write = FStringList};
    };
    //---------------------------------------------------------------------------
    #endif
    

    cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "DTAus.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    // ValidCtrCheck wird benutzt, um sicherzustellen, daß die erzeugten Komponenten
    // keine rein virtuellen Funktionen besitzen.
    //
    
    static inline void ValidCtrCheck(TDTAus *)
    {
        new TDTAus(NULL);
    }
    //---------------------------------------------------------------------------
    __fastcall TDTAus::TDTAus(TComponent* Owner)
        : TComponent(Owner)
    {
        FStringList = new TStringList();
    }
    
    //---------------------------------------------------------------------------
    __fastcall TDTAus::~TDTAus(void)
    {
        delete FStringList;
    }
    
    //---------------------------------------------------------------------------
    namespace Dtaus
    {
        void __fastcall PACKAGE Register()
        {
             TComponentClass classes[1] = {__classid(TDTAus)};
             RegisterComponents("Media-CT", classes, 0);
        }
    }
    //---------------------------------------------------------------------------
    AnsiString __fastcall TDTAus::GetDateiName(void)
    {
        return sDateiName;
    }
    
    //---------------------------------------------------------------------------
    void __fastcall TDTAus::SetDateiName(AnsiString Name)
    {
        sDateiName = Name;
    }
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    

    noch ne idee?

    gruß gerd



  • ok ok,

    mein konstruktor war murx! 🙂

    danke euch beiden erstmal für die hilfe, super! 🙂

    gruß gerd



  • shit,

    klappt immer noch nicht ganz.

    meine änderungen sind jetzt soweit, dass ich das void bei dem kontruktor entfernt habe.

    ich kann eine anwendung unter benutzung dieser kompo starten, allerdings wenn ich über dem OI werte in die liste schmeisse, dann lässt sich meine anwenung nicht mehr starten (also mit vorgefütterten TStringList) dann kommt wieder eine "zugriffsverletzung...." 😞

    weiss jemand was da wieder falsch läuft?

    gruß gerd



  • Hmm... es gibt eine Möglichkeit abzufragen ob der Code in Design oder in Runtime ausgeführt wird. Vielleicht hilft es ne Abfrage zu machen und die Stringlist nur erstellen wenn DesignTime ist.

    Ne anderen Möglichkeit wäre auch nur die Liste zu erstellen wenn noch keine Existiert.

    Aber ob das überhaupt das Problem ist kann ich net sagen.



  • also es liegt definitiv an der liste, deine sache glaube ich ja, zudem viele kompos daraus entscheiden, ob sie free laufen, oder ob ein dialog eingeblendet wird. nur an der umsetzung meinerseits hapert deine lösung!

    gruß gerd



  • Also die Eigenschaft ist ComponentState. Such mal in der Hilfe danach.



  • ok, danke erstmal, jedoch habe ich dann nach wie vor das gleiche problem, ich kann zur designzeit nicht die liste füttern, was jedoch gerade erwünscht ist. danach bekomme ich beim starten ne zugriffsverletzung, jedoch keine ahnung, warum.

    gruß gerd



  • hat vielleicht schon jemand mal eine komponente mit einer stringlist geschrieben, wo er mir eventuell mal zeigen kann, wie es gelöst wurde?

    oder ist an meinem konstruktor / destruktor etwas falsch?

    gruß gerd



  • http://www.marquardtnet.info/cecke/komponenten.2/2_extendedstringgrid.html

    Schau nach

    __property TStringList* FixedColsText = { read=FFixedColsText, write=SetFixedColsText,stored=true};
    __property TStringList* FixedRowsText = { read=FFixedRowsText, write=SetFixedRowsText,stored=true};



  • komisch, in der komponente ist alles so, wie in meiner, jedoch frage ich mich, warum es bei mir nicht läuft. er speichert bei mir auch die werte nicht im stringlist, wenn ich diese über den OI vorweg eingebe.

    danach habe ich gesehen, dass in christians kompo noch ein

    stored=true

    enthalten war, voller hoffnungsschimmer dachte ich ok, versuchst du es mal, aber fehlanzeige, klappt immer nur noch so.

    warum zum kuckuck klappt das denn nicht so? *kopfkratz*

    gruß gerd



  • hallo zusammen,

    hat irgendjemand mal kurz zeit mir eine komponente abgeleitet von tcomponent zu erzeugen, welche eine stringlist beinhaltet, die man per Objekt inspektor füttern kann, und kann mir dann den header und cpp-code mal zeigen?

    ich will wirklich nur ausschließen, das ich nen fehler mache.

    christians package bekomme ich nicht installiert, weil er irgendetwas mit <b...> inkludiert, was mein c++builder nicht kennt.

    meinen code seht ihr ja, also implementiert habe ich das jetzt so ca. 500 mal, und abgewandelt in allen erdenklichen formen (ob sinnvoll, oder nicht) aber es klappt einfach nicht.

    sowie ich die kompo registriere und auf eine form setze, geht alles noch einwandfrei, ich kann es kompilieren und starten. per code kan ich die stringlist auch füttern und auslesen. jedoch wenn ich es über den ObjektInspektor füttere klappt folgendes nicht mehr:

    • es ist nach erneuten bearbeiten der stringlist über den OI wieder leer.
    • programm lässt sich nicht mehr kompilieren
    • kann auch nicht mehr speichern

    meine E-Mail Adresse: falls ihr es mir zumailen wollt:

    bahl[at]media-ct.de

    gruß gerd



  • Also ich habe das mal eben bei mir mit dem C++Builder 4 ausprobiert - und siehe da:
    Es funktioniert tatsächlich nicht. Speichern ist wegen Fehlermeldung nicht mehr möglich.
    Nach ein bisschen Rumprobieren habe ich jetzt eine (zumindest bei mir) funktionierende Lösung
    gefunden:

    // Header
    class PACKAGE TMyComponent : public TComponent
    {
    private:
       TStringList* FStringList;
    
       TStringList* __fastcall getStringList();
       void __fastcall setStringList(TStringList* Value);
    protected:
    public:
       __fastcall TMyComponent(TComponent* Owner);
    __published:
       __property __fastcall TStringList* StringList = {read = getStringList, write = setStringList};
    };
    
    // Implementierung
    __fastcall TMyComponent::TMyComponent(TComponent* Owner)
       : TComponent(Owner),
       FStringList(new TStringList())
    {
    }
    
    TStringList* __fastcall TMyComponent::getStringList()
    {
       return FStringList;
    }
    
    void __fastcall TMyComponent::setStringList(TStringList* Value)
    {
       FStringList->Assign(Value);
    }
    

    Warum die andere Lösung nicht funktioniert, weiß ich nicht. Meiner Meinung nach spricht nichts dagegen.
    Wäre mal interessant zu testen, ob das im BCB 6 funktioniert.

    Gruß,

    Alexander



  • ich danke dir, somit klappt es wenigstens einwandfrei. aber ganz ehrlich, auf die idee, wäre ich nie gekommen, dafür kenne ich mich mit dieser art zu wenig mit klassen aus! 🙂

    gruß gerd


Anmelden zum Antworten