Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обращение к элементу на форме по именю, Элементы формы 
:(
    Опции темы
svyashennik
Дата 6.4.2007, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 21.4.2006
Где: Питер

Репутация: нет
Всего: нет



   Помогите чем смогите!! Есть форма на ней, скажем, едиты и лейблы (штук 10 каждого) и мне надо записать  в ричэдит содержание едитов и заголовки лейблов. И мне надо сделать это для небольшого колличества элементов (именование такое: Leabel1...10 и Edit1...10). Как это сделать для Leabel1...3 и Edit1...3.
    Я пытался сделать в форе с помощью FindeComponent("Leabel" + i), но что-то не выходит. Пожалуйсто напишите пример правильной реализации. smile 
PM MAIL ICQ   Вверх
mr.Anderson
Дата 6.4.2007, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Я лично делаю так. Задаю всем нужным компонентам какой-нить идентификатор (например, в свойстве Tag), а затем делаешь вот таким образом:
Код

for( int i=0; i<Form1->ControlCount; i++ ) {
 TLabel *L = dynamic_cast< TLabel* >( Form1->Controls[ i ] );
 TEdit *E = dynamic_cast< TEdit* >( Form1->Controls[ i ] );
 
 if( L && L->Tag == <нужное_значение> )
  ...

 if( E && E->Tag == <нужное_значение> )
  ...
}



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Klin
Дата 6.4.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



А можно еще так:
Код

 ((TLabel*)Components[1])->Caption = "надпись";

Надо только знать номер компонента (желтым выделил), для этого используй ComponentIndex, а их количество ComponentCount.
Помойму, проще не придумаешь smile

Это сообщение отредактировал(а) Klin - 6.4.2007, 22:49


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
svyashennik
Дата 6.4.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 21.4.2006
Где: Питер

Репутация: нет
Всего: нет



:
         ((TLabel*)Components[1])->Caption = "надпись";
Это да. Но перебираются все компоненты, а если мне надо, допустим, изменить Caption у Label2 и 3, то как это сделать цикле.
PM MAIL ICQ   Вверх
Klin
Дата 6.4.2007, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Щелкаешь на объект правой кнопкой, далее вид текста и считаешь нужный компонент. 
Или просто проверяешь компонент на его класс, можно так:
Код

for (int n=0;  n<=ComponentCount-1;n++)
 if (Components[n]->ClassNameIs("TLabel")) 
 ((TLabel*)Components[n])->Caption = "надпись";

Вот и все smile

Это сообщение отредактировал(а) Klin - 7.4.2007, 00:04


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
Klin
Дата 7.4.2007, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



А вот рабочий пример моего варианта:
Код

for (int n=0; n<ComponentCount; n++) { // поиск по всем компонентам
 AnsiString test_name = Components[n]->Name;
 if (Components[n]->ClassNameIs("TLabel")) // этот компонент надпись
  switch (StrToInt(test_name .Delete(1,5))) {
   case 1:: ((TLabel*)Components[n])->Caption = "Первая кнопка"; break; 
   case 3: ((TLabel*)Components[n])->Caption = "надпись №242"; break;
   case 4: ((TLabel*)Components[n])->Caption = "надпись №353"; break;
   case 5: ((TLabel*)Components[n])->Caption = "надпись №455"; break;
  }
 else if (Components[n]->ClassNameIs("TEdit")) // этот компонент текстовое поле
   switch (StrToInt(test_name .Delete(1,4))) {
   case 1: ((TEdit*)Components[n])->Text = "Первое текстовое поле"; break;
   case 2: ((TEdit*)Components[n])->Text = "Ваше имя"; break;
   case 3: ((TEdit*)Components[n])->Text = "Ваша фамилия"; break;
   case 4: ((TEdit*)Components[n])->Text = "Ваше отчество";  break;
  }
 else if (Components[n]->ClassNameIs("TMemo")) // этот компонент Memo
  ((TMemo*)Components[n])->Text = "Это пример твоего текста";
 else if (Components[n]->ClassNameIs("TButton")) { // этот компонент кнопка
  ((TButton*)Components[n])->Caption = "Закрыть"; // заголовок кнопки
  ((TButton*)Components[n])->OnClick = Button2Click; // привязка нового действия к кнопке
 }

Case # - номер объекта (пример Label3)
Components[n]->Name.Delete(1,#) - количество символов в имени (пример: Edit1 - 4 ; Label6 - 5)
Components[n]->ClassNameIs("###")  - тип компонента (пример: Edit5 - TEdit)
Как я и сказал, очень простой вариант. Сначала определяется тип компонента, а затем, вместо Tag`а в качестве метки, используется его имя и номер для определения нужного действия.

Это сообщение отредактировал(а) Klin - 7.4.2007, 10:18


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
codelord
Дата 7.4.2007, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Цитата(svyashennik @  6.4.2007,  18:07 Найти цитируемый пост)
 Я пытался сделать в форе с помощью FindeComponent("Leabel" + i), но что-то не выходит. Пожалуйсто напишите пример правильной реализации. 

будь внимательней с написанием имен функций и названием Label.

для десяти лейблов Label1 ... Label10..
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
for( int i = 11;  i--; ) {
 TLabel *label = (TLabel*)FindComponent("Label"+AnsiString(i));
  label->Caption="Hello Label" + AnsiString(i);
 }
}



--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Klin
Дата 7.4.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Цитата(codelord @  7.4.2007,  10:04 Найти цитируемый пост)
TLabel *label = (TLabel*)FindComponent("Label"+AnsiString(i));
  label->Caption="Hello Label" + AnsiString(i);


Это хороший вариант, но как и в случае с dynamic_cast, выделяется дополнительная память. Да и для нахождения объектов разных типов придется использовать несколько циклов. Вот решение поставленной задачи:
Код

 for (int n=0; n<ComponentCount; n++)
  if (Components[n]->ClassNameIs("TLabel"))
   RichEdit1->Lines->Add(((TLabel*)Components[n])->Caption);
  else if (Components[n]->ClassNameIs("TEdit"))
   RichEdit1->Lines->Add(((TEdit*)Components[n])->Text);



--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
codelord
Дата 7.4.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Цитата(Klin @  7.4.2007,  08:08 Найти цитируемый пост)
Это хороший вариант, но как и в случае с dynamic_cast, выделяется дополнительная память. Да и для нахождения объектов разных типов придется использовать несколько циклов. Вот решение поставленной задачи:

откуда там память? на указатель если только, твои циклы с перебором всех компонентов выглядят мягко говоря не очень красиво, и не гибко.

допустим мне надо изменить один лейбл, в этом случае по твоему методу я должен перебором посмотреть все компоненты?

и метод который я, предложил выше, является не "хорошим" как ты выразился а стандартным в такой ситуации.

Добавлено через 4 минуты и 37 секунд
Цитата(svyashennik @  6.4.2007,  18:07 Найти цитируемый пост)
пытался сделать в форе с помощью FindeComponent("Leabel" + i), но что-то не выходит. Пожалуйсто напишите пример правильной реализации

Цитата(Klin @  7.4.2007,  08:08 Найти цитируемый пост)
Вот решение поставленной задачи:

Цитата(svyashennik @  6.4.2007,  19:07 Найти цитируемый пост)
Это да. Но перебираются все компоненты, а если мне надо, допустим, изменить Caption у Label2 и 3, то как это сделать цикле. 




--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Klin
Дата 7.4.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Если нужно изменть три компонента, то ни цикл ни FindComponent использовать вообще не стоит.

Цитата(Klin @  7.4.2007,  13:08 Найти цитируемый пост)
Вот решение поставленной задачи:


Цитата(svyashennik @  6.4.2007,  23:07 Найти цитируемый пост)
Есть форма на ней, скажем, едиты и лейблы (штук 10 каждого) и мне надо записать  в ричэдит содержание едитов и заголовки лейблов. 



--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
codelord
Дата 7.4.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Цитата(Klin @  7.4.2007,  12:21 Найти цитируемый пост)
Если нужно изменть три компонента, то ни цикл ни FindComponent использовать вообще не стоит.

а ты не допускаешь что компоненты могут быть созданы динамически?

допустим у нас есть некая переменная статик, в какой то момент она равна 10, 
мы создаем TLabel с именем  (Name = "Label"+AnsiString("наш статик") )
после чего хотим в совершенно другой функции задать ему значение скажем "тест",
как ты его будешь искать своим перебором? зная только имя, при этом учитывая что на форме он не один?


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Klin
Дата 7.4.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1938
Регистрация: 7.10.2002
Где: Краснодар

Репутация: 20
Всего: 25



Цитата(codelord @  7.4.2007,  17:38 Найти цитируемый пост)
 зная только имя

Как  было написано ранее имя такого типа Label + цифрь, отсекаем, Label и остается номер. Практически одно и тоже, только у меня расчитано на дополнительные параметры. 

з.ы. а если они на объекте типа TPanel расположены то, еще легко:
Код

 for (int n=0; n<Panel1->ControlCount; n++)
   RichEdit1->Lines->Add(((TLabel*)Panel1->Controls[n])->Caption);


p.s. А вообще, че спорим, оба способа имеют свой смысл в определенных ситуацих smile

Это сообщение отредактировал(а) Klin - 7.4.2007, 16:56


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
svyashennik
Дата 7.4.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 21.4.2006
Где: Питер

Репутация: нет
Всего: нет



   Ребят, куда-то Вы не туда полетели. Я конечно попробовал как говорил Klin с кастом и как mr. Anderson с Tag, НО!! В ричэдите выводится следующее: Label1  Label2  Label3  Edit1  Edit2  Edit3. 

   А мне надо так: Label1  Edit1  Label2  Edit2  Label3    Edit3. 
   И че делать!!???
PM MAIL ICQ   Вверх
codelord
Дата 7.4.2007, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Цитата(svyashennik @  7.4.2007,  16:51 Найти цитируемый пост)
 А мне надо так: Label1  Edit1  Label2  Edit2  Label3    Edit3. 
   И че делать!!??? 

[code=cppb]
подумать  smile 

решение уже прозвучало, переделать его под то что тебе нужно довольно просто
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
for( int i = 1;  i<=10; i++ ) {
 TLabel *label = (TLabel*)FindComponent("Label"+AnsiString(i));
 TEdit  *edit =(TEdit *)FindComponent("Edit"+AnsiString(i));
 RichEdit1->Lines->Add(label->Caption);
 RichEdit1->Lines->Add(edit->Text);
 }
}



--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
svyashennik
Дата 7.4.2007, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 21.4.2006
Где: Питер

Репутация: нет
Всего: нет



   Во-о-о-т наконецто написали то, что я и хотел с самого начала!!!!
   Спа-си-бо.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.