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

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

Код: pascal
1.
2.
3.
4.
5.
uses IniFiles;
...
var PSIni : TInifile;
...
   PSIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'PNG.ini');



Как это будет выглядеть на Си. Сорри за банальность. Спасибо.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40049964
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
patrick1968
Добрый день.

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


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

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

Это смотря для чего тебе нужен TIniFile.
Например, запись строки данных в .ini фал может выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#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;
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40049994
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
Добрый день.

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


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

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

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

Иначе устанешь переписывать.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40050052
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я в принципе так и делаю. Спасибо.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052033
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
Добрый день.

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


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

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


Код: plaintext
1.
2.
3.
#include "IniFiles.hpp"
TIniFile* PSIni;
PSIni = new TIniFile(ExtractFilePath(ParamStr(0)) + "PNG.ini");
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052167
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
Добрый день.

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



Код: plaintext
1.
2.
3.
4.
5.
#include "IniFiles.h"
//...
TInifile* PSIni;
//...
   PSIni = new TIniFile(ExtractFilePath(ParamStr(0)) + "PNG.ini");



уверен, тебе стало легче...
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052168
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я
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");


Блин, я опоздал ):
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052282
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivБлин, я опоздал ):

Но в этот раз намного меньше чем обычно. Прогресс.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052291
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
ну я
пропущено...


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


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

[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052293
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто в качестве компилятора взяли clang.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052297
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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

Правда, был очень отстающим по версии, что то вроде clang 3.4 в Берлине. Upd 5.0 в Сиднее
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052408
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжаю перенос проги на С Buider из Delphi и естественно "уперся" прошу помощи, итак

есть у меня в Делфи структура
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  TInfo = record
      TypeID : integer;
      Name : string;
      Article : string;
      Mark : string;
      MinMeas : single;
      MaxMeas : single;
      PC20  : single;
      PC60  : single;
      PC100 : single;
      Delta : single;
    end;



есть еще следующий класс, соответственно конструктор и функция для чтения
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
 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;



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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
  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;



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



как весь этот процесс организовать в C Builder, структуру створил
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   struct _TypeDevice {
	   int TypeID;
	   AnsiString Name;
	   AnsiString Article;
	   AnsiString Mark;
	   double MinMeas;
	   double MaxMeas;
	   double PC20;
	   double PC60;
	   double PC100;
	   double Delta;
       } TypeDevice;


наверное правильно, а вот дальше, конструкторы и прочее? никак. Заранее сильно благодарен
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052411
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968,
Один в один и пиши. Вверху строка дельфи а внизу сишная. Языки очень похожи. Это не пыха))
Конструктор сишный забыл?
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052429
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страуструп "Язык программирования C++". ~1100 страниц.

10-ть страниц утром, 10-ть страниц вечером. Задания выполнять не надо, но нужно
подумать как бы ты их делал.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052431
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
Продолжаю перенос проги на С Buider из Delphi
А зачем? C++Builder понимает код Delphi сам.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052465
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
Dimitry Sibiryakov

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

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


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

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

Но какой либо базовый учебник по С++ 2003, без подробностей, придется прочитать. Там делов на денёк, если не лезть в новые стандарты (с++11 и новее).
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052471
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Друзья. Снижаем градус напряжения.

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

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

SiemarglТам делов на денёк
Откуда там "денёк", если всё реально делается тупым подстрочным переводом конструкций. Я бы понял если бы там задействовались возможности, отсутствующие в С++, типа создания объекта заранее неизвестного класса и всё такое, но код же переводится 1-в-1.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052487
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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

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

Код: pascal
1.
2.
  while not MainDataModule.qTypeDevice.Eof do begin
    With MainDataModule.qTypeDevice do begin
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052489
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravНапример, ключевое слово `with`.

А что с ним? Берётся текст вплоть до do, куть здеся - пасть всюду до самого end.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052492
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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

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

Только книга!
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052493
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вызов методов без скобок, в смысле.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052494
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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;
}

