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

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

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

uses IniFiles;
...
var PSIni : TInifile;
...
   PSIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'PNG.ini');


Как это будет выглядеть на Си. Сорри за банальность. Спасибо.

Сообщение было отредактировано: 10 мар 21, 18:53
2 мар 21, 17:09    [22288523]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
ъъъъъ
Member

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

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


uses IniFiles;
...
var PSIni : TInifile;
...
PSIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'PNG.ini');

Как это будет выглядеть на Си. Сорри за банальность. Спасибо.

Это смотря для чего тебе нужен TIniFile.
Например, запись строки данных в .ini фал может выглядеть так:
#include <Windows.h>
#include <filesystem>
#include <iostream>
using namespace std;

int wmain(int argc, wchar_t * argv[])
{
    filesystem::path curr = filesystem::path(argv[0]).remove_filename().append(L"PNG.ini");

    wchar_t division [] = L"Мясные изделия";
    wchar_t type     [] = L"Колбаса";
    wchar_t name     [] = L"Брауншвейгская";

    wcout << L"Lines written: " << WritePrivateProfileStringW(division, type,  name, curr.c_str()) << endl;


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

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

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


uses IniFiles;
...
var PSIni : TInifile;
...
PSIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'PNG.ini');

Как это будет выглядеть на Си. Сорри за банальность. Спасибо.

Используй C++ Builder, там такое же API.

Иначе устанешь переписывать.
2 мар 21, 19:26    [22288620]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Я в принципе так и делаю. Спасибо.
2 мар 21, 22:50    [22288705]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
ну я
Member

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

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


uses IniFiles;
...
var PSIni : TInifile;
...
PSIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'PNG.ini');

Как это будет выглядеть на Си. Сорри за банальность. Спасибо.


#include "IniFiles.hpp"
TIniFile* PSIni;
PSIni = new TIniFile(ExtractFilePath(ParamStr(0)) + "PNG.ini");


Сообщение было отредактировано: 10 мар 21, 18:54
9 мар 21, 17:45    [22291905]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
MasterZiv
Member

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

Возникла тут у меня необходимость перевести одну программу с Делфи на Си, так не сложная но тем не менее. Си практически не знаю, так на допотопном уровне, естественно прошу помощи.
есть фрагмент Делфи
Как это будет выглядеть на Си. Сорри за банальность. Спасибо.



#include "IniFiles.h"
//...
TInifile* PSIni;
//...
   PSIni = new TIniFile(ExtractFilePath(ParamStr(0)) + "PNG.ini");


уверен, тебе стало легче...
10 мар 21, 09:58    [22292107]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
MasterZiv
Member

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

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


uses IniFiles;
...
var PSIni : TInifile;
...
PSIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'PNG.ini');

Как это будет выглядеть на Си. Сорри за банальность. Спасибо.


#include "IniFiles.hpp"
TIniFile* PSIni;
PSIni = new TIniFile(ExtractFilePath(ParamStr(0)) + "PNG.ini");


Блин, я опоздал ):
10 мар 21, 09:59    [22292108]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Dimitry Sibiryakov
Member

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

MasterZiv
Блин, я опоздал ):

Но в этот раз намного меньше чем обычно. Прогресс.

Posted via ActualForum NNTP Server 1.5

10 мар 21, 13:34    [22292350]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
MasterZiv
ну я
пропущено...


#include "IniFiles.hpp"
TIniFile* PSIni;
PSIni = new TIniFile(ExtractFilePath(ParamStr(0)) + "PNG.ini");


Блин, я опоздал ):

+



Кстати, Билдер дотянули до С++17, прогресс

Сообщение было отредактировано: 10 мар 21, 18:54
10 мар 21, 13:45    [22292361]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Dimitry Sibiryakov
Member

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

Просто в качестве компилятора взяли clang.

Posted via ActualForum NNTP Server 1.5

10 мар 21, 13:47    [22292364]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Siemargl
Member

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

Просто в качестве компилятора взяли clang.

Не просто взяли, там же фирменные расширения были. Допиленный он там.

Правда, был очень отстающим по версии, что то вроде clang 3.4 в Берлине. Upd 5.0 в Сиднее

Сообщение было отредактировано: 10 мар 21, 13:52
10 мар 21, 13:52    [22292369]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Продолжаю перенос проги на С Buider из Delphi и естественно "уперся" прошу помощи, итак

есть у меня в Делфи структура
  TInfo = record
      TypeID : integer;
      Name : string;
      Article : string;
      Mark : string;
      MinMeas : single;
      MaxMeas : single;
      PC20  : single;
      PC60  : single;
      PC100 : single;
      Delta : single;
    end;


есть еще следующий класс, соответственно конструктор и функция для чтения
 TInfoObj = class(TObject)
  private
    sStr : TInfo;
    function GetValue : TInfo;
  public
    constructor Create( TypeID : integer;
                        Name : string;
                        Article : string;
                        Mark : string;
                        MinMeas : single;
                        MaxMeas : single;
                        PC20  : single;
                        PC60  : single;
                        PC100 : single;
                        Delta : single );
    property pValue : TInfo read GetValue;
  end;
...
implementation

{$R *.dfm}

uses DataModule, Confirm, TypeDevice, DBView, TypeStand;

constructor TInfoObj.Create( TypeID : integer; Name : string; Article : string; Mark : string; MinMeas : single; MaxMeas : single; PC20  : single; PC60  : single; PC100 : single; Delta : single);
 begin
    inherited Create;
    sStr.TypeID := TypeID;
    sStr.Name := Name;
    sStr.Article := Article;
    sStr.Mark := Mark;
    sStr.MinMeas := MinMeas;
    sStr.MaxMeas := MaxMeas;
    sStr.PC20 := PC20;
    sStr.PC60 := PC60;
    sStr.PC100 := PC100;
    sStr.Delta := Delta;
 end;

function TInfoObj.GetValue : TInfo;
 begin
  Result := sStr;
 end;


далее в программе я из запроса, данные записываю а объекты строк Комбобокса,

  if MainDataModule.qTypeDevice.Active then MainDataModule.qTypeDevice.Close;
  MainDataModule.qTypeDevice.Prepared := true;
  MainDataModule.qTypeDevice.Parameters.ParamByName('@Option').Value := 0;
  MainDataModule.qTypeDevice.Open;
  cbTypeDevice.Items.Clear;

  while not MainDataModule.qTypeDevice.Eof do begin
    With MainDataModule.qTypeDevice do begin
       vInfo := TInfoObj.Create(FieldByName('TypeID').AsInteger,
                                FieldByName('Name').AsString,
                                FieldByName('Article').AsString,
                                FieldByName('Mark').AsString,
                                FieldByName('MinMeas').AsFloat,
                                FieldByName('MaxMeas').AsFloat,
                                FieldByName('PC20').AsFloat,
                                FieldByName('PC60').AsFloat,
                                FieldByName('PC100').AsFloat,
                                FieldByName('Delta').AsFloat);
       cbTypeDevice.Items.AddObject(FieldByName('Name').AsString + ' ' + FieldByName('Article').AsString, vInfo);
    end;
    MainDataModule.qTypeDevice.Next;
  end;
  MainDataModule.qTypeDevice.Close;


ну и потом где надо я их читаю
Info := TInfoObj(cbTypeDevice.Items.Objects[cbTypeDevice.ItemIndex]);


как весь этот процесс организовать в C Builder, структуру створил
   struct _TypeDevice {
	   int TypeID;
	   AnsiString Name;
	   AnsiString Article;
	   AnsiString Mark;
	   double MinMeas;
	   double MaxMeas;
	   double PC20;
	   double PC60;
	   double PC100;
	   double Delta;
       } TypeDevice;

наверное правильно, а вот дальше, конструкторы и прочее? никак. Заранее сильно благодарен
10 мар 21, 17:55    [22292597]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
patrick1968,
Один в один и пиши. Вверху строка дельфи а внизу сишная. Языки очень похожи. Это не пыха))
Конструктор сишный забыл?
10 мар 21, 18:02    [22292603]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
petrav
Member

Откуда:
Сообщений: 2861
Страуструп "Язык программирования C++". ~1100 страниц.

10-ть страниц утром, 10-ть страниц вечером. Задания выполнять не надо, но нужно
подумать как бы ты их делал.
10 мар 21, 19:14    [22292644]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
miksoft
Member

Откуда:
Сообщений: 38773
patrick1968
Продолжаю перенос проги на С Buider из Delphi
А зачем? C++Builder понимает код Delphi сам.
10 мар 21, 19:21    [22292647]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Siemargl
Member

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

пропущено...

