Форум: "Основная";
Текущий архив: 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