Можно это не делать, но тогда будет утечка памяти.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40052513
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Вызов методов без скобок, в смысле.
угу. Он не дописал - "тупой заменой скобок () на пусто. Никто никогда не был против книг. Не знаю что вы спорит 3 поста.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40053298
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Петру Седову огромное спасибо. Вот это реальная помощь и ничего лишнего. Большой респект!!!
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40054264
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Знатоки подскажите плиз, где RAD STUDIO содержит Temp файлы, а то у меня рабочий проект вдруг свалился в "Error detected (LME288) Unable to perform link", на форумах погуглил - рекомендуют темп вычистить и проект пересобрать
...
Рейтинг: 0 / 0
от 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
от Delphi к CPP
    #40059356
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
Так мне надо чтобы список элементов вектора стал пустым и в дальнейшем его надо было наполнять с нуля, а после clear() ранее занесенные элементы не удалились.

А как вы определили, что они не удалились?
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40059357
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался, спасибо.
Вот тут еще у меня заминка
есть фрагмент
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40059372
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dynamic_cast
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40059386
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выглядеть будет так?
Код: plaintext
1.
dynamic_cast<TEdit*>(SenderVal)->Color = clRed;
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40059454
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968, dynamic_cast<TEdit*>(...) проверяет реальный тип объекта, правда ли что объект класса TEdit, или производного. Если нет, то возвращает NULL (nullptr в современном C++). static_cast<TEdit*>(...) не проверяет реальный тип объекта, а верит на слово программисту. Поэтому можно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
#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-е не вычисляется.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40059457
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов,

Мне иногда кажется, что я копипаст вижу "аналоговым" способом. Как картинку. Даже не читая кода.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40059472
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр СедовЕсли нет, то возвращает NULL (nullptr в современном C++).

Он в принципе способен выкидывать std::bad_cast и только в этом случае является аналогом
дельфийского as.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40059483
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Он в принципе способен выкидывать std::bad_cast
Да, если dynamic_cast ссылок, а не указателей.

Dimitry Sibiryakov
и только в этом случае является аналогом дельфийского as.
Судя по коду, программист явно уверен, что объект класса TEdit, поэтому я бы и в Delphi написал без оператора as:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var
  e: TEdit;
begin
  Assert(SenderVal is TEdit); // проверяется реальный тип объекта, но только в debug build-е
  e := TEdit(SenderVal); // не проверяется реальный тип объекта
  e.Color := clRed;
  e.Font.Color := clWhite;
end;
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40061514
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер.
Столкнулся тут я снова с непонятным. Нужно было мне настроить отображение ячеек StringGrid, ну я по обыкновению
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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'

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

явно специфицировать тип параметра Gridseh::TGridDrawState State
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40061538
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
Код: plaintext
1.
if (ACol = 1) ...

Надо так:
Код: plaintext
1.
if (ACol == 1) ...
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40061840
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за подсказки - проделал
в заголовке 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
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40061841
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очевидно надо как-то правильно прописать пространство имен?
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40061846
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40061874
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968, надо в MainForm.h написать include до прототипа функции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// MainForm.h
...
#include <заголовочный файл, в котором определяется namespace Gridseh>
...
// прототип функции
void __fastcall sgMainDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
Gridseh::TGridDrawState State);
...

В заголовочном файле (который написан авторами библиотеки) должно быть это:
Код: plaintext
1.
namespace Gridseh
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40062029
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Спасибо за разъяснение
просто сделал
Код: plaintext
1.
2.
void __fastcall sgMainDrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
Grids::TGridDrawState State);


и всё сработало как надо
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40062793
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Еще ситуация, непонятная получается. Регулярно при запуске приложения возникает ошибка "access violation". Но потом спустя время, ну может при перезагрузке IDE или компа. Не изменяя никак приложение всё нормально. Чем это объяснено. Уж больно глюк напоминает?
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40062798
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
Добрый день.

Еще ситуация, непонятная получается. Регулярно при запуске приложения возникает ошибка "access violation". Но потом спустя время, ну может при перезагрузке IDE или компа. Не изменяя никак приложение всё нормально. Чем это объяснено. Уж больно глюк напоминает?
Переменные забываешь обнулить при старте программы.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40062803
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968Уж больно глюк напоминает?

Это и есть глюк. В твоей программе. Отлаживайся. Адрес в ошибке выводится, сопоставить его
с исходниками - простая техническая задача.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40062815
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968,
Ловить надо. Это наша работа.
Оберни код при старте в try и лови
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40062817
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AV не ловится try. Да и толку от его поимки ещё меньше, чем от простого сообщения об ошибке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40062821
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
AV не ловится try. Да и толку от его поимки ещё меньше, чем от простого сообщения об ошибке.
каждый судит со своей колокольни.
Ты новичку предложил дамп расшифровать.
Я предложил занятся пошаговой отладкой.
Дай тест на то что не ловится. Я проверю.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40062823
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40062824
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpДай тест на то что не ловится.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
int main()
{
   try
   {
     int a = *(int*)0;
   }
   catch(...)
   {}
}


Ну и удачи в отладке этого:
Код: sql
1.
2.
3.
4.
5.
int a = *(int*)0;

int main()
{
}
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40062826
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Пошаговая работает
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40062827
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Глобальные методы и переменные не пишу (почти)
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40062833
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
Логгер P7 отлично останавливается на строке из под студии.
Всяко легче чем лечить по фото с AV.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40064284
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Еще нужна помощь в разработке

немного переписываю конструктор формы

на делфи было так

Код: pascal
1.
2.
3.
4.
5.
constructor TfGraph.Create(AOwner : TComponent; Act : boolean);
begin
 inherited Create(AOwner);
 Action := Act;
end;



ну и соответсвенно при вызове

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 try
   fGraph := TfGraph.Create(Self, false);
   try
     fGraph.Show;
   except
     raise;
   end;
 except
   raise;
 end;



а как в Си это смастерить? Спасибо
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40064285
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968,
Ты начинай писать. Что ты ждешь прямо копи паст банальный.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40064326
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
Код: pascal
1.
2.
3.
4.
5.
constructor TfGraph.Create(AOwner : TComponent; Act : boolean);
begin
 inherited Create(AOwner);
 Action := Act;
end;

Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
class TfGraph : public TForm {
public:
  // объявление конструктора
  TfGraph(TComponent* AOwner, bool Act);
  ...
};

Код: plaintext
1.
2.
3.
4.
5.
6.
// реализация конструктора
TfGraph::TfGraph(TComponent* AOwner, bool Act) :
  TForm(AOwner) // вызов конструктора базового класса
{
  Action = Act;
}


patrick1968
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 try
   fGraph := TfGraph.Create(Self, false);
   try
     fGraph.Show;
   except
     raise;
   end;
 except
   raise;
 end;

Странный код. Исключение ловится, и сразу же возбуждается повторно. На C++ будет так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
try {
  fGraph = new TfGraph(this, false);
  try {
    fGraph->Show();
  } catch (...) { // ловим любое исключение
    throw; // возбуждаем повторно пойманное исключение
  }
} catch (...) {
  throw;
}
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40064383
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пётр Седов
Примерно так:

Прекрасный код, как и изначальный...
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40065421
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Громадный респект за помощь. Не мог найти решение по синтаксису еще одного вопроса. Нужно поместить картинку из файла в объект Picture в Fastreport, на делфи было так

