C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как реализовать?
** Алексей
Отправлено: 15.02.2006, 14:20


Не зарегистрирован







Подскажите, как можно реализовать следующ. вещь:

на форме имеются созданные и размещенные Label-ы, с именами, например: u1,u2...u5 i1,i2...i5 k1,k2...k5 как сделать так, чтобы обращаться к ним можно было как к массиву?

Например: u[4]->Caption обращалось бы к свойству Caption компонента u4, i[2]->Caption к Caption i2.

Заранее благодарен.
Guest
Отправлено: 15.02.2006, 14:27


Не зарегистрирован







Воспльзоваться поиском (по форуму) и собрать их в массив. smile.gif
** Алексей
Отправлено: 15.02.2006, 14:39


Не зарегистрирован







весь вопрос то в том как их организовать в массив?

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

буду очень признателен, если кто-нибудь даст грамотный ответ
gvg
Отправлено: 15.02.2006, 14:56


Машинист паровоза

Группа: Участник
Сообщений: 222



Зачем нужно обращаться к свойствам созданных и размещенных на форме компонентов через массив? Уточните. Возможно есть другое решение — подскажем.

Отредактировано gvg — 15/02/2006, 14:57
** Алексей
Отправлено: 15.02.2006, 15:11


Не зарегистрирован







Задача следующая:
На форме в 5 столбцов размещены label-ы (по 3 в каждом).

Например (u,i,kik — это имена Label-ов):

u1 u2 u3 u4 u5
i1 i2 i3 i4 i5
kik1 kik2 kik3 kik4 kik5

каждый столбец соответствует одному объекту у которого 3 параметра
(итого — 5 объектов по 3 параметра у каждого)

с COM порта приходят данные о параметрах каждого объекта (u,i,kik), а также его номер (объекта).

Задача: отобразить принятые параметры на форме, причем в столбце, соответствующем номенру объекта.

Допустим принято от 4го объекта (u=1; i=2; kik=3), тогда, должно быть следующее:

u1 u2 u3 1 u5
i1 i2 i3 2 i5
kik1 kik2 kik3 3 kik5

дак вот я думаю, что к Label-ам проще будет обращаться через номер объекта:
u[номер объекта]->Caption...
i[номер объекта]->Caption...
kik[номер объекта]->Caption...
gvg
Отправлено: 15.02.2006, 15:23


Машинист паровоза

Группа: Участник
Сообщений: 222



CODE

TLabel *labels[3,5];

// в создании формы сохранить указатели
labels[0,0] = u1;
...
labels[2,4] = kik5;

//ну и использовать
labels[y,x]->Caption = "значение"
** Алексей
Отправлено: 15.02.2006, 15:32


Не зарегистрирован







Большое спасибо!

а где лучше разместить данный код, чтобы я мог обращаться к нему из
любого места программы (имеется ввиду если мне надо иметь доступ к этим Label-ам из Unit1.cpp и Unit2.cpp и Unit3.cpp).
gvg
Отправлено: 15.02.2006, 15:42


Машинист паровоза

Группа: Участник
Сообщений: 222



вставьте строку

extern TLabel *labels;

в h-файл формы, где расположены label-ы. В юниты, которые будут обращаться к массиву вставьте

#include "тот_самый.h"
** Алексей
Отправлено: 15.02.2006, 15:45


Не зарегистрирован







Огромное спасибо за помощь!

Всего наилучшего!
Doga
Отправлено: 15.02.2006, 17:37


Мастер участка

Группа: Участник
Сообщений: 575



Мда... ohmy.gif

Кто нибудь когда нибудь смотрел структуру класса TComponent?!!!
А ведь на его основе построены все остальные компоненты, визуальные и невизуальные! Кто нибудь обращал внимание на такие свойства как:

QUOTE

Lists all components owned by the component.

__property TComponent* Components[int Index] = {read=GetComponent};

Description

Use Components to access any of the components owned by this component, such as the components owned by a form. The Components property is most useful when referring to owned components by number rather than name. It is also used internally for iterative processing of all owned components.

Note: For convenience use Components with ComponentCount for iterative processing.

и
QUOTE

Indicates the number of components owned by the component.

__property int ComponentCount = {read=GetComponentCount, nodefault};

Description

Use ComponentCount to find or verify the number of components owned by a component, or when iterating through the Components list to perform some action on all owned components. ComponentCount is used internally for such iterative procedures.

Note: The ComponentCount of a component contains the same number of items as in the Components list for that component.


Зачем плодить ненужные сущности?
gvg
Отправлено: 15.02.2006, 17:55


Машинист паровоза

Группа: Участник
Сообщений: 222



Полагаю, разборка "свой-чужой" обойдется дороже...
Doga
Отправлено: 15.02.2006, 18:24


Мастер участка

Группа: Участник
Сообщений: 575



Я думаю это будет не сложнее, чем организвать массив необходимой структуры. А если понадобится добавить ещё пару десятков TLabel ?
gvg
Отправлено: 15.02.2006, 18:35


Машинист паровоза

Группа: Участник
Сообщений: 222



По задаче — количество определено совершенно определенно.
** Алексей
Отправлено: 16.02.2006, 06:31


Не зарегистрирован







Спаибо за помощь.

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

Поэтому из структуры класса TComponent я вряд ли что-то почерпну,
структура Label-ов и их количество определенно конкретно, след-но устроит любой вариант — лишь бы работало!

еще раз спасибо за помощь!
** Алексей
Отправлено: 16.02.2006, 07:33


Не зарегистрирован







Еще вопрос:
для сокращения кода хочу написать так:

вместо labels[0][0]=u1;
labels[0][1]=u2;
labels[0][2]=u3;
labels[0][3]=u4;
labels[0][4]=u5;

for (int i=0;i<5;i++) {labels[0][i]=(TLabel*)Form1->FindComponent("u"+IntToStr(i+1));}

при компиляции ошибок не выдает, но и не работает...

и еще при объявлении в h-файле строки extern TLabel *labels[0][5];
при компиляции выдает ошибку:

[Linker Error] unresolved external '_labels' referenced from ......./UNIT2.OBJ
AVC
Отправлено: 16.02.2006, 09:06


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

for (int i=0;i<5;i++) {labels[0][i]=(TLabel*)Form1->FindComponent("u"+IntToStr(i+1));}
при компиляции ошибок не выдает, но и не работает...

Что возвращает FindComponent? Может у вас label'ы лежат не на форме а на панельках или еще где?
Кстати нормально — сделать через вектор.

Отредактировано AVC — 16/02/2006, 08:08
** Алексей
Отправлено: 16.02.2006, 09:11


Не зарегистрирован







все понял, спасибо, Label-ы лежат на Image — совсем забыл.

тогда надо так:
for (int i=0;i<5;i++) {labels[0][i]=(TLabel*)Image1->FindComponent("u"+IntToStr(i+1));}

а что с этим может быть:

при объявлении в h-файле строки extern TLabel *labels[3][5] — это для того, чтобы я с этими Label-ами мог из других форм общаться;

при компиляции выдает ошибку:

[Linker Error] unresolved external '_labels' referenced from ......./UNIT2.OBJ
viva
Отправлено: 16.02.2006, 09:19


Дежурный стрелочник

Группа: Участник
Сообщений: 31



QUOTE

extern TLabel *labels[3][5]

Это ссылки на объявленный объект, а где объявление
CODE

TLabel *labels[3][5]
gvg
Отправлено: 16.02.2006, 09:30


Машинист паровоза

Группа: Участник
Сообщений: 222



QUOTE (** Алексей @ 16/02/2006, 07:33)
Еще вопрос:
для сокращения кода хочу написать так:

вместо labels[0][0]=u1;
labels[0][1]=u2;
labels[0][2]=u3;
labels[0][3]=u4;
labels[0][4]=u5;

for (int i=0;i<5;i++) {labels[0][i]=(TLabel*)Form1->FindComponent("u"+IntToStr(i+1));}

при компиляции ошибок не выдает, но и не работает...

и еще при объявлении в h-файле строки extern TLabel *labels[0][5];
при компиляции выдает ошибку:

[Linker Error] unresolved external '_labels' referenced from ......./UNIT2.OBJ

1. Сократится текст программы, код от этого увеличится. Но работать должно. У меня сработало.
2. А почему [0][5]? Надо [3][5]
** Алексей
Отправлено: 16.02.2006, 09:56


Не зарегистрирован







Объявил
TLabel *labels[3][5]
заработало, спасибо...

а с FindComponent так и не получилось, ладно сделаю через перечисление

2. А почему [0][5]? Надо [3][5]
Просто экспериментировал с одной строкой пока.

Всем спасибо.
avc*
Отправлено: 16.02.2006, 10:26


Не зарегистрирован







>а с FindComponent так и не получилось, ладно сделаю через перечисление
И все таки "Что возвращает FindComponent?"?

>Label-ы лежат на Image
Нет, искать от владельца (формы) типа this->FindComponent(....) или просто FindComponent. Обязано работать.

>Просто экспериментировал с одной строкой пока
Одна строка [1][5]
** Алексей
Отправлено: 16.02.2006, 10:49


Не зарегистрирован







все, FindComponent тоже заработал
искал (от Form1->Image1->FindComponent), не так как надо (сделал просто FindComponent) и все заработало!

спасибо!
Guest
Отправлено: 22.02.2006, 09:10


Не зарегистрирован







еще проще
Объявляем массив

TLabel* LABELS[] = {Label1, Label2,...};

и все
Обращаемся LABELS[0]->Caption

PS.
Дубль ответа gvg от 15/02/2006, 14:23


Отредактировано AVC — 22/02/2006, 08:28

Вернуться в Вопросы программирования в C++Builder