** Алексей |
Отправлено: 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 |
|
Не зарегистрирован
|
Воспльзоваться поиском (по форуму) и собрать их в массив. |
|
** Алексей |
Отправлено: 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
|
Мда...
Кто нибудь когда нибудь смотрел структуру класса 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 |
|