Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];

Вниз

Сохранение компонента в потоке   Найти похожие ветки 

 
GrEG   (2002-08-05 13:56) [0]

Доброго всем времени суток.
Написал компонент (TButtonList - Список кнопок). Одним из его свойств является свойство Buttons.


type
TBLButton = class(TComponent)
...
end;

TBLStringList = class(TStringList)
...
end;

TButtonList = class(TCustomControl)
private
FButtons:TBLStringList;
...
published
property Buttons[Index:integer]:TBLButton read GetButton write SetButton;
...
end;



Написал PropertyEditor чтобы в design-time можно было редактировать свойство Buttons (количество кнопок и их свойства).
Эта часть работает нормально.
При сохранении и открытии формы, содержащей TButtonsList не сохраняются и не восстанавливаются сами кнопки. Почитал немножко литературу - переопределил у TButtonList процедуру DefineProperties, добавил процедуры ReadButtons, WriteButtons, читающие и записывающие в поток кнопки. Первоначально попытался воспользоваться методом WriteComponent объекта TWriter для записи параметров кнопок. Результат - 0. В файле dfm сохраняются только скобки, соответствующие вызову процедур WriteListBegin - WriteListEnd, сами параметры кнопок не сохраняются. Если записывать значение каждого из параметров кнопки в поток отдельно (WriteInteger, WriteString), то параметры действительно сохраняются в dfm-файле. В принципе, меня бы устроил и такой вариант, но не удается сохранить значения объектов TFont (их в TBLButton три штуки).
Если не сложно, подскажите в чем дело.


 
Skier   (2002-08-05 14:03) [1]

>GrEG


> переопределил у TButtonList процедуру DefineProperties,
> добавил процедуры ReadButtons, WriteButtons


Хорошо бы код увидеть...


 
Ученик   (2002-08-05 14:04) [2]

Посмотри определение методов
function HasParent: Boolean; override;
function GetParentComponent: TComponent; override;
procedure SetParentComponent(AParent: TComponent); override;
procedure ReadState(Reader: TReader);
например у TField из DB.PAS


 
Skier   (2002-08-05 14:09) [3]

>GrEG

А почему у тебя TStringList используется ?


 
GrEG   (2002-08-05 14:19) [4]

2 Skier:
Первоначально я вообще не создавал наследника от TStringList, а использовал его непосредственно и все работало нормально (объекты TBLButton хранил в Objects). Но потом в этом возникла необходимость (переопределил некоторые методы, добавил свои). Переделывать под коллекцию не стал, хотя, возможно, придется.


procedure TButtonList.DefineProperties(Filer: TFiler);
begin
inherited;
Filer.DefineProperty("btn",ReadBtn,WriteBtn,true);
end;

procedure TButtonList.WriteBtn(Writer: TWriter);
var
i:integer;
begin
Writer.WriteListBegin;
for i:=0 to Count-1 do
WriteComponent(TBLButton(Buttons[i]));
Writer.WriteListEnd;
end;



 
Skier   (2002-08-05 14:25) [5]

>GrEG
Очень подозрительная строка !
WriteComponent(TBLButton(Buttons[i]));

Нужно так (если хочешь писать объекты)
WriteComponent(TBLButton(Buttons.Objects[i]));

А вообще - заменил бы ты лучше TStringList на свой
потомок TList-а...





 
Skier   (2002-08-05 14:26) [6]

>GrEG
Да ! И ещё : почему
Filer.DefineProperty( "btn",ReadBtn,WriteBtn,true);
А не
Filer.DefineProperty( "Buttons",ReadBtn,WriteBtn,true);

!!!???



 
GrEG   (2002-08-05 14:28) [7]

у-п-с. Очепятка.


procedure TButtonList.WriteBtn(Writer: TWriter);
var
i:integer;
begin
Writer.WriteListBegin;
for i:=0 to Count-1 do
Writer.WriteComponent(TBLButton(Buttons[i]));
Writer.WriteListEnd;
end;


 
GrEG   (2002-08-05 14:38) [8]

