Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.011 c
1-34104
_Nicola_
2002-10-31 15:35
2002.11.11
Объясните фокус с PChar


4-34307
comp
2002-10-02 09:37
2002.11.11
Как заархивировать...


1-34101
Sergy
2002-10-31 15:22
2002.11.11
Динамический массив. Найти индекс по значению


6-34149
Freeze
2002-09-13 09:53
2002.11.11
Помогите!!! ПЛИЗЗЗ!!!


1-34015
dimonf
2002-11-02 12:53
2002.11.11
Как редактировать файл ресурса с расширением *.res?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский