Форум: "Основная";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];
Внизне сохраняются SubProperties элементов коллекции Найти похожие ветки
← →
VladP (2002-10-29 17:17) [0]Всем привет! Помогите идеей.
Есть класс А, наследник TCollection, есть класс AItem, наследник TCollectionItem и наконец есть класс L, который является наследником TCustomLabel и в котором опубликованы часть его свойств. Класс X имеет коллекцию A, элементы которой AItem. Одно из свойств класса AItem является объектом класса L. Проблема заключается в том, что свойства класса L не сохраняются в ресурсах формы (*.dfm).
Буду рад любым мыслям. С уважением.
← →
VladP (2002-10-30 05:09) [1]???
← →
Nick N A (2002-10-30 05:37) [2]Как вам удалось вложить ТСustomLabel в класс, у меня в случяях
когда класс является родительским от ТСontrol
Delphi предлагает выбрать любой компонент выше чем ТСontrol,
как в CoolBar1.Bands[0].Control
Находится ли ваше свойство в Published
← →
VladP (2002-10-30 06:33) [3]Код на С++, но разобраться не сложно.
class TRefLabel : public TCustomLabel
{
public:
__fastcall virtual TRefLabel(TComponent* AOwner) : TCustomLabel(AOwner) {AutoSize=false;};
__fastcall virtual ~TRefLabel() {};
__property Parent;
__published:
__property Alignment;
__property Anchors;
__property AutoSize;
__property BiDiMode;
__property Caption;
__property Color;
__property Constraints ;
__property Enabled ;
__property Font ;
__property ParentShowHint ;
__property ShowAccelChar ;
__property ShowHint ;
__property Transparent ;
__property Layout ;
__property Visible ;
__property WordWrap ;
};
//---------------------------------------------------------------------------
class TRefFields;
class TRefTree;
//---------------------------------------------------------------------------
// TRefField
//---------------------------------------------------------------------------
class TRefField : public TCollectionItem
{
private:
AnsiString FFieldName;
TRefFieldType FFieldType;
TRefLabel *FLabel;
TCommonEdit *FEdit;
void __fastcall SetFieldName(AnsiString Value);
void __fastcall SetFieldType(TRefFieldType Value);
public:
__fastcall virtual TRefField(TCollection* collection);
__fastcall virtual ~TRefField();
AnsiString __fastcall GetPrepairedEditValue(void);
void __fastcall SetEditValue(AnsiString text);
AnsiString __fastcall GetDisplayName(void);
void __fastcall SetEditValueType(void);
__published:
__property TCommonEdit* Edit = {read=FEdit};
__property TRefLabel* Label = {read=FLabel};
__property AnsiString FieldName = {read=FFieldName, write=SetFieldName};
__property TRefFieldType FieldType = {read=FFieldType, write=SetFieldType};
};
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// TRefFields
//---------------------------------------------------------------------------
class TRefTree;
class TRefFields : public TCollection
{
private:
TRefField* __fastcall GetItem(int Index);
void __fastcall SetItem(int Index, TRefField* Value);
protected:
DYNAMIC TPersistent* __fastcall GetOwner(void);
virtual void __fastcall Update(TCollectionItem* Item);
public:
TWinControl *Parent;
TRefTree* Owner;
__fastcall virtual TRefFields(TRefTree* owner, TWinControl *parent_of_controls);
__fastcall virtual ~TRefFields();
__property TRefField* Items[int Index] = {read=GetItem, write=SetItem};
};
//---------------------------------------------------------------------------
← →
Юрий Зотов (2002-10-30 09:12) [4]1. Компонентое свойство имеет смысл сохранять только тогда, когда этот компонент создается внутри класса, а не является ссылкой на внешний объект (потому что в последнем случае он сам сохранится, где ему нужно). Кстати, в последнем случае необходимо предусмотреть механизм автоматической очистки ссылки при удалении внешнего компонета - аналог Notification и FreeNotification.
2. Компонентные свойства по умолчанию в DFM не сохраняются (как раз потому, что по умолчанию они считаются ссылками на внешние объекты). Чтобы они сохранялись, в классе AItem перекройте DefineProperties и для каждого такого свойства напишите Read и Write (а в них используйте Read/WriteComponent). Примеры есть в VCL, детали в справке.
← →
VladP (2002-10-30 10:33) [5]Юрий Зотов © (30.10.02 09:12)
Очень признателен за помощь.
← →
VladP (2002-10-31 10:20) [6]Пробы провалились:
Написав следующее имею ошибку Sream read error:
void __fastcall TRefField::DefineProperties(TFiler* Filer)
{
TPersistent::DefineProperties(Filer);
Filer->DefineProperty("Edit", EditRead, EditWrite, true);
};
void __fastcall TRefField::EditRead(TReader *Reader)
{
MessageBox(GetActiveWindow(),"EditRead started","Method",MB_OK);
FEdit = (TCommonEdit*)Reader->ReadComponent(FEdit);
MessageBox(GetActiveWindow(),"EditRead finished","Method",MB_OK);
};
void __fastcall TRefField::EditWrite(TWriter *Writer)
{
MessageBox(GetActiveWindow(),"EditWrite started","Method",MB_OK);
Writer->WriteComponent(FEdit);
MessageBox(GetActiveWindow(),"EditWrite finished","Method",MB_OK);
};
Сообщение "Stream read error" появляется после сообщений "EditReadStarted" и "EditReadFinished".
Помогите советом.
← →
VladP (2002-10-31 10:49) [7]Ой наврал, наврал!
Исправляюсь:
1. Сообщение "Stream read error" появляется при попытке сохранения формы на которой находится компонент хотя бы с одним элементов коллекции (про это вообще ничего не сказал).
2. Таким образом перед появлением ошибки выводятся 2 сообщения "EditWrite Started" и "EditWrite Finished" (неправильно указал сообщения).
Извините торопился...
← →
VladP (2002-10-31 19:59) [8]Не проходите мимо. Помогите советом.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.06 c