![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странная ошибка (а может быть и нет) [D7, WinXP]
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) инфа собирается только о самой последней кнопке (и потом нигде не используется)