Что, совсем не можешь догадаться заменить "begin"/"end" на "{"/"}" и ":=" на "="? Может,
ну его нафиг, программирование это?..


Я вижу юмор зашкаливает, иль ты считаешь людей за дебилов. Если бы было так просто, то обращения в форум не было. пробуй в своих прогах менять присвоить на равно и наоборот, наверно у тебя все проги такого уровня, а то хамить все мастера

Модератор: Удалено


Но какой либо базовый учебник по С++ 2003, без подробностей, придется прочитать. Там делов на денёк, если не лезть в новые стандарты (с++11 и новее).

Сообщение было отредактировано: 10 мар 21, 23:36
10 мар 21, 22:35    [22292724]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921
Модератор: Друзья. Снижаем градус напряжения.


patrick1968
Если бы было так просто, то обращения в форум не было.

Но... это и в самом деле так просто. Что именно у тебя не получилось?

Siemargl
Там делов на денёк

Откуда там "денёк", если всё реально делается тупым подстрочным переводом конструкций. Я бы понял если бы там задействовались возможности, отсутствующие в С++, типа создания объекта заранее неизвестного класса и всё такое, но код же переводится 1-в-1.

Сообщение было отредактировано: 10 мар 21, 23:36
10 мар 21, 23:12    [22292743]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

Откуда там "денёк", если всё реально делается тупым подстрочным переводом конструкций. Я бы понял если бы там задействовались возможности, отсутствующие в С++, типа создания объекта заранее неизвестного класса и всё такое, но код же переводится 1-в-1.

Очевидно же что тупой заменой begin/end -> {} и := -> = там мало чего можно добиться.

Например, ключевое слово `with`. Я о нём регулярно вспоминаю, только не помню что я вспоминаю: Паскаль или C#. :)

  while not MainDataModule.qTypeDevice.Eof do begin
    With MainDataModule.qTypeDevice do begin
11 мар 21, 00:27    [22292770]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Dimitry Sibiryakov
Member

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

petrav
Например, ключевое слово `with`.

А что с ним? Берётся текст вплоть до do, куть здеся - пасть всюду до самого end.

Posted via ActualForum NNTP Server 1.5

11 мар 21, 01:19    [22292775]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

petrav
Например, ключевое слово `with`.

А что с ним? Берётся текст вплоть до do, куть здеся - пасть всюду до самого end.

Так это же знать нужно. Там в паскалевском коде ещё куча приколов. Вызов методов без
кавычек (что-то бейсик вспомнился), кавычки одинарные на двойные заменить. Короче,
знать нужно обое два языка. Простой заменой не обойдёшься.

Только книга!
11 мар 21, 01:30    [22292779]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
petrav
Member

Откуда:
Сообщений: 2861
Вызов методов без скобок, в смысле.
11 мар 21, 01:34    [22292780]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
Пётр Седов
Member

Откуда: Санкт-Петербург
Сообщений: 700
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;
}
Можно это не делать, но тогда будет утечка памяти.
11 мар 21, 01:50    [22292781]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav
Вызов методов без скобок, в смысле.
угу. Он не дописал - "тупой заменой скобок () на пусто. Никто никогда не был против книг. Не знаю что вы спорит 3 поста.
11 мар 21, 07:06    [22292801]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Добрый день. Петру Седову огромное спасибо. Вот это реальная помощь и ничего лишнего. Большой респект!!!
14 мар 21, 14:24    [22294256]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
patrick1968
Member

Откуда:
Сообщений: 500
Добрый день. Знатоки подскажите плиз, где RAD STUDIO содержит Temp файлы, а то у меня рабочий проект вдруг свалился в "Error detected (LME288) Unable to perform link", на форумах погуглил - рекомендуют темп вычистить и проект пересобрать
16 мар 21, 18:53    [22295736]     Ответить | Цитировать Сообщить модератору
 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]     Ответить | Цитировать Сообщить модератору
 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]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Dimitry Sibiryakov,
Глобальные методы и переменные не пишу (почти)
15 апр 21, 18:00    [22309475]     Ответить | Цитировать Сообщить модератору
 Re: от Delphi к CPP  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Dimitry Sibiryakov,
Логгер P7 отлично останавливается на строке из под студии.
Всяко легче чем лечить по фото с AV.
15 апр 21, 18:14    [22309483]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4      [все]
Все форумы / C++ Ответить