Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Странная ошибка (а может быть и нет) [D7, WinXP]


Страницы:   1 2

tazik ©   (2005-01-26 23:39:00) 

Здравствуйте!

Это опять я. У меня есть такая штука. Перелистываю Tabsheet'ы нахожу в них ScrollBox'ы, там ToolBox'ы, а на них ToolButton'ы с дописанными некоторыми свойствами (param типа string). Но на строчке кода (*) выдает ошибку 'Ivalid class typecast'.
Помогите найти её:

var Name,Caption,Param1,Param2: string;
begin
for i := 0 to PageControl.PageCount - 1 do
begin
   PageControl.ActivePageIndex := i;
   for A := 0 to (PageControl.Pages[I].Controls[0] as TScrollBox).ControlCount - 1 do
   begin
           for C := 0 to ((PageControl.Pages[i].Controls[0] as TScrollBox).Controls[A] as TToolBar).ControlCount - 1 do
           begin
           (*) name := (((PageControl.Pages[i].Controls[0] as TScrollBox).Controls[A] as TToolBar).Controls[C] as TToolButton).Name;
               Caption := (((PageControl.Pages[i].Controls[0] as TScrollBox).Controls[A] as TToolBar).Controls[C] as TToolButton).Caption;
               Param1 := (((PageControl.Pages[i].Controls[0] as TScrollBox).Controls[A] as TToolBar).Controls[C] as TToolButton).Param1;
               Param2 := (((PageControl.Pages[i].Controls[0] as TScrollBox).Controls[A] as TToolBar).Controls[C] as TToolButton).Param2;
           end;
   end;
end;


Erik1   (2005-01-28 11:39:00) [1]

Что то у вас тут страное происходит. Общий вид поиска по типам:
procedure EnableControl(Control: TControl; Enable: Boolean);
begin
 if Enable then
   ControlColor := clWindow
 else
   ControlColor := clDisabled;

 if Control is TButtonControl then
   with TButtonControl(Control) do
   begin
     Enabled := Enable;
     Color := ControlColor;
   end;

 if (Control is TCustomPanel) or (Control is TTabSheet) or (Control is TPage) or
     (Control is TFrame) then
   with TWinControl(Control) do
     for I := 0 to ControlCount - 1 do
       EnableControl(Controls[I], Enable)
 else if (Control is TPageControl) then
   with TPageControl(Control) do
     for I := 0 to PageCount - 1 do
       EnableControl(Pages[I], Enable);
end;


KilkennyCat   (2005-01-28 02:24:00) [2]


> Просто Джо ©   (28.01.05 01:51) [31]


гм... думаю, что не будет определено в таком случае, есть ли свойство .Name у данного компонента. Хотя, это с точки зрения интерпетатора, может оптимизатор компилятора и поймет, что раз условие выполнилось, то иного и быть не может, не знаю...


> Вот что значит общаться со спецами!


:) тоже мне, спеца нашел... я как раз думаю, что неверно ответил. Почему-то мне кажется, что перебор всего подряд - неэффективная вещь и очень редко требоваться должна. Наверняка есть вариант более оптимальный (в каждом конкретном случае).


Просто Джо   (2005-01-28 01:51:00) [3]

[29] KilkennyCat ©   (27.01.05 01:08)


>  if (Components[i] is TMyBtn) then name := tMyBtn(components[i]).Name;


А разве так не пойдет?

if (Components[i] is TMyBtn) then name := components[i].Name;


tazik   (2005-01-28 01:38:00) [4]

А помоему вполне достойный вариант. Я его обязательно опробую. Вот что значит общаться со спецами!


KilkennyCat   (2005-01-27 01:08:00) [5]

и еще бредовый вариантно заменяющий весь первоначальный код полностью:
var
i : byte;
name : string;
begin
 for i := 0 to ComponentCount - 1 do
  if (Components[i] is TMyBtn) then name := tMyBtn(components[i]).Name;
end;


Gero   (2005-01-27 01:04:00) [6]


> А зачем вообще придумали свойство Tag. Для подобных целей?

Да, оно существует, чтобы дать волю полету фантазии программиста.


tazik   (2005-01-27 01:02:00) [7]

> KilkennyCat
Намек ясен (;-р. И как я раньше не догадался! А зачем вообще придумали свойство Tag. Для подобных целей?


KilkennyCat   (2005-01-27 01:00:00) [8]

Tag - присваиваем ему любое целочисленное значение, по любой системе, например, 10..19 - у кнопок первого табшита, 20..29 - у второго и т.д. Получаем уникальный, идеальный идентификатор.


tazik   (2005-01-27 00:55:00) [9]

> KilkennyCat.

Так, так. Поподробней, пожалуйста.


KilkennyCat   (2005-01-27 00:54:00) [10]


> tazik ©   (27.01.05 00:48) [22]


не обязательно искать по именам. Есть же Tag, например.


tazik   (2005-01-27 00:50:00) [11]

> KilkennyCat[21]

Буду знать.


tazik   (2005-01-27 00:48:00) [12]

> KilkennyCat [19]

Если бы все так просто! Ведь имена Btnов не Btn1, btn2, btn3... а, скажем, sBtn, fstBtn, parasha_a_ne_Btn :)


KilkennyCat   (2005-01-27 00:47:00) [13]

просто если не вручную, и именно как в коде, то открое маленький секрет: если табшиит не активен, и его не видно, это не значит, что на нем все исчезло... все свойства компонентов доступны.


KilkennyCat   (2005-01-27 00:45:00) [14]


> Сначала активизируем некоторую Tab'у


Вручную?


KilkennyCat   (2005-01-27 00:44:00) [15]


> Я хочу добраться к свойствам объекта BTN0, потом к свойствам
> BTN1 и т.д.


если ко всем, то есть, то можно проще-с...

TMyBtn(FindComponent('BTN' + IntToStr(N))).param


tazik   (2005-01-27 00:43:00) [16]

> to KilkennyCat [14]

Принцип такой. Сначала активизируем некоторую Tab'у. Потом обращаемся к ScrollBox'у. В нем лежит toolBar. На ToolBar'е лежат tMyBtn'ы. Снимаем о них некоторую инфу. Потом переходим на следующий Tab. И так до того момента пока не перецдем до последнего Taba, последнего ScrollBox'a последнего ТулБара, послейнего tmyBtn.


Kerk   (2005-01-27 00:41:00) [17]

with (((PageControl.Pages[i].Controls[0] as TScrollBox).Controls[A] as TToolBar).Controls[C] as TMyBtn) do
begin
...
end;


ну и в таком стиле


KilkennyCat   (2005-01-27 00:40:00) [18]

PageControl.Pages[i].Controls[0] as TScrollBox

и это мне тоже не нравится... не уверен, правда, но опредялять конкретный нулевой контрол в данном случае как-то странно... либо мы ищем TScrollBox, либо мы твердо знаем.


tazik   (2005-01-27 00:37:00) [19]

> Kerk
Что вы имеете ввиду?

> KilkennyCat
Я хочу добраться к свойствам объекта BTN0, потом к свойствам BTN1 и т.д.


KilkennyCat   (2005-01-27 00:35:00) [20]

либо я чего-то не понимаю, но
> я собираю инфу о кнопках, которых находятся на ToolBaraх,
> которые, в свою очередь назодятся в ScrollBoxах, а те находятся
> на активных TabSheetах

не соответсвует приведенному коду. так как:
1) табшиты делаются активными принудительно все, то есть, собираются параметры на всех табшитах, не только активных.
2) инфа собирается только о самой последней кнопке (и потом нигде не используется)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо