powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / от Delphi к CPP
25 сообщений из 93, страница 2 из 4
от Delphi к CPP
    #40054521
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Хотя проблема даже не в проекте. Т.к. создаю новый проект и запускаю выполнение. Должна ведь просто открыться пустая форма, а в результате
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40054536
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40054683
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, помогло
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40057282
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
И снова столкнулся с непонятной проблемой - нужно открыть файл Excel (не понял формирование строки)
это так с подстановкой - файл существует
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  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());


в результате ошибка - почему то преображается строка
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40057317
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
Код: plaintext
1.
  App.OlePropertyGet("Workbooks").OlePropertyGet("Open",FName.c_str());

Тут скорее надо OleProcedure.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40057345
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал ваш совет, к сожалению ситуация не поменялось и то же самое сообщение об ошибке (как-то строка с именем странно там представлена)
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40057396
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968,

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

А то String это одно, AsAnsiString другое, а Variant.BSTR (параметр OlePropertyGet) - третье.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40057444
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl, если там в пути файла только символы из ASCII-подмножества (английские буквы, цифры), то по идее должно быть без разницы, ANSI-кодировка (code page 1251, если Windows настроена на русский язык) или кодировка UTF-16. Вот это очень странно:
patrick1968
Код: plaintext
1.
FName = "d:\\Certif_353_20180625103947.xlsx";

а в сообщении об ошибке пишется «d:\Certif_353_201.xlsx». То есть получается часть «80625103947» выкидывается?
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40057952
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов
patrick1968
Код: plaintext
1.
2.
3.
   struct _TypeDevice {
	...
       } TypeDevice;

Надо так:
Код: plaintext
1.
2.
3.
struct TypeDevice {
  ...
};

Delphi-ийский тип single соответствует C++-ному типу float (размер 4 байта).

Оборачивать структуру TypeDevice в класс, производный от класса TObject, необязательно. Перепишите Delphi-код без with, в C++ аналога нет. Потом всё просто. В цикле:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// создаём экземпляр структуры 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-а:
Код: plaintext
1.
TypeDevice* info = reinterpret_cast<TypeDevice*>(cbTypeDevice->Items->Objects[cbTypeDevice->ItemIndex]);


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

Можно это не делать, но тогда будет утечка памяти.



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


В переменную записывается всегда последний элемент Combo, хотя визуально всё верно и последовательность отображения правильная. Из делфи также понятно, что ItemIndex - это индекс выбранного элемента и он правильное значение имеет, а вот вся остальная информация неверная
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40057953
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит ты где-то испортил тот объект на который указывает этот указатель.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40058000
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может здесь только, больше нигде не трогается
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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 формируется из запроса
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40058003
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще такое преобразование
MaxVal = StrToFloat(StringReplace(edTr11->Text,".",",",[rfReplaceAll,rfIgnoreCase]));
выдает синтаксическую ощибку
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40058015
didgik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
И еще такое преобразование
MaxVal = StrToFloat(StringReplace(edTr11->Text,".",",",[rfReplaceAll,rfIgnoreCase]));
выдает синтаксическую ощибку


TReplaceFlags() << rfReplaceAll << rfIgnoreCase
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40058040
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968тут Combo формируется из запроса

И в точности как ты и написал в этом коде: значение каждой следующей записи заменяет
предыдущие. И так до последней записи. ЧиТД.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40058043
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
В переменную записывается всегда последний элемент Combo,
Потому что у вас один экземпляр структуры TypeDevice для всех item-ов combo box-а, а надо на каждой итерации цикла создавать новый экземпляр:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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-а лучше сделать отдельный метод:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
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();
}
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40058281
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

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


проверяю на выходе всё верно -6.5
далее это число пишу в ячейку Excel (тип общий)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
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" Почему так?
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40058369
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
Но в итоге в ячейку записывается строка "-6,58229" Почему так?
Потому что ' %' (с одинарными кавычками) -- это целочисленный литерал со значением 8229. А чтобы был строковый литерал, надо писать двойные кавычки:
Код: plaintext
1.
RecCell( 34, 20, FloatToStrF(PC, ffFixed, 5, 1) + " %");
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40058649
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял. спасибо сам невнимательный
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40059122
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Еще прошу помощи. Задачка банальная, но что-то сходу в интернете, ничего подходящего не нашел для примера
нужно создать динамический массив переменной длины, т.е. в начале не знаем сколько будет элементов, каждый элемент float и затем
в цикле увеличивать размерность на 1 и заполнять каким-нибудь новым значением, ну и потом очистить память. Заранее спасибо.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40059123
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гугли std::vector
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40059148
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
patrick1968
Добрый день. Еще прошу помощи. Задачка банальная, но что-то сходу в интернете, ничего подходящего не нашел для примера
нужно создать динамический массив переменной длины, т.е. в начале не знаем сколько будет элементов, каждый элемент float и затем
в цикле увеличивать размерность на 1 и заполнять каким-нибудь новым значением, ну и потом очистить память. Заранее спасибо.

Расскажите, пожалуйста - кто и зачем заставляет вас решать такие нечеловечески сложные задачи?
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40059283
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю последний пост - это сарказм. Очевидно написал его человек всезнающий и всемогущий, но которому абсолютно нечем заняться, но есть дикое желание сделать гадость.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  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()?
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40059299
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968Проверяю, после очистки, а там как было 4 элемента, так и осталось

Не тем методом проверяешь. Вкуривай разницу между size() и capacity().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40059329
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так мне надо чтобы список элементов вектора стал пустым и в дальнейшем его надо было наполнять с нуля, а после clear() ранее занесенные элементы не удалились.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40059336
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удалились. Повторяю медленно: вкуривай разницу между size() и capacity() .
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 93, страница 2 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / от Delphi к CPP
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]