Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
 Re: от Delphi к CPP  [new]
petrav
Member

Откуда:
Сообщений: 2861
patrick1968
Так мне надо чтобы список элементов вектора стал пустым и в дальнейшем его надо было наполнять с нуля, а после clear() ранее занесенные элементы не удалились.

А как вы определили, что они не удалились?
3 апр 21, 16:38    [22303823]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Разобрался, спасибо.
Вот тут еще у меня заминка
есть фрагмент
void __fastcall TMainForm::Rec(TObject *SenderVal,TObject *SenderTime,double MaxValue,bool CColor)
{
 if (CColor == true)
   {
	(SenderVal as TEdit).Color = clRed;
	(SenderVal as TEdit).Font.Color = clWhite;
   }

}

кусок, что по IF оставил написанным на Delphi, а как такая подстановка будет в CBuilder
3 апр 21, 16:40    [22303824]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

dynamic_cast

Posted via ActualForum NNTP Server 1.5

3 апр 21, 18:05    [22303845]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Выглядеть будет так?
dynamic_cast<TEdit*>(SenderVal)->Color = clRed;
3 апр 21, 18:31    [22303859]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Пётр Седов
Member

Откуда: Санкт-Петербург
Сообщений: 700
patrick1968, dynamic_cast<TEdit*>(...) проверяет реальный тип объекта, правда ли что объект класса TEdit, или производного. Если нет, то возвращает NULL (nullptr в современном C++). static_cast<TEdit*>(...) не проверяет реальный тип объекта, а верит на слово программисту. Поэтому можно так:
#include <assert.h>
...
assert(dynamic_cast<TEdit*>(SenderVal) != NULL); // объект должен быть класса TEdit, или производного
TEdit* e = static_cast<TEdit*>(SenderVal);
e->Color = clRed;
e->Font->Color = clWhite;
assert -- отладочная проверка для debug build-а. В release build-е (когда определён глобальный макрос NDEBUG) выражение в assert-е не вычисляется.
3 апр 21, 22:10    [22303941]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
petrav
Member

Откуда:
Сообщений: 2861
Пётр Седов,

Мне иногда кажется, что я копипаст вижу "аналоговым" способом. Как картинку. Даже не читая кода.
3 апр 21, 22:16    [22303946]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Пётр Седов
Если нет, то возвращает NULL (nullptr в современном C++).

Он в принципе способен выкидывать std::bad_cast и только в этом случае является аналогом
дельфийского as.

Posted via ActualForum NNTP Server 1.5

4 апр 21, 00:39    [22303981]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Пётр Седов
Member

Откуда: Санкт-Петербург
Сообщений: 700
Dimitry Sibiryakov
Он в принципе способен выкидывать std::bad_cast
Да, если dynamic_cast ссылок, а не указателей.

Dimitry Sibiryakov
и только в этом случае является аналогом дельфийского as.
Судя по коду, программист явно уверен, что объект класса TEdit, поэтому я бы и в Delphi написал без оператора as:
var
  e: TEdit;
begin
  Assert(SenderVal is TEdit); // проверяется реальный тип объекта, но только в debug build-е
  e := TEdit(SenderVal); // не проверяется реальный тип объекта
  e.Color := clRed;
  e.Font.Color := clWhite;
end;
4 апр 21, 01:17    [22303992]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Добрый вечер.
Столкнулся тут я снова с непонятным. Нужно было мне настроить отображение ячеек StringGrid, ну я по обыкновению
void __fastcall TMainForm::sgMainDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
          TGridDrawState State)
{
  if (ACol = 1) { sgMain->Canvas->Brush.Color = clWhite; }
			  else { sgMain->Canvas->Brush->Color = clLime; }
  sgMain->Canvas->FillRect(Rect);
  if (ACol = 1) { sgMain->Canvas->Font->Color = clBlack; }
			  else { sgMain->Canvas->Font->Color = clBlue; }
  text = sgMain->Cells[ACol, ARow];
  DrawText(sgMain.Canvas.Handle, PChar(text), Length(text), Rect, DT_CENTER or DT_VCENTER);

}


на что у меня на заголовке процедуры вываливается ошибка

[bcc32 Error] Main.cpp(808): E2015 Ambiguity between 'Gridseh::TGridDrawState' and 'Vcl::Grids::TGridDrawState'

Я так понял, тут какое то разночтение типов, только что с этим делать? Заранее благодарен.
11 апр 21, 22:14    [22307329]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
patrick1968,

явно специфицировать тип параметра Gridseh::TGridDrawState State
12 апр 21, 00:49    [22307365]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Пётр Седов
Member

Откуда: Санкт-Петербург
Сообщений: 700
patrick1968
if (ACol = 1) ...
Надо так:
if (ACol == 1) ...
12 апр 21, 01:24    [22307372]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Спасибо за подсказки - проделал
в заголовке MainForm.h также прописал

void __fastcall sgMainDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
Gridseh::TGridDrawState State);

но получил ошибку

[bcc32 Error] Main.h(118): E2090 Qualifier 'Gridseh' is not a class or namespace name
12 апр 21, 21:29    [22307858]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
очевидно надо как-то правильно прописать пространство имен?
12 апр 21, 21:32    [22307859]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3722
Старая история GridsEh.pas (не находит)
12 апр 21, 22:20    [22307869]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Пётр Седов
Member

Откуда: Санкт-Петербург
Сообщений: 700
patrick1968, надо в MainForm.h написать include до прототипа функции:
// MainForm.h
...
#include <заголовочный файл, в котором определяется namespace Gridseh>
...
// прототип функции
void __fastcall sgMainDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
Gridseh::TGridDrawState State);
...
В заголовочном файле (который написан авторами библиотеки) должно быть это:
namespace Gridseh
13 апр 21, 02:16    [22307914]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Добрый день. Спасибо за разъяснение
просто сделал
void __fastcall sgMainDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
Grids::TGridDrawState State);

и всё сработало как надо
13 апр 21, 13:34    [22308185]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Добрый день.

Еще ситуация, непонятная получается. Регулярно при запуске приложения возникает ошибка "access violation". Но потом спустя время, ну может при перезагрузке IDE или компа. Не изменяя никак приложение всё нормально. Чем это объяснено. Уж больно глюк напоминает?
15 апр 21, 15:59    [22309414]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
White Owl
Member

Откуда:
Сообщений: 12682
patrick1968
Добрый день.

Еще ситуация, непонятная получается. Регулярно при запуске приложения возникает ошибка "access violation". Но потом спустя время, ну может при перезагрузке IDE или компа. Не изменяя никак приложение всё нормально. Чем это объяснено. Уж больно глюк напоминает?
Переменные забываешь обнулить при старте программы.
15 апр 21, 16:10    [22309420]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

patrick1968
Уж больно глюк напоминает?

Это и есть глюк. В твоей программе. Отлаживайся. Адрес в ошибке выводится, сопоставить его
с исходниками - простая техническая задача.

Posted via ActualForum NNTP Server 1.5

15 апр 21, 16:22    [22309429]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
patrick1968,
Ловить надо. Это наша работа.
Оберни код при старте в try и лови
15 апр 21, 16:53    [22309444]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

AV не ловится try. Да и толку от его поимки ещё меньше, чем от простого сообщения об ошибке.

Posted via ActualForum NNTP Server 1.5

15 апр 21, 17:04    [22309447]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Dimitry Sibiryakov
AV не ловится try. Да и толку от его поимки ещё меньше, чем от простого сообщения об ошибке.
каждый судит со своей колокольни.
Ты новичку предложил дамп расшифровать.
Я предложил занятся пошаговой отладкой.
Дай тест на то что не ловится. Я проверю.
15 апр 21, 17:47    [22309466]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Картинка с другого сайта.
15 апр 21, 17:49    [22309468]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921
PetroNotC Sharp
Дай тест на то что не ловится.

int main()
{
   try
   {
     int a = *(int*)0;
   }
   catch(...)
   {}
}

Ну и удачи в отладке этого:
int a = *(int*)0;

int main()
{
}


Сообщение было отредактировано: 15 апр 21, 17:44
15 апр 21, 17:51    [22309469]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Dimitry Sibiryakov,
Пошаговая работает
15 апр 21, 17:59    [22309473]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / C++ Ответить