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

Вниз

Странная ошибка (а может быть и нет)   Найти похожие ветки 

 
tazik ©   (2005-01-26 23:39) [0]

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

Это опять я. У меня есть такая штука. Перелистываю 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;


 
KilkennyCat ©   (2005-01-26 23:44) [1]

что-то тут не то... сейчас попробую понять. если не отвечу - не поминайте лихом, спекся, значит...


 
KilkennyCat ©   (2005-01-26 23:47) [2]


> for i := 0 to PageControl.PageCount - 1 do
> begin
>    PageControl.ActivePageIndex := i;
>    

а это зачем так?


 
KilkennyCat ©   (2005-01-26 23:49) [3]

не... пока TTabSheet вместо всей бодяги не применят, думать не смогу...


 
tazik ©   (2005-01-26 23:52) [4]

> to KilkennyCat [2]

А это я устанавливаю активную страницу в PageControl. Ведь я смотрю ScrollBox на активном TabSheet.


 
KilkennyCat ©   (2005-01-26 23:55) [5]


> tazik ©   (26.01.05 23:52) [4]


это я понял. То есть, надо смотреть именно на активном? ну тогда это либо не весь код, либо я не понимаю, почему можно смотреть только на активном.


 
tazik ©   (2005-01-26 23:58) [6]

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


 
KilkennyCat ©   (2005-01-27 00:00) [7]

Это понятно. значит, код неполный, впринципе, это и так ясно, учитывая, что в данной полноте параметры получают только последнее значение...

Но, может быть, все-таки стоит пересмотреть алгоритм?


 
tazik ©   (2005-01-27 00:07) [8]

Я вам передставил полную фу-ю. Со всеми алгоритмами. Меня мучает вопрос почему же возникает "Invalid class typecast"!!!! Ведь я смотрю на стринговые значения с одной и другой стороны опредатора присваявания!

p.s. вы извините, если я буду ошибаться при написании слов. Пиво... пиво... :)


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


> Я вам передставил полную фу-ю. Со всеми алгоритмами.


неправда.

в том виде, в каком представили, если добавить А В С  и понять, что такое TToolButton.Param1(2), то ошибки не будет, хоть выглядит и ужасно.


 
tazik ©   (2005-01-27 00:24) [10]


type TMyBtn = class(TToolButton)
public
   Param1,
   Param2: string;
end;

procedure ReedInfo();
var Name, Caption,
   Param1, Param2: string;
   I, C, a: Integer;
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 TMyBtn).Name;
              Caption := (((PageControl.Pages[i].Controls[0] as TScrollBox).Controls[A] as TToolBar).Controls[C] as TMyBtn).Caption;
              Param1 := (((PageControl.Pages[i].Controls[0] as TScrollBox).Controls[A] as TToolBar).Controls[C] as TMyBtn).Param1;
              Param2 := (((PageControl.Pages[i].Controls[0] as TScrollBox).Controls[A] as TToolBar).Controls[C] as TMyBtn).Param2;
          end;
  end;
end;

Вот структура расположения компонентов

<TAB_SHEET1>
          +
          |
          +<SCROLL_BOX>+
                       |
                       +<TOOL_BAR1>+
                                  +<BTN0>
                                  +<BTN1>
                                  +...
                                  +<BTN_N>
                       +
                       |
                       +<TOOL_BAR2>+
                                  +<BTN0>
                                  +<BTN1>
                                  +...
                                  +<BTN_N>
<TAB_SHEET2>
          +
          |
          +<SCROLL_BOX>+
                       |
                       +<TOOL_BAR1>+
                                  +<BTN0>
                                  +<BTN1>
                                  +...
                                  +<BTN_N>
                       +
                       |
                       +<TOOL_BAR2>+
                                  +<BTN0>
                                  +<BTN1>
                                  +...
                                  +<BTN_N>                              


 
KilkennyCat ©   (2005-01-27 00:29) [11]

требуется возвращать параметры последней  BTN_N последнего тулбара TOOL_BAR2?


 
KilkennyCat ©   (2005-01-27 00:31) [12]

причем ничего с ними не делать?


 
Kerk ©   (2005-01-27 00:32) [13]

Ну почему вы не используете with ???


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

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

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


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

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

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


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

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

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


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

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


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


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

> to KilkennyCat [14]

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


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


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


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

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


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


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


Вручную?


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

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


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

> KilkennyCat [19]

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


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

> KilkennyCat[21]

Буду знать.


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


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


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


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

> KilkennyCat.

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


 
KilkennyCat ©   (2005-01-27 01:00) [26]

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


 
tazik ©   (2005-01-27 01:02) [27]

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


 
Gero ©   (2005-01-27 01:04) [28]


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

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


 
KilkennyCat ©   (2005-01-27 01:08) [29]

и еще бредовый вариантно заменяющий весь первоначальный код полностью:
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;


 
tazik ©   (2005-01-28 01:38) [30]

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


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

[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;


 
KilkennyCat ©   (2005-01-28 02:24) [32]


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


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


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


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


 
Erik1 ©   (2005-01-28 11:39) [33]

Что то у вас тут страное происходит. Общий вид поиска по типам:
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;



Страницы: 1 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.027 c
3-1105622455
syte_ser78
2005-01-13 16:20
2005.02.13
dbcombobox


3-1105685586
Orc
2005-01-14 09:53
2005.02.13
Проблема с select из dbf


1-1107077596
focor
2005-01-30 12:33
2005.02.13
Вскрыть кнопку


3-1105970020
denis24
2005-01-17 16:53
2005.02.13
where date_future=:p2


1-1107060557
PZ
2005-01-30 07:49
2005.02.13
Модераторам форума