eigene komponente mit stringlist
-
hallo,
folgendes:
in meiner selbst entwickelten komponente möchte ich gerne eine stringlist benutzen, die ich auch im OI anzeigen möchte ähnlich dem Memo->Lines.
wie bekomme ich diese im OI?
im private bereich habe ich TStringList *liste; eingebunden, jedoch weiss ich nicht recht, wie ich diese im OI reinbekomme?
der published-teil macht mir sorgen.
gruß gerd
-
Hast Du sowas schon mal probiert?
__published: __property TStrings* StringList = {read = FStringList, write = FStringList};Sollte im Objektinspektor automatisch angezeigt werden.
Gruß,
Alexander
-
nein, aber ich bekomme es so nicht hin!
habe auch erst damit angefangen:
header:
class PACKAGE TDTAus : public TComponent { private: AnsiString sDateiName; protected: public: __fastcall TDTAus(TComponent* Owner); AnsiString __fastcall GetDateiName(void); void __fastcall SetDateiName(AnsiString Name); TStringList *FStringList; __published: __property String DateiName= {read=GetDateiName, write=SetDateiName}; __property TStrings* StringList = {read = FStringList, write = FStringList}; };wäre das so falsch?
gruß gerd
-
Sieht doch ganz vernünftig aus, allerdings würde ich die Variablen alle private machen.
Gibt's damit Probleme?Gruß,
Alexander
-
kompilieren kann er es ja, allerdings wenn ich hinterher in der komponente die stringlist editieren möchte, kommt eine fehlermeldung:
"nil kann nicht zu TRichEditStrings zugewiesen werden"
was läuft hier verkehrt?
gruß gerd
-
Denkst du auch daran die StringList zu erstellen?
-
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}; }; //--------------------------------------------------------------------------- #endifcpp
//--------------------------------------------------------------------------- #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