Форум: "Компоненты";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];
ВнизРаботает в disigntime но не работает в runtime Найти похожие ветки
← →
TStas © (2005-09-10 00:17) [0]Написал подобие TRgroupBox"а, но позволяющий делать множественный выбор, состоит он из чекбоксов. У него есть свойсво Items. Вначале я обявил его как TStrings, но связанное с ним поле TStringList. Как отдельный объект работает замечательно, ставлю в Дельфи как компонент - в Работает в disigntime но не работает в runtime. Функция чтения свойсва просто преобразовывала тип к TStrings. Сейчас исправил тип свойсва на TStringList и убрал функцию чтения. То же самое. Смотрел dfm, свойсво там сохранено.
Вот объявление:
unit StCheckboxGroup;
interface
uses
SysUtils, Classes, Controls, StdCtrls, Graphics, Windows;
const maxItemsCount=31;
type TcbGroupNum = 0..maxItemsCount;
type TSelectedItems = set of TcbGroupNum;
type
TStCheckboxGroup = class(TCustomGroupBox)
private
{ Private declarations }
FItems: TStringList;
FButtons: TList;
FIndent: Integer;
FOnChange:TNotifyEvent;
FSelectedItems:TSelectedItems;
procedure SetItems(const Value: TStringList);
procedure SetIndent(const Value: Integer);
procedure ArrangeButtons;
function GetCount: TcbGroupNum;
procedure SetSelectedItems(const Value: TSelectedItems);
function GetSelectedItems:TSelectedItems;
protected
{ Protected declarations }
procedure resize; override;
procedure paint; override;
public
{ Public declarations }
constructor Create(AOwner:TComponent); override;
destructor Destroy; override;
property Count:TcbGroupNum read GetCount;
procedure DeleteItem(n:TcbGroupNum);
procedure ClearItems;
published
{ Published declarations }
property Caption;
property Items:TStringList read FItems write SetItems;
property Indent:Integer read FIndent write SetIndent default 5;
property OnChange:TNotifyEvent read FOnChange write FOnChange;
property SelectedItems:TSelectedItems read GetSelectedItems write SetSelectedItems;
property Font;
property Color;
property OnResize;
property OnEnter;
property OnExit;
property OnClick;
property Popupmenu;
end;
Вот процедура записи свойсва:
procedure TStCheckboxGroup.SetItems(const Value: TStringList);
var
btn:TCheckbox;
i:TcbGroupNum;
begin
try
begin
if Value.Count>maxItemsCount then
raise ERangeError.Create("To many lines");
end
except exit end;
if FItems.Text = Value.Text then exit; //Если одинаковый - выход
while FButtons.Count > Value.Count do //Удаляю, если лишние
begin
btn := FButtons[FButtons.Count-1];
btn.Free; //Уничтожаю лишние кнопки
FButtons.Delete(FButtons.Count-1);
end;
while FButtons.Count < Value.Count do //Добавляю, если не хватает
begin
btn := TCheckbox.Create(Self);
btn.Parent:=Self;
FButtons.Add(btn);
end;
for i:=0 to Value.Count-1 do //Присваиваю строки из листа
begin
btn := FButtons[i];
if btn.Caption<>Value[i] then btn.Caption := Value[i];
end;
FItems.Assign(Value);
ArrangeButtons; //Переставить кнопки
if assigned(FOnChange) then FOnChange(Self);
end;
Ошибка явно в этом свойсве, притом в этой функции, но в чем она?
← →
Турист (2005-09-10 12:02) [1]Borland\Delphi7\Source\Vcl\ExtExtrls.pas
TCustomRadioGroup - готовое решение, останется только поменять TRadioButton на TCheckBox, добавить требуемой функциональности
← →
TStas © (2005-09-10 13:38) [2]>Турист
Это мне самому первое, что пришло в голову, только ведь это противоречит принципу наследования. Но, главное, мне нужно свойство множество SelectedItems. Здесь нужно что-то исправить, но никак не пойму, что именно.
← →
jack128 © (2005-09-10 17:13) [3]TStas © (10.09.05 13:38) [2]
Это мне самому первое, что пришло в голову, только ведь это противоречит принципу наследования
Какого наследования?? Тебе наследоваться никто не предлагает, тем более, что это ничего не даст. Просто скопируй весь код компонента TCustomRadioGroup и замени где нужно TGroupButton на TCheckBox
← →
jack128 © (2005-09-10 17:19) [4]TStas © (10.09.05 0:17)
Вначале я обявил его как TStrings, но связанное с ним поле TStringList
Зачем ?? Поле бы тоже объявлял на как TStrings
TStas © (10.09.05 0:17)
но не работает в runtime
исчерповающее описание, конечно..
← →
TStas © (2005-09-10 18:55) [5]>jack128
Именно так сейчас я и поступил, старый написанный мною код просто забросив. Все, конечно, получается, только почему-то свойсво-множество, хотя его размер не превышает 4 байт, не появляется в объектном инспекторе, хотя ради него и весь огород горожу. Но с этим разберусь. Просто я считал, что наследование придумано для того, чтобы не переписывать готовый и отлаженный код, тем более, чужой.
[4] А и сам удивлялся очень. В dfm все нормально сохранилось, в дизайнтайме работает, а в рантайме - нет. То есть В dfm записано и свойсво множенсто и Items. В designtime все появляется и работает. В runtime появляется сама рамочка с captionом и все.
>Турист
Сделал, как вы сказали. Только берут сомнения, насчет правильности. Задача ведь не только написать, но и научиться нармальными приемам.
Для решения практической задачи меня вполне устроит и довольно кривой способ: записать в файл или даже строку капшины у чекбоксов и Checked и создавать их циклом в рантайме да и все. Сохранял же в файл Tlist в котором записи, содержащие динамические массивы, все же получилось.
← →
Турист (2005-09-10 22:19) [6]>TStas © (10.09.05 18:55) [5]
>Только берут сомнения, насчет правильности
Если не получается наследовать, то есть варианты
- изменить в исходниках TCustomRadioGroup, чтобы наследовать было можно, например создать метод
function TCustomRadioGroup.CreateButton: TButtonControl; virtual;
- предложен в Турист (10.09.05 12:02) [1]
- создавать "с нуля" - будут "всплывать" проблемы, которых нет у аналога - трата времени на отладку
\Borland\Delphi7\Source, Borland\Delphi7\Demos - на мой взгляд, очень хорошие учебники и справочники, из них Вы вряд ли научитесь чему то "плохому" :-), а время на написание приложений существенно сократиться.
← →
jack128 © (2005-09-11 02:37) [7]Турист (10.09.05 22:19) [6]
Если не получается наследовать, то есть варианты
- изменить в исходниках TCustomRadioGroup, чтобы наследовать было можно, например создать метод
function TCustomRadioGroup.CreateButton: TButtonControl; virtual;
За такие варианты отрывают все выступающие части организма ;)
TStas © (10.09.05 18:55) [5]
Все, конечно, получается, только почему-то свойсво-множество, хотя его размер не превышает 4 байт, не появляется в объектном инспекторе, хотя ради него и весь огород горожу
Ну видимо для свойств-множеств нету редактора свойств по умолчанию, пиши свой. Хотя лично я бы сделал так: сделал бы свойство-массив Checked[index: Integer]: boolean (public property), а сохранял бы его в dfm, используя механизм псевдо-свойств(TPesistent.DefineProperies + F1)
← →
TStas © (2005-09-11 02:39) [8]>Турист
В общем-то так и сделал, как Вы сказали, только пока не поймал, где там только одна кнопка делаюется выбранной. Это в двух местах происходит. Надо мне еще с перехватом сообщений нормально разобраться.
← →
TStas © (2005-09-11 02:48) [9]>jack128
Как нету - есть. Свойсво-множество, если размер его не превышает 4 байта не требует редактора свойсва. Оно отлично редактируется. Другой вопрос, что при попытке изменять RadioGroup, что-то не так было. Если превышает - компилятор грязно ругается. Но тогда тоже есть варианты, описанные у Фаронова. Например, сделать указатель на свойсво и обращаться через указатель. Вот тогда редактор свойсва необходим.
← →
jack128 © (2005-09-11 03:06) [10]TStas © (11.09.05 2:48) [9]
Как нету - есть.
Хм, да был не прав, проверил, свойство появляется в ИО..
← →
имя (2005-09-11 08:39) [11]Удалено модератором
Примечание: оффтопик
← →
имя (2005-09-11 14:48) [12]Удалено модератором
Примечание: оффтопик
← →
имя (2005-09-11 15:02) [13]Удалено модератором
Примечание: оффтопик
← →
имя (2005-09-11 18:16) [14]Удалено модератором
Примечание: оффтопик
← →
имя (2005-09-12 21:29) [15]Удалено модератором
Примечание: оффтопик
← →
имя (2005-09-12 23:21) [16]Удалено модератором
Примечание: оффтопик
← →
имя (2005-09-13 07:46) [17]Удалено модератором
Примечание: оффтопик
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.013 c