Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите перевести с Delphi на C++ 
:(
    Опции темы
SandiK
Дата 18.6.2015, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет. Так уж вышло, что написанное в этой теме http://forum.vingrad.ru/forum/topic-242277.html очень нужно на С++. Помогите, пожалуйста, перевести:

Код

procedure TfrmMain.CollapseAll(CatPanel: TCategoryPanel);
var
  i: integer;
  CP: TCategoryPanel;
begin
  CP := (FindComponent('CategoryPanel' + inttostr(i)) as TCategoryPanel);
  for i = 1 to CategoryPanelGroup1.Panels.Count do CP.Collapsed = (not (CP = CatPanel));  
end;

и
Код

procedure TfrmMain.CategoryPanelExpand(Sender: TObject);
var
  i: integer;
  CP: TCategoryPanel;
begin
  for i = 1 to CategoryPanelGroup1.Panels.Count do
  begin
    CP := (FindComponent('CategoryPanel' + inttostr(i)) as TCategoryPanel);
    CP.Collapsed = (not (CP = (Sender as TCategoryPanel)));
  end;
  CategoryPanelGroup1.Realign;
end;

PM MAIL   Вверх
rudolfninja
Дата 18.6.2015, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вы имеете в виду, что вам надо это все партировать в C++ Builder? Тогда вам в соответсвующую тему.
PM MAIL Skype   Вверх
borisbn
Дата 19.6.2015, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



В проект на C++ Builder можно добавить паскалевский файл и функции оттуда будут спокойно видны из Си++.

Это сообщение отредактировал(а) borisbn - 19.6.2015, 12:26


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
SandiK
Дата 19.6.2015, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

Код

void __fastcall TMainForm::CategoryPanelExpand(TObject *Sender)
{
 int i;
 TCategoryPanel *CP;
 for (i = 1; CategoryPanelGroup1->Panels->Count; );
   {
   CP == ((TCategoryPanel*)CategoryPanelGroup->FindComponent("CategoryPanel" + IntToStr(i)));
   CP->Collapsed = (! (CP = ((TCategoryPanel*)Sender)));
   }
   CategoryPanelGroup1->Realign();
}

PM MAIL   Вверх
feodorv
Дата 19.6.2015, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(SandiK @  19.6.2015,  18:00 Найти цитируемый пост)
но где-то явно есть ошибка, т.к. этот код приводит к зависанию приложения

В цикле не изменяется переменная цикла i. Да и не проверяется тоже. Отсюда и зависание.
В самом конце for(...) стоит точка с запятой, что отрезает от цикла весь блок {...}.

Добавлено через 10 минут и 43 секунды
Чего-то слишком много недоразумений для такого маленького отрывка кода. Поправлю то, что мне кажется неверным:
Код

void __fastcall TMainForm::CategoryPanelExpand( TObject *Sender )
{
  for ( int i = 1; i <= CategoryPanelGroup1->Panels->Count; ++i)
 {
   TCategoryPanel *CP = (TCategoryPanel *) CategoryPanelGroup->FindComponent( "CategoryPanel" + IntToStr(i) );
   CP->Collapsed = (CP != ((TCategoryPanel*) Sender));
  }
  CategoryPanelGroup1->Realign();
}

Касты стоит переделать под dynamic_cast/static_cast/reinterpret_cast.

Это сообщение отредактировал(а) feodorv - 19.6.2015, 19:33


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
SandiK
  Дата 9.7.2015, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(feodorv @ 19.6.2015,  19:32)
Код

void __fastcall TMainForm::CategoryPanelExpand( TObject *Sender )
{
  for ( int i = 1; i <= CategoryPanelGroup1->Panels->Count; ++i)
 {
   TCategoryPanel *CP = (TCategoryPanel *) CategoryPanelGroup->FindComponent( "CategoryPanel" + IntToStr(i) );
   CP->Collapsed = (CP != ((TCategoryPanel*) Sender));
  }
  CategoryPanelGroup1->Realign();
}

Касты стоит переделать под dynamic_cast/static_cast/reinterpret_cast.

Выскакивает в итоге ошибка "Access violation at address бла-бла-бла..."
Не имел никогда дел с этими кастами. Как это сделать?

PM MAIL   Вверх
Doga
Дата 9.7.2015, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привет.

Выход за границы массива на последнем цикле итерации, когда значение i будет равно CategoryPanelGroup1->Panels->Count, откуда и "Access violation at address бла-бла-бла...".
Максимально допустимое значение i не должно превышать CategoryPanelGroup1->Panels->Count - 1.

К тому же,  в  примере, по неизвестной причине, игнорируется элемент с индексом 0.

Код

void __fastcall TMainForm::CategoryPanelExpand( TObject *Sender ) 
{ 
  for ( int i = 0 /*???*/; i < CategoryPanelGroup1->Panels->Count; i++) 
  { 
    TCategoryPanel *CP = dynamic_cast<TCategoryPanel *>( (TObject *)CategoryPanelGroup->FindComponent( "CategoryPanel" + IntToStr(i + 1) ) ); 

    if (CP != NULL)
    { 
...  


IntToStr(i + 1) - нумерация компонентов, при создании их имён, обычно начинается с "1". 

dynamic_cast, в случае неудачи, возвращает 0.  С другой стороны, поскольку в данном контексте все классы-родители и их наследники известны, я не вижу большой необходимости в использовании этих операторов преобразования типа (dynamic_cast/static_cast/reinterpret_cast), тем более что безопасный из них только один - dynamic_cast. Да и он требует повышенных накладных расходов ресурса процессора, из за проверки этим оператором возможности преобразования.

Используйте версию IDE со встроенным отладчиком - очень полезная вещь при поиске причин возникновения Access violation. 



Это сообщение отредактировал(а) Doga - 9.7.2015, 13:47
PM MAIL WWW   Вверх
Doga
Дата 9.7.2015, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



И вообще. 
Если Вам нужно держать только одну развернутую CategoryPanel, то нет смысла искать их по имени:
Код

void __fastcall TForm1::CategoryPanelExpand(TObject *Sender)
{
  TCategoryPanel *SP = dynamic_cast <TCategoryPanel *> (Sender);

  if (SP != NULL) 
  {
    TCategoryPanel *CP;
  
    for (int i = 0; i < CategoryPanelGroup1->Panels->Count; i++)
    {
      CP = dynamic_cast <TCategoryPanel *> ((TObject *)CategoryPanelGroup1->Panels->Items[i]);

      if (CP != NULL) 
      {
        if (CP != SP) 
        {
          CP->Collapsed = true; 
        } 
        else 
        {
          CP->Collapsed = false; 
        }
      }
    }

    CategoryPanelGroup1->Realign();
  }
}

PM MAIL WWW   Вверх
SandiK
Дата 9.7.2015, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Doga @ 9.7.2015,  13:38)
И вообще. 
Если Вам нужно держать только одну развернутую CategoryPanel, то нет смысла искать их по имени...

Работает! Спасибо большое!  smile 
PM MAIL   Вверх
feodorv
Дата 9.7.2015, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Doga @  9.7.2015,  11:37 Найти цитируемый пост)
Выход за границы массива на последнем цикле итерации, когда значение i будет равно CategoryPanelGroup1->Panels->Count, откуда и "Access violation at address бла-бла-бла...".

Не понял  smile Какого массива?

Другое дело
Цитата(Doga @  9.7.2015,  13:38 Найти цитируемый пост)
      if (CP != NULL) 




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Doga
Дата 9.7.2015, 17:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 smile 
Согласен, выхода за границы массива не было. Сработал рефлекс на отсутствие " - 1" после "Count".  Access violation возникал при обращении к CP, которая инициализировалась значением NULL, возвращаемым методом FindComponent.  К сожалению, независимо от значения i. 


PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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