реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> можно ли обращаться к компонентам в среде BorlandC в цикле?
Mozart
сообщение Apr 18 2008, 18:54
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829



суть проблемы.
есть 4ре компонента размещённые на форме, к примеру Panel1, Panel2, Panel3, Panel4. и есть массив который выводится на эти панели к примеру int temp[4];
можно ли написать следующий код в цикле
Код
Panel1->Caption = IntToStr(temp[0]);
Panel2->Caption = IntToStr(temp[1]);
Panel3->Caption = IntToStr(temp[2]);
Panel4->Caption = IntToStr(temp[3]);


среда разработки BorlandC++ 6.0 в WinXp


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 18 2008, 20:25
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Mozart @ Apr 18 2008, 20:54) *
среда разработки BorlandC++ 6.0 в WinXp

Moderator
Вы хоть чуть-чуть дайте себе труд узнать где находится BCC и где программирование DSP, прежде, чем писать. Тему перенес.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Apr 18 2008, 21:01
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Цитата(Mozart @ Apr 18 2008, 22:54) *
суть проблемы.
есть 4ре компонента размещённые на форме, к примеру Panel1, Panel2, Panel3, Panel4. и есть массив который выводится на эти панели к примеру int temp[4];
можно ли написать следующий код в цикле
Код
Panel1->Caption = IntToStr(temp[0]);
Panel2->Caption = IntToStr(temp[1]);
Panel3->Caption = IntToStr(temp[2]);
Panel4->Caption = IntToStr(temp[3]);


среда разработки BorlandC++ 6.0 в WinXp



В принципе, если переменные Panel1..Panel4 описаны в классе одна за другой, можно так:
Код
TPanel **panels = &this->Panel1;

for (int i = 0; i < 4; i++)
{
    panels[i]->Caption = IntToStr(i) + " панель";
}


Но лично я, для успокоения души создавал еще один массив, в который копировал нужные элементы, и работал уже с этим массивом.
Go to the top of the page
 
+Quote Post
Mozart
сообщение Apr 18 2008, 21:18
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829



Цитата(zltigo @ Apr 19 2008, 00:25) *
Moderator
Вы хоть чуть-чуть дайте себе труд узнать где находится BCC и где программирование DSP, прежде, чем писать. Тему перенес.

простите не заметил 05.gif ... сделаю всё возможное чтобы это не повторилось...

Цитата
Но лично я, для успокоения души создавал еще один массив, в который копировал нужные элементы, и работал уже с этим массивом.

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


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Apr 18 2008, 21:46
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Цитата(Mozart @ Apr 19 2008, 01:18) *
у меня тоже потом появилась такая мысль... а другой способ есть?? может быть это как-то можно сделать стандратами языка??


Ну я же и говорю... Допустим, у нас форма описана как:

Код
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TPanel *Panel1;
    TPanel *Panel2;
    TPanel *Panel3;
    TPanel *Panel4;
private:    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
};


Тогда (в методе класса TForm1) (&this->Panel1)[0] это this->Panel1, (&this->Panel1)[1] это this->Panel2, и т.д. Повторюсь, это все верно только если Panel1..Panel4 описаны в классе последовательно. Если нет, то помочь может пожалуй только создание дополнительно массива.

Описать это все массивом как поле класса мне не представляется возможным, там не случайно вставлена строчка "IDE-managed Components"
Go to the top of the page
 
+Quote Post
Mozart
сообщение Apr 18 2008, 22:29
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829



Цитата(Aesthete Animus @ Apr 19 2008, 01:46) *
Ну я же и говорю... Допустим, у нас форма описана как:

Код
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TPanel *Panel1;
    TPanel *Panel2;
    TPanel *Panel3;
    TPanel *Panel4;
private:    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
};


Тогда (в методе класса TForm1) (&this->Panel1)[0] это this->Panel1, (&this->Panel1)[1] это this->Panel2, и т.д. Повторюсь, это все верно только если Panel1..Panel4 описаны в классе последовательно. Если нет, то помочь может пожалуй только создание дополнительно массива.

Описать это все массивом как поле класса мне не представляется возможным, там не случайно вставлена строчка "IDE-managed Components"

всё допёрло... если в классе панели описаны не последовательно, то что собственно мешает нам собственными руками их переставить местами и пересобрать проект?

вот такой получился проект, при чём местами переставил, и всё ок...
Код
    TPanel **ptrPanel;
   ptrPanel = &Panel1;
    for (int i =0; i < 4; i++)
   {
        ptrPanel[i]->Caption = IntToStr(i);
   }

спасибо!!!

Сообщение отредактировал Mozart - Apr 18 2008, 22:43


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Apr 18 2008, 23:27
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



2Mozart
Всегда пожалуйста smile.gif
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Apr 20 2008, 22:25
Сообщение #8


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата(Mozart @ Apr 18 2008, 21:54) *
суть проблемы.
есть 4ре компонента размещённые на форме, к примеру Panel1, Panel2, Panel3, Panel4. и есть массив который выводится на эти панели к примеру int temp[4];
можно ли написать следующий код в цикле
Код
Panel1->Caption = IntToStr(temp[0]);
Panel2->Caption = IntToStr(temp[1]);
Panel3->Caption = IntToStr(temp[2]);
Panel4->Caption = IntToStr(temp[3]);


среда разработки BorlandC++ 6.0 в WinXp

К примеру вот такой код
Код
    for(int i=0;i<Form1->ComponentCount;i++){
        ShowMessage(Form1->Components[i]->Name);
    }

покажет имена всех компонентов на форме.
А вот такой:
Код
TPanel *Panel;
    for(int i=0;i<Form1->ComponentCount;i++){
        if(Form1->Components[i]->Name=="Panel1")
        Panel=(TPanel *)Form1->Components[i];
        Panel->Caption="Изменился caption";
    }

Ндаа, неудобно по имени Panel1, Panel2...
Щас по классу обратимся к ним:
Код
TPanel *Panel;
    for(int i=0;i<Form1->ComponentCount;i++){
        if((AnsiString)Form1->Components[i]->ClassName()=="TPanel"){
                Panel=(TPanel *)Form1->Components[i];
                Panel->Caption="Изменился caption всех панелей на форме)";
        }
    }

Вообще универсальный метод))
Эххх Делфи вспомнил smile.gif Там всё также было )


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 21 2008, 04:58
Сообщение #9


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Mozart @ Apr 19 2008, 00:54) *
можно ли написать следующий код в цикле
Код
Panel1->Caption = IntToStr(temp[0]);
Panel2->Caption = IntToStr(temp[1]);
Panel3->Caption = IntToStr(temp[2]);
Panel4->Caption = IntToStr(temp[3]);


среда разработки BorlandC++ 6.0 в WinXp


Вот для Дельфи:
Код
for i := 0 to 3 do
  Form1.FindComponent('Panel' + IntToStr(i+1)).Caption := IntToStr(temp[0]);


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Apr 21 2008, 08:00
Сообщение #10


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата(AHTOXA @ Apr 21 2008, 07:58) *
Вот для Дельфи:
Код
for i := 0 to 3 do
  Form1.FindComponent('Panel' + IntToStr(i+1)).Caption := IntToStr(temp[0]);

Разницы нет - и на билдере такое прокатит без проблем)
Кстати код as is работать сейчас не будет. Нехватает приведения к типу, у TComponent нет caption, на сколько я помню.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 17:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01478 секунд с 7
ELECTRONIX ©2004-2016