В TButtonList Buttons объявлен как

TButtonList = class(TCustomControl)
private
FButtons:TBLStringList;
...
published
property Buttons[Index:integer]:TBLButton read GetButton write SetButton;
...
end;

Метод GetButton возвращает объект из TBLStringList.Objects. Не очень важно как получен объект. Важно, что TBLButton действительно передается в метод WriteComponent.
Относительно "btn" <> "Buttons". В DefineProperties объявляются свойства, не присутствующие в секции published, но сохранять которые необходимо. Таким образом я пытаюсь заставить Delphi сохранять свойство Buttons. А как будет называться это фиктивное свойство - без разницы. Реально я работаю с Buttons.


 
Skier   (2002-08-05 14:45) [9]

>GrEG
Проверь : выполняется ли у тебя тело цикла вообще...


 
GrEG   (2002-08-05 14:47) [10]

Да, выполняется.
Как я писал выше, если сохраняю отдельные свойства кнопок через WriteInteger, WriteString, то они корректно записываются в dfm-файл.


 
Skier   (2002-08-05 14:52) [11]

>GrEG
А кто и тебя владеет кнопками и про св-во
Parent тоже интересно узнать...


 
GrEG   (2002-08-05 15:02) [12]

Добавление новой кнопки

function TBLStringList.InsertButton(Index: integer): TBLButton;
begin
Result:=TBLButton.Create(FBL);
if not Assigned(Result) then exit;
InsertObject(Index,"",Result);
FBL.UpdateScrollBar;
FBL.RepaintButton(Result);
end;




TBLButton = class(TComponent)
private
FButtonList:TButtonList;
FState:TBLButtonState;
FAlignment:TAlignment;
FCaption:string;
FChecked:boolean;
FColor:TColor;
FFont:TFont;
FFontCheck:TFont;
FFontHighlight:TFont;
FHeight:integer;
procedure OnFontChange(Sender:TObject);
procedure OnFontSelectChange(Sender:TObject);
procedure OnFontHighlightChange(Sender:TObject);
procedure SetAlignment(AAlignment:TAlignment);
procedure SetCaption(ACaption:string);
procedure SetChecked(AChecked:boolean);
procedure SetColor(AColor:TColor);
procedure SetFont(AFont:TFont);
procedure SetFontCheck(AFont:TFont);
procedure SetFontHighlight(AFont:TFont);
procedure SetHeight(AHeight:integer);
protected
property ButtonList:TButtonList read FButtonList;
public
constructor Create(AButtonList:TButtonList);
destructor Destroy;override;
function HasParent:boolean;override;
function GetParentComponent:TComponent;override;
procedure SetChecked_(AChecked:boolean);
property State:TBLButtonState read FState write FState;
published
property Alignment:TAlignment read FAlignment write SetAlignment;
property Caption:string read FCaption write SetCaption;
property Checked:boolean read FChecked write SetChecked;
property Color:TColor read FColor write SetColor;
property Height:integer read FHeight write SetHeight;
property Font:TFont read FFont write SetFont;
property FontCheck:TFont read FFontCheck write SetFontCheck;
property FontHighlight:TFont read FFontHighlight write SetFontHighlight;
end;


...


function TBLButton.HasParent: boolean;
begin
Result:=true;
end;

function TBLButton.GetParentComponent: TComponent;
begin
Result:=ButtonList;
end;



 
Skier   (2002-08-05 15:07) [13]

>GrEG
Давай лучше так (т.к. вопросы остаются...) :
высылай мне по почте свой компонент - попробую помочь...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.006 c
6-48241
Arhangel
2002-05-31 17:41
2002.08.15
Http


6-48232
Ron
2002-06-03 21:45
2002.08.15
SMTP


1-48103
Link
2002-08-05 13:20
2002.08.15
Указатель в виде песочных часов


1-48187
Не зарегистрированный чайник
2002-08-01 20:21
2002.08.15
Вопросик возник


3-47997
Alfred
2002-07-27 17:19
2002.08.15
Ошибка





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский