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

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

Хотя проблема даже не в проекте. Т.к. создаю новый проект и запускаю выполнение. Должна ведь просто открыться пустая форма, а в результате

К сообщению приложен файл. Размер - 10Kb
17 мар 21, 12:35    [22296126]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Siemargl
Member

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

https://stackoverflow.com/questions/28929516/how-to-fix-lme288-unknown-heap-name-warning

Надо обновиться
17 мар 21, 12:50    [22296147]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Спасибо, помогло
17 мар 21, 17:35    [22296412]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Добрый день.
И снова столкнулся с непонятной проблемой - нужно открыть файл Excel (не понял формирование строки)
это так с подстановкой - файл существует
  Variant App;
  String FName = MainDataModule->OutPath + MainDataModule->qMeas->FieldByName("FileName")->AsAnsiString;
  FName = "d:\\Certif_353_20180625103947.xlsx";
  try {
	   App = CreateOleObject("Excel.Application");
  } catch (...) {
   Application->MessageBoxW(L"Невозможно открыть Microsoft Excel!"
							L"Возможно, Excel не установлен на компьютере.",
							L"Ошибка",MB_OK+MB_ICONERROR);
  }
  App.OlePropertyGet("Workbooks").OlePropertyGet("Open",FName.c_str());

в результате ошибка - почему то преображается строка

К сообщению приложен файл. Размер - 13Kb
26 мар 21, 21:50    [22300584]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Пётр Седов
Member

Откуда: Санкт-Петербург
Сообщений: 700
patrick1968
  App.OlePropertyGet("Workbooks").OlePropertyGet("Open",FName.c_str());
Тут скорее надо OleProcedure.
27 мар 21, 01:32    [22300648]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Попробовал ваш совет, к сожалению ситуация не поменялось и то же самое сообщение об ошибке (как-то строка с именем странно там представлена)
27 мар 21, 10:45    [22300693]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Siemargl
Member

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

Программа Юникодная ?

А то String это одно, AsAnsiString другое, а Variant.BSTR (параметр OlePropertyGet) - третье.

Сообщение было отредактировано: 27 мар 21, 16:05
27 мар 21, 16:09    [22300798]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Пётр Седов
Member

Откуда: Санкт-Петербург
Сообщений: 700
Siemargl, если там в пути файла только символы из ASCII-подмножества (английские буквы, цифры), то по идее должно быть без разницы, ANSI-кодировка (code page 1251, если Windows настроена на русский язык) или кодировка UTF-16. Вот это очень странно:
patrick1968
FName = "d:\\Certif_353_20180625103947.xlsx";
а в сообщении об ошибке пишется «d:\Certif_353_201.xlsx». То есть получается часть «80625103947» выкидывается?
27 мар 21, 20:57    [22300904]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Пётр Седов
patrick1968
   struct _TypeDevice {
	...
       } TypeDevice;
Надо так:
struct TypeDevice {
  ...
};
Delphi-ийский тип single соответствует C++-ному типу float (размер 4 байта).

Оборачивать структуру TypeDevice в класс, производный от класса TObject, необязательно. Перепишите Delphi-код без with, в C++ аналога нет. Потом всё просто. В цикле:
// создаём экземпляр структуры TypeDevice
TypeDevice* info = new TypeDevice;
// достаём поля
info->TypeID = FieldByName("TypeID")->AsInteger;
...

// добавляем info в combo box
cbTypeDevice->Items->AddObject(FieldByName("Name")->AsString + " " + FieldByName("Article")->AsString, reinterpret_cast<TObject*>(info));

Потом, чтобы достать info из combo box-а:
TypeDevice* info = reinterpret_cast<TypeDevice*>(cbTypeDevice->Items->Objects[cbTypeDevice->ItemIndex]);

Потом, по-хорошему, перед уничтожением combo box-а, надо пройтись в цикле, и уничтожить все созданные экземпляры структуры TypeDevice:
for (int i = 0; i < cbTypeDevice->Items->Count; i++) {
  TypeDevice* info = reinterpret_cast<TypeDevice*>(cbTypeDevice->Items->Objects[i]);
  delete info;
}
Можно это не делать, но тогда будет утечка памяти.



Добрался в программе до момента когда необходимо прочитать из Combo, выбрал элемент и при
  TypeDevice* info = reinterpret_cast<TypeDevice*>(cbTypeDevice->Items->Objects[cbTypeDevice->ItemIndex]);

В переменную записывается всегда последний элемент Combo, хотя визуально всё верно и последовательность отображения правильная. Из делфи также понятно, что ItemIndex - это индекс выбранного элемента и он правильное значение имеет, а вот вся остальная информация неверная
29 мар 21, 19:13    [22301644]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Dimitry Sibiryakov
Member

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

Значит ты где-то испортил тот объект на который указывает этот указатель.

Posted via ActualForum NNTP Server 1.5

29 мар 21, 19:22    [22301647]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Может здесь только, больше нигде не трогается
MainDataModule->qTypeDevice->First();
do
{
 info->TypeID = MainDataModule->qTypeDevice->FieldByName("TypeID")->AsInteger;
 info->Name = MainDataModule->qTypeDevice->FieldByName("Name")->AsString;
 info->Article = MainDataModule->qTypeDevice->FieldByName("Article")->AsString;
 info->Mark = MainDataModule->qTypeDevice->FieldByName("Mark")->AsString;
 info->MinMeas = MainDataModule->qTypeDevice->FieldByName("MinMeas")->AsFloat;
 info->MaxMeas = MainDataModule->qTypeDevice->FieldByName("MaxMeas")->AsFloat;
 info->PC20 = MainDataModule->qTypeDevice->FieldByName("PC20")->AsFloat;
 info->PC60 = MainDataModule->qTypeDevice->FieldByName("PC60")->AsFloat;
 info->PC100 = MainDataModule->qTypeDevice->FieldByName("PC100")->AsFloat;
 info->Delta = MainDataModule->qTypeDevice->FieldByName("Delta")->AsFloat;
 cbTypeDevice->Items->AddObject(MainDataModule->qTypeDevice->FieldByName("Name")->AsString + " " + MainDataModule->qTypeDevice->FieldByName("Article")->AsString, reinterpret_cast<TObject*>(info));
 MainDataModule->qTypeDevice->Next();
} while (MainDataModule->qTypeDevice->Eof == FALSE);
 MainDataModule->qTypeDevice->Close();

тут Combo формируется из запроса
29 мар 21, 22:16    [22301713]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
И еще такое преобразование
MaxVal = StrToFloat(StringReplace(edTr11->Text,".",",",[rfReplaceAll,rfIgnoreCase]));
выдает синтаксическую ощибку
29 мар 21, 22:35    [22301721]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
didgik
Member

Откуда:
Сообщений: 968
patrick1968
И еще такое преобразование
MaxVal = StrToFloat(StringReplace(edTr11->Text,".",",",[rfReplaceAll,rfIgnoreCase]));
выдает синтаксическую ощибку


TReplaceFlags() << rfReplaceAll << rfIgnoreCase
29 мар 21, 23:08    [22301737]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Dimitry Sibiryakov
Member

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

patrick1968
тут Combo формируется из запроса

И в точности как ты и написал в этом коде: значение каждой следующей записи заменяет
предыдущие. И так до последней записи. ЧиТД.

Posted via ActualForum NNTP Server 1.5

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

Откуда: Санкт-Петербург
Сообщений: 700
patrick1968
В переменную записывается всегда последний элемент Combo,
Потому что у вас один экземпляр структуры TypeDevice для всех item-ов combo box-а, а надо на каждой итерации цикла создавать новый экземпляр:
MainDataModule->qTypeDevice->First();
do {
  TypeDevice* info = new TypeDevice;
  info->TypeID = MainDataModule->qTypeDevice->FieldByName("TypeID")->AsInteger;
  ...
  info->Delta = MainDataModule->qTypeDevice->FieldByName("Delta")->AsFloat;
  cbTypeDevice->Items->AddObject(MainDataModule->qTypeDevice->FieldByName("Name")->AsString + " " + MainDataModule->qTypeDevice->FieldByName("Article")->AsString, reinterpret_cast<TObject*>(info));
  MainDataModule->qTypeDevice->Next();
} while (MainDataModule->qTypeDevice->Eof == FALSE);
MainDataModule->qTypeDevice->Close();

Кстати, для очистки combo box-а лучше сделать отдельный метод:
void TMyForm::ClearDevices() {
  for (int i = 0; i < cbTypeDevice->Items->Count; i++) {
    TypeDevice* info = reinterpret_cast<TypeDevice*>(cbTypeDevice->Items->Objects[i]);
    delete info;
  }
  cbTypeDevice->Items->Clear();
}
30 мар 21, 00:54    [22301772]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

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

Все советы помогли - огромное спасибо.
В дальнейшей работе столкнулся еще с одной вещью, наверное пустяк для профи
есть оператор
  PC = RoundTo((-1)* abs((info->PC20 - CurVal) * 100 / info->PC20), -1);

проверяю на выходе всё верно -6.5
далее это число пишу в ячейку Excel (тип общий)
RecCell( 34, 20, FloatToStrF(PC, ffFixed, 5, 1) + ' %');

void __fastcall TMainForm::RecCell(int row, int col, AnsiString MyText)
{
 Cll = Sht.OlePropertyGet("Cells").OlePropertyGet("Item", row,col); 
 Cll.OlePropertySet("Value", WideString(MyText));
}


Но в итоге в ячейку записывается строка "-6,58229" Почему так?
30 мар 21, 16:08    [22302101]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Пётр Седов
Member

Откуда: Санкт-Петербург
Сообщений: 700
patrick1968
Но в итоге в ячейку записывается строка "-6,58229" Почему так?
Потому что ' %' (с одинарными кавычками) -- это целочисленный литерал со значением 8229. А чтобы был строковый литерал, надо писать двойные кавычки:
RecCell( 34, 20, FloatToStrF(PC, ffFixed, 5, 1) + " %");
31 мар 21, 01:22    [22302290]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Понял. спасибо сам невнимательный
31 мар 21, 18:42    [22302673]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Добрый день. Еще прошу помощи. Задачка банальная, но что-то сходу в интернете, ничего подходящего не нашел для примера
нужно создать динамический массив переменной длины, т.е. в начале не знаем сколько будет элементов, каждый элемент float и затем
в цикле увеличивать размерность на 1 и заполнять каким-нибудь новым значением, ну и потом очистить память. Заранее спасибо.
2 апр 21, 14:47    [22303408]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Dima T
Member

Откуда:
Сообщений: 15689
Гугли std::vector
2 апр 21, 14:54    [22303409]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1966
patrick1968
Добрый день. Еще прошу помощи. Задачка банальная, но что-то сходу в интернете, ничего подходящего не нашел для примера
нужно создать динамический массив переменной длины, т.е. в начале не знаем сколько будет элементов, каждый элемент float и затем
в цикле увеличивать размерность на 1 и заполнять каким-нибудь новым значением, ну и потом очистить память. Заранее спасибо.

Расскажите, пожалуйста - кто и зачем заставляет вас решать такие нечеловечески сложные задачи?
2 апр 21, 16:05    [22303447]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Я так понимаю последний пост - это сарказм. Очевидно написал его человек всезнающий и всемогущий, но которому абсолютно нечем заняться, но есть дикое желание сделать гадость.

Погуглил по векторам, в принципе понятно и приемлемо за одним исключением, создал вектор и заполнил числами

  std::vector<int> v;
  v.push_back(10);
  v.push_back(5);
  v.push_back(11);
  v.push_back(0);

  v.clear();


Проверяю, после очистки, а там как было 4 элемента, так и осталось (вот здесь непонятно), что неужели правильнее четыре раза делать pop_back()?
3 апр 21, 12:23    [22303682]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Dimitry Sibiryakov
Member

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

patrick1968
Проверяю, после очистки, а там как было 4 элемента, так и осталось

Не тем методом проверяешь. Вкуривай разницу между size() и capacity().

Posted via ActualForum NNTP Server 1.5

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

Откуда:
Сообщений: 500
Так мне надо чтобы список элементов вектора стал пустым и в дальнейшем его надо было наполнять с нуля, а после clear() ранее занесенные элементы не удалились.
3 апр 21, 14:38    [22303768]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Dimitry Sibiryakov
Member

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

Удалились. Повторяю медленно: вкуривай разницу между size() и capacity().

Posted via ActualForum NNTP Server 1.5

3 апр 21, 14:58    [22303780]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / C++ Ответить