Тема: Перетворення (знаходження) об'єкта в рядок і наоборот

В Builder C++ можна написати так

TComponent *comp = FindComponent(Item->Caption);
  if (dynamic_cast<TWinControl *>(comp) != NULL)
    myActiveControl = dynamic_cast<TWinControl *>(comp);

myActiveControl - отримає об'єкт класу TWinControl де назва це рядок з Item->Caption
Тобто рядок можна перетворити в об'єкт будь-якого класу (Звичайно якщо такий об'єкт вже існує)

Є щось подібне в C++ ? а якщо ні то як можна поступити коли є багато об'єктів одного класу Image1, Image2 ... Image22 і потрібно їх пройти в циклі ?

Прихований текст
for(int index = 0;index<22;index++)
{
TImage *Image = dynamic_cast<TImage*>(FindComponent("Image" + IntToStr(index + 1)));

//Image = якась дія

}

Як можна зробити зворотнє перетворення тобто об'єкта в рядок хоча б методами Builder C++ ?

2 Востаннє редагувалося koala (07.11.2015 19:11:09)

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

Вітаю пана в реальному світі.
Мова, яка використовується в IDE C++ Builder, зветься C++. Там тільки бібліотека специфічна, VCL. Тому питання "Є щось подібне в C++" не має сенсу; мабуть, ви хотіли спитати про якусь конкретну бібліотеку, але з телепатією тут, на форумі, кепсько.
Крім того, C++ - мова компільована, а не інтерпретована, на момент виконання змінних, функцій, об'єктів і т.д. вже не існує, є тільки пам'ять і байт-код в ній. Але через купу обмежених людей, які чомусь вивчили C++ (в виші більше нічого не давали, наприклад), а не JavaScript чи PHP чи ще щось інтерпретоване, але хочуть програмувати так, ніби це інтерпретована мова, в багато бібліотек додали засоби рефлексії, щоб робити отаке. Не треба так робити, будь ласка.
І так, називати об'єкти Ім'яТипу1, Ім'яТипу2, Ім'яТипу3 - страшний бидлокод від людей, що ще не вивчили масиви. Не треба вчити GUI перед масивами. Просто збирайте все, що вам треба, в масив, і ідіть по ньому... тим більше, що такий масив в VCL вже є - Components.
Ну і в жодному разі не "рядок перетворити в об'єкт будь-якого класу", а "отримати посилання на об'єкт за його назвою".
Що ж стосується "зворотнього перетворення" (тобто отримання назви змінної за об'єктом), то, вибачте, це просто властивіть Name. Але вона вам не потрібна.

Подякували: Betterthanyou1

3

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

Є щось подібне в C++ ?

Є. Це називається "Перетворення типів". Майже кожний компілятор на таке спроможний.

коли є багато об'єктів одного класу Image1, Image2 ... Image22 і потрібно їх пройти в циклі ?

Щодо Білдера найпростіще завернути ці об'єкти у массив, чибто TObjectList або їх аналоги (наприклад vector).
Доречі в Білдері є TImageList, которий стається у нагоді самє під час потреби накопичувати картинки у деякій контейнер.

Розкрий своє завдання щирше, тоді буде зрозуміло що тобі порадити.

Подякували: koala, Betterthanyou2

4 Востаннє редагувалося Betterthanyou (07.11.2015 20:25:55)

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

koala написав:

Вітаю пана в реальному світі.
Мова, яка використовується в IDE C++ Builder, зветься C++. Там тільки бібліотека специфічна, VCL. Тому питання "Є щось подібне в C++" не має сенсу; мабуть, ви хотіли спитати про якусь конкретну бібліотеку, але з телепатією тут, на форумі, кепсько.

В С++ є стандартні бібліотеки які є в будь якому середовищі я так розумію, от і я про них і питав (алей вже зрозумів що немає таких які перетворюють)

koala написав:

Крім того, C++ - мова компільована, а не інтерпретована, на момент виконання змінних, функцій, об'єктів і т.д. вже не існує, є тільки пам'ять і байт-код в ній. Але через купу обмежених людей, які чомусь вивчили C++ (в виші більше нічого не давали, наприклад), а не JavaScript чи PHP чи ще щось інтерпретоване, але хочуть програмувати так, ніби це інтерпретована мова, в багато бібліотек додали засоби рефлексії, щоб робити отаке. Не треба так робити, будь ласка.

В мене таке бажання появляється коли я працюю в білдері, все почалось з того що мені потрібно було об'єднати в кнопці плавну анімацію підсвічування, картинку і текст. Я довго підбирав вже існуючи компоненти кнопки і вони всі працювали не так як я хоті тому я вирішив створити власну. В GroupBox я помістив Image і Label, щоб вийшла анімація я створив таймер на 1 мс і помістив туди код який змінює колір кнопки поки вона не набуде потрібного кольору але подія наведення мишки працювала не стабільно оскільки там (GroupBox) були інші компоненти я використав WinApi функції що відстежувати мишку тепер мені потрібно викликати форми по натисканню на кнопку

for(int index=0;index<7;index++)
{

TGroupBox *box = dynamic_cast<TGroupBox*>(FindComponent("GroupBox" + IntToStr(index + 1)));

if(

(this->Left+box->Left+10)
 < cur_pos.x && cur_pos.x  <
(this->Left+box->Left+box->Width+10)

&&

(this->Top+box->Top+30)
 < cur_pos.y &&
cur_pos.y <
(this->Top+box->Top+box->Height+30)

)
{

(dynamic_cast<TForm*>(FindComponent("Form" + IntToStr(index + 1))))->Show();

}

}

помилка (22 рядок) Access violation at address 507C175B in module 'vcl220.bpl' тому я і питав про таке с++ (стандартних бібліотеках)

koala написав:

І так, називати об'єкти Ім'яТипу1, Ім'яТипу2, Ім'яТипу3 - страшний бидлокод від людей, що ще не вивчили масиви. Не треба вчити GUI перед масивами. Просто збирайте все, що вам треба, в масив, і ідіть по ньому... тим більше, що такий масив в VCL вже є - Components.

та знаю я що таке масив алей вписувати туди велику кількість об'єктів якось не хочеться

5 Востаннє редагувалося koala (07.11.2015 20:31:51)

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

По-перше, створіть власний компонент чи хоча б фрейм (TFrame) для такої кнопки. І цикли вже не будуть потрібні.
По-друге, dynamic_cast може повертати, крім об'єкту, NULL, якщо перетворення неможливе, а ви цього не перевіряєте.
А по-третє, у вас на формі є компоненти з назвами Form1, Form2 і т.д.?
Ну і по-четверте, що там у вас за математика така? Що ви намагаєтеся вирахувати?

6 Востаннє редагувалося Itari (07.11.2015 20:38:07)

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

вписувати туди велику кількість об'єктів якось не хочеться

А по-іншому тілько FindComponent(), котрий потребує RTTI, яка працює лише у Білдері\Делфі.
Хоча я не впевен, що подібной технології немає скажем у CLR або MFC, но я б не нехтував массивами. Не так вже там й складно їх наповнювати об'єктами, зате потім зручніще керувати хмарюганами компонентів  *OK*

мені потрібно було об'єднати в кнопці плавну анімацію підсвічування, картинку і текст.

Тоді використовуй не класичну кнопку, а щось, що дозволяє анимувати GIF зображення чи подібні своєчасні до нього. Самє на подібні випадки його и придумали.

7 Востаннє редагувалося Betterthanyou (07.11.2015 21:35:10)

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

koala написав:

По-перше, створіть власний компонент чи хоча б фрейм (TFrame) для такої кнопки. І цикли вже не будуть потрібні.

Спробую створити

koala написав:

По-друге, dynamic_cast може повертати, крім об'єкту, NULL, якщо перетворення неможливе, а ви цього не перевіряєте.

Так, чомусь повертає 0

koala написав:

А по-третє, у вас на формі є компоненти з назвами Form1, Form2 і т.д.?

Так під кожну кнопку. Є 8 кнопок 8 (+1 головна) Форм *.h файли підключені

koala написав:

Ну і по-четверте, що там у вас за математика така? Що ви намагаєтеся вирахувати?

я ж писав що через нестабільність стандартних подій (бо в GroupBox є Image і Label які викликають свої події) я використовую функції WinApi для відстеження миші

Itari написав:

Тоді використовуй не класичну кнопку, а щось, що дозволяє анимувати GIF зображення чи подібні своєчасні до нього. Самє на подібні випадки його и придумали.

Я ще не розібрався як використовувати анімацію GIF, Image анімацію не хоче включать (або я не знаю як так зробити), а Animate хоче avi а не GIF

8

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

Можливо у тебе Білдер із классу ХЕ, тоді мабудь Fire Monkey стане у пригоді?
Хоча вона не зовсім легка, але стосовно анімації там все по вищому розряду.

9

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

Betterthanyou написав:
koala написав:

А по-третє, у вас на формі є компоненти з назвами Form1, Form2 і т.д.?

Так під кожну кнопку. Є 8 кнопок 8 (+1 головна) Форм *.h файли підключені

НА ФОРМІ, пане, НА ФОРМІ. Не рефлексуйте, а читайте, що у вас питають.

10

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

Itari написав:

А по-іншому тілько FindComponent(), котрий потребує RTTI, яка працює лише у Білдері\Делфі.

RTTI є і в плюсах.

11

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

Arete написав:
Itari написав:

А по-іншому тілько FindComponent(), котрий потребує RTTI, яка працює лише у Білдері\Делфі.

RTTI є і в плюсах.

В плюсах є свій стандартний RTTI, а в VCL, оскільки це дельфова бібліотека - свій власний.

12 Востаннє редагувалося Betterthanyou (08.11.2015 14:51:43)

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

delete

13 Востаннє редагувалося Itari (08.11.2015 14:54:37)

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

Arete написав:
Itari написав:

А по-іншому тілько FindComponent(), котрий потребує RTTI, яка працює лише у Білдері\Делфі.

RTTI є і в плюсах.

А я і не кажу що його в плюсах немає.
У Білдера свій підхід, у інших - свій.

А де можна про це почитати

Що тобі треба? Ти можешь сказати чітко?
Ти пишешь у Білдері - чому б тобі не продовжити у ньому писати?
Тобто чому виникло питання про аналогію у других компіляторах, якщо твій проєкт розрахован саме не Білдер?

14

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

Itari написав:

Що тобі треба? Ти можешь сказати чітко?
Ти пишешь у Білдері - чому б тобі не продовжити у ньому писати?
Тобто чому виникло питання про аналогію у других компіляторах, якщо твій проєкт розрахован саме не Білдер?

Так я пишу в Білдері, ну якщо в (я ще не розібрався що там пише msdn) с++є щось таке то краще його вивчити, тому що в мене виникла помилка  Access violation at address 507C175B in module 'vcl220.bpl', ну добре я ще буду розбиратися з RTTI

15

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

тому що в мене виникла помилка  Access violation at address 507C175B in module 'vcl220.bpl'

А до чого тут аналогі із інших систем?  %)
Якщо є помилка - треба проводити debug, а не фантазувати на вільні теми.
Що таке "Трасування" знаєш? Як в Білдері його робити знаешь?

16 Востаннє редагувалося Betterthanyou (08.11.2015 16:31:56)

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

Itari написав:

тому що в мене виникла помилка  Access violation at address 507C175B in module 'vcl220.bpl'

А до чого тут аналогі із інших систем?  %)
Якщо є помилка - треба проводити debug, а не фантазувати на вільні теми.
Що таке "Трасування" знаєш? Як в Білдері його робити знаешь?

так що шукати debug-ером помилка зрозуміла form дорівнює 0

TForm *form = (dynamic_cast<TForm*>(FindComponent("Form" + IntToStr(index + 1))));

if(form!=NULL)
form->Show();

я шукаю рішення,як її виправити (тільки не пишіть що форми можна зібрати в масив я це знаю)

17 Востаннє редагувалося koala (08.11.2015 17:30:16)

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

Гаразд, скористаємося телепатією.
У вас на формі, з якої ви викликаєте FindComponent, немає компонентів з назвами Form1, Form2, Form3  і т.д., зате є інші форми з такими назвами. Відповідно, виклик FindComponent не повертає вам жодного компонента (очевидно, правда?); вам потрібно обирати потрібну форму з масиву Screen->Forms за її іменем (Screen->Forms[ i ]->Name), але краще - зберігати потрібну форму якимось чином прив'язаною до кнопки, наприклад, тримати посилання у змінній фрейму.

Подякували: Betterthanyou1

18 Востаннє редагувалося Itari (08.11.2015 17:24:28)

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

Ніяк не збагну навіщо шукати форму...
Яке в тебе завдання то? Може вже пора подробицями поділитися?
А то і справді так докотимось до "Шо у екстрасексів"

Подякували: Betterthanyou1

19 Востаннє редагувалося Betterthanyou (08.11.2015 17:46:53)

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

koala написав:

Гаразд, скористаємося телепатією.
вам потрібно обирати потрібну форму з масиву Screen->Forms за її іменем (Screen->Forms[ i ]->Name)

Ви чудовий екстрасенс, я вибачаюсь за свої незнання. Я не знав що це так просто я думав що потрібно робити власний масив TForm

20

Re: Перетворення (знаходження) об'єкта в рядок і наоборот

koala, Itari

Дякую. Я знаю що в Делфі  є RTTI, років зо 5 працював з Делфі. Та Itari так побудував речення що може скластися хибне враження що така "кілєрфіча" є лише в Білдері\Делфі:

А по-іншому тілько FindComponent(), котрий потребує RTTI, яка працює лише у Білдері\Делфі.