Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.082 c
1-1106937671
Вован
2005-01-28 21:41
2005.02.13
Исходники


14-1106741142
Kerk
2005-01-26 15:05
2005.02.13
НАЙДЕНА МОГИЛА БУРАТИНО


1-1107025261
olookin
2005-01-29 22:01
2005.02.13
Снова проблема - отладчик не заходит в процедуру


1-1106676112
tazik
2005-01-25 21:01
2005.02.13
Как обратиться к объекту, если еасть его имя.


1-1107075190
Зигмунд
2005-01-30 11:53
2005.02.13
Как закодировать строчку в URL-кодированную.





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