Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.15;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
1-48152
Deuss
2002-08-01 19:47
2002.08.15
Помогите, plz...


1-48153
lpp
2002-07-31 11:43
2002.08.15
Как сделать форму для ввода пароля?


14-48249
asafr
2002-07-19 15:43
2002.08.15
Сегодня последний день перед отпуском. Маюсь на работе...


1-48112
GrEG
2002-08-05 13:56
2002.08.15
Сохранение компонента в потоке


6-48222
MoviUm
2002-05-29 16:10
2002.08.15
Как повеситься на порт, как AtGuard ?