Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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
1-1138982654
Apollon_604
2006-02-03 19:04
2006.03.05
Прозрачность компонент


2-1139844804
ilifant
2006-02-13 18:33
2006.03.05
массивы


2-1139937747
Эля
2006-02-14 20:22
2006.03.05
Сообщение об ошибке ShellAPI


2-1140177446
zx__
2006-02-17 14:57
2006.03.05
работа с модемом


1-1138870523
sally
2006-02-02 11:55
2006.03.05
Перемещение каталогов





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