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

Вниз

Работает в 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.07 c
2-1140364604
JEK2
2006-02-19 18:56
2006.03.05
Как сделать регистронезависимую выборку в БД


15-1139392403
Kerk
2006-02-08 12:53
2006.03.05
Статистика: десятка языков Интернета


15-1139729042
PARUS
2006-02-12 10:24
2006.03.05
Частота.


1-1138979236
Zeqfreed
2006-02-03 18:07
2006.03.05
Внутренняя организация интерактивного элемента отображения текста


15-1139557331
Asker
2006-02-10 10:42
2006.03.05
альфа/бетта версии