Код: pascal
1.
TfrxPictureView(frxReport1.FindObject('Picture4').Picture.LoadFromFile("maingr.bmp");



но в С++
frxReport1->FindObject('Picture4') нет Picture и LoadFromFile тоже
хотя можно через поток, но это слишком нагромождено, может есть более простое и правильное решение? Спасибо.
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40065461
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
Код: pascal
1.
TfrxPictureView(frxReport1.FindObject('Picture4').Picture.LoadFromFile("maingr.bmp");

Здесь явно не хватает закрывающей круглой скобки. В Delphi, выражение:
Код: pascal
1.
TfrxPictureView(obj_reference)

это приведение типа. В C++ будет так:
Код: plaintext
1.
static_cast<TfrxPictureView*>(obj_pointer)
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40065568
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну примерно так я и представлял
сделал следующее
Код: plaintext
1.
2.
3.
4.
5.
6.
 ss = "maingr.bmp";
TMemoryStream *st = new TMemoryStream;
Graphics::TBitmap *bm = new Graphics::TBitmap();
bm->Handle = LoadBitmap(HInstance, ss.c_str());
bm->SaveToStream(st);
static_cast<TfrxPictureView*>(frxReport1->FindObject("Picture4")->LoadFromStream(st));


Пришлось делать через поток
,но всё-таки, что-то пошло не так
получается ошибка [bcc32 Error] Sert.cpp(122): E2031 Cannot cast from 'void' to 'TfrxPictureView *'
- что-то я не допонял
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40065579
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скобки надо расставлять правильно, а не от балды.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40065583
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибку понял - LOadFrom за скобками быть должен
Еще растолкуйте, пожалуйста такую тему, просто привычка от делфи в свете видимости переменных

есть у меня структура, объявленная в разделе PUBLIC в файле abc.h
Код: plaintext
1.
2.
3.
4.
   struct TMyPoint {
	  int PInd;
	  double Moment;
	  };


в форме (при создании) определяю массив

TMyPoint* Points = new TMyPoint[3];

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

А что, в оригинальном тексте на Дельфи он был внутри скобок?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40065586
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
про делфи - это к другому вопросу
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40065591
didgik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
Добрый день. Громадный респект за помощь. Не мог найти решение по синтаксису еще одного вопроса. Нужно поместить картинку из файла в объект Picture в Fastreport, на делфи было так

Код: pascal
1.
TfrxPictureView(frxReport1.FindObject('Picture4').Picture.LoadFromFile("maingr.bmp");



но в С++
frxReport1->FindObject('Picture4') нет Picture и LoadFromFile тоже
хотя можно через поток, но это слишком нагромождено, может есть более простое и правильное решение? Спасибо.


А в самом отчете если, типа:
Код: plaintext
1.
2.
3.
4.
void Picture1OnBeforePrint(TfrxComponent Sender)
{
  Picture1.FileLink=<WorkDir>+"photo\\"+<frxDBDataset1."photo">;
}
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40065603
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, тут есть варианты

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

Для отображения картинки в отчете
делаю следующее
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Chart1->SaveToBitmapFile("maingr.bmp");
 ss = "maingr.bmp";
TMemoryStream *st = new TMemoryStream;
Graphics::TBitmap *bm = new Graphics::TBitmap();
bm->Handle = LoadBitmap(HInstance, ss.c_str());
bm->SaveToStream(st);
static_cast<TfrxPictureView*>(frxReport1->FindObject("Picture4"))->LoadFromStream(st);



В последнем операторе при выполнении ошибка, что файл неверного типа, очевидно, что у frxReport1->FindObject("Picture4") нет Picture, как в делфи, тогда как же поступить?
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40066523
didgik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968, а типа такого:
Код: plaintext
1.
((TfrxPictureView*) Rep->FindObject("Picture4"))->Picture->LoadFromFile(photoname);
...
Рейтинг: 0 / 0
от Delphi к CPP
    #40066531
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968
в форме (при создании) определяю массив

TMyPoint* Points = new TMyPoint[3];

и мне нужно, что бы он был виден по всех процедурах формы единообразно, как его нужно представлять в этих формах?
Массив должен быть полем класса. Если длина известна на этапе компиляции, то обычный массив:
Код: plaintext
1.
2.
3.
4.
5.
6.
class TfGraph : public TForm {
public:
  ...
private:
  TMyPoint _points[3];
};

Если длина не известна на этапе компиляции, то можно использовать std::vector:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include <vector>

class TfGraph : public TForm {
public:
  TfGraph(TComponent* AOwner, bool Act);
  ...
private:
  std::vector<TMyPoint> _points;
};

TfGraph::TfGraph(TComponent* AOwner, bool Act) :
  TForm(AOwner)
{
  _points.resize(3);
}
...
Рейтинг: 0 / 0
93 сообщений из 93, показаны все 4 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / от Delphi к CPP
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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