Komponente zum statischen Speichern von TStringList

St0fF

Grünschnabel
Hi Leute!

Ich hab gerade eine Wrapper-Komponente für TStringList geschrieben, da ich in einem Programm ein paar statisch feststehende Stringlisten haben will - bringt mir nicht die LoadFromFile-Idee, die .exe soll komplett standalone alles beinhalten.

Die Komponente sieht in etwa so aus:
Code:
class PACKAGE TStringDings : public TComponent
{
private:
    TStringList *FList;
    void __fastcall SetCapacity(int value);
    int __fastcall GetCapacity();

    [... - die Property-Wrapper-Routinen]

protected:
public:
    __fastcall TStringDings(TComponent* Owner);
    __fastcall ~TStringDings();
    TStringDings & operator = (TStringDings &);

    int __fastcall Add(const AnsiString);
    int __fastcall AddObject(const AnsiString S, System::TObject* AObject);
    void __fastcall Clear();

[... die Wrapper für TStringList-Methoden (also alle, die aus TStringList und TStrings kommen, ab TPersistent habe ich nichts weiter gewrapped)]

    __property int Capacity  = { read=GetCapacity, write=SetCapacity };
    __property int Count  = { read=GetCount };
    __property System::TObject * Objects[int Index]  = { read=GetObjects, write=SetObjects };
    __property AnsiString Strings[int Index]  = { read=GetStrings, write=SetStrings };
    __property AnsiString CommaText  = { read=GetCommaText, write=SetCommaText };
    __property AnsiString DelimitedText  = { read=GetDelimitedText, write=SetDelimitedText };
    __property AnsiString Names[int Index]  = { read=GetNames };
    __property AnsiString Values[AnsiString Name]  = { read=GetValues, write=SetValues };
    __property AnsiString Text  = { read=PropGetText, write=PropSetText };
__published:
    __property TStringList * List  = { read=FList, write=FList };
    __property bool CaseSensitive  = { read=GetCaseSensitive, write=SetCaseSensitive };
    __property TDuplicates Duplicates  = { read=GetDuplicates, write=SetDuplicates };
    __property bool Sorted  = { read=GetSorted, write=SetSorted };
    __property char Delimiter  = { read=GetDelimiter, write=SetDelimiter };
    __property char QuoteChar  = { read=GetQuoteChar, write=SetQuoteChar };
    __property TNotifyEvent OnChange  = { read=GetOnChange, write=SetOnChange };
    __property TNotifyEvent OnChanging  = { read=GetOnChanging, write=SetOnChanging };
};
Nun die wichtigen Teile des eigentlichen Quelltexts:
Code:
#include <basepch.h>
#pragma hdrstop
#include "StringDings.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
static inline void ValidCtrCheck(TStringDings *)
{
    new TStringDings(NULL);
}
//---------------------------------------------------------------------------
__fastcall TStringDings::TStringDings(TComponent* Owner)
    : TComponent(Owner)
{
    SetParentComponent(Owner);
    FList = new TStringList();
}
//---------------------------------------------------------------------------
namespace Stringdings
{
    void __fastcall PACKAGE Register()
    {
         TComponentClass classes[1] = {__classid(TStringDings)};
         RegisterComponents("St0fFzeuch", classes, 0);
    }
}
//---------------------------------------------------------------------------
TStringDings & TStringDings::operator = (TStringDings &other)
{
    if(FList) delete FList;
    FList = new TStringList(*other.FList);
    return *this;
}
Soweit so gut. Klingt ja erstmal nach der einfachst möglichen nonvisuellen Komponente. Jetzt kommt aber der Haken. Wenn ich die Komponente einfach auf ne Form droppe, geht das erstmal. Der Property-Editor zeigt mir auch alle __published Properties an.
Sobald ich jedoch die Porperty "List" per TStrings-Editor editiere - geht das zwar erstmal gut, aber danach gibt mir der BCB6 nur noch Fehler á la "access violation somewhere in rtl60.bpl. Read of <some adress>." Kompilieren nicht möglich, weitere Funktionen hinzufügen auch nicht ...

Ich hab schon etwas herumgespielt: wenn ich einige Properties (z.B.: Text ->wrapped um TStringList->Text) public deklariere, gehen einige Fehler weg. Also hab ich wirklich alle zur Designzeit unnötigen Properties public deklariert. Aber ich mein, wenn ich so ne Komponente bastele, will ich die ja auch überall einsetzen können und nich nur für meine Zwecke, für die ich sie erstellt hab. Deshalb sind alle __published Properties dort, die kann man schliesslich alle zur Designzeit brauchen...

Hat vielleicht jemand ne Idee, warum der BCB hier so bsartig rummeckert bzw. sobald der Property-Editor für "List" benutzt wurde im Endeffekt abschmiert? Für jegliche Hilfe wäre ich dankbar...

Beste Grüße,
St0fF

P.S.: Hilfe würde mit meinen >funktionierenden< Komponenten belohnt ;)
... darunter: TServiceControl, TDirectoryMonitor, TDirChangeReader, TxtGauge (in einer Gauge Text anzeigen, wenn nötig auch den Fortschritt innendrin -sehr hilfreiche Gauge ... möglich wäre beispielsweise diese Anzeige in der Gauge: "der Fortschrit von 52,346% wurde bisher erreicht"), Texcelfile (zum Einlesen von xls-workbooks ohne Excel installiert haben zu müssen), TIniCfgFile (war Blödsinn, diese Komponente zu basteln, dafür gibbs ja schon ein BCB-Template (hab ich erst danach gesehen)), TDxxImage (zum Handlen von Commodore C64 - Diskimage-Dateien)
 
Update ...

Ich hab jetzt mal den private Memver zum Typen TStrings umdeklariert, im Constructor trotzdem mit TStringList initialisiert. Nun bekomme ich eine "Illegal Pointer Operation" direkt nach dem Editieren mit dem TStringsPropertyEditor. Ich verstehs immernoch nicht.

St0fF
 
Zurück