Форум: "Основная";
Текущий архив: 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