Большой Воронежский Форум
» Программирование>КТо-нибудь работал с TMS AdvChartView?
-=Женек=- 19:31 11.09.2013
Есть прикольная штука - http://www.tmssoftware.com/site/advchart.asp

Скачал, поставил, стал разбираться. Дошел до построения графика.
Примеры прилагались, но они на Delphi.
В дельфи примере есть такая строка:

Сообщение от :
AdvGDIPChartView1.Panes[0].Series[0].AddSinglePoint(RandomRange(0, 50));

Стал адаптировать ее под Builder C++. Начался бардак.
Пишет что Series не является членом Panes, а функция AddSInglePoint неизвестна.

Интерактивные средства билдера дали понять, что доступ к Series и далее по тексту может быть осуществлен следующим образом:

Сообщение от :
AdvGDIPChartView1->Panes->Items[0]->Series->Items[0]->

То есть компилятор это проглатывает. Но график не рисуется.
А в дельфи примере все нормально....


Может быть кто подскажет для начала, как перевести на C строку

Сообщение от :
AdvGDIPChartView1.Panes[0].Series[0].AddSinglePoint(RandomRange(0, 50));

[Ответ]
Hopkroft 20:17 11.09.2013
-=Женек=-,
AdvGDIPChartView1->Panes[0]->Series[0]->AddSinglePoint(RandomRange(0, 50));
0 забыл подставить, вроде всё.
Там различия минимальные должны быть.
P.S.
У тебя ломаная или покупал? [Ответ]
-=Женек=- 20:25 11.09.2013
Hopkroft,

Сообщение от :
AdvGDIPChartView1->Panes[0]->Series[0]->AddSinglePoint(RandomRange(0, 50));

Пишет вот что:

Сообщение от :
E2288 Pointer to structure required on left side of -> or ->*


Сообщение от :
У тебя ломаная или покупал?

Триал, скачаный с сайта разработчика. Единственное ограничение - надпись на графике, что версия ознакомительная. [Ответ]
-=Женек=- 20:27 11.09.2013
Если нетрудно - качни ставится автоматом за 10 секунд, через exeшник.
Готовые примеры для экспериментов есть, но они под Дельфи. [Ответ]
Hopkroft 21:02 11.09.2013

Сообщение от -=Женек=-:
Если нетрудно - качни ставится автоматом за 10 секунд, через exeшник.
Готовые примеры для экспериментов есть, но они под Дельфи.

Да вот и фишка в том что мне не трудно, и я уже качнул. Но у меня таже фигня выходит. Хидер по идее автоматом студия генерирует, и проблем быть не должно.
Я уже серии вручную добавлял, что-то результата пока нету.
Если получиться - отпишусь. [Ответ]
Hopkroft 21:19 11.09.2013
-=Женек=-, может лучше использовать что-то типа TeeChart. Который отдельно идёт. Вроде он как стандарт для построения всяких красивых графиков. Тем более можно найти ломаную и последнюю [Ответ]
Spectator 21:52 11.09.2013

Сообщение от -=Женек=-:
Пишет вот что:

а зачем ты пытаешься работать под С++ Builder, а не в Delphi, если С++ ты, похоже, не знаешь совсем.
я не о том что ты не сообразил сам что используются указатели, а о том что сообщение об ошибке более чем явно дает понять что надо делать, чтобы её исправить. [Ответ]
Hopkroft 22:18 11.09.2013
Spectator, нравиться человеку работать с С++. А пишет что-бы навыки улучшить. [Ответ]
-=Женек=- 05:40 12.09.2013

Сообщение от Spectator:
сообщение об ошибке более чем явно дает понять что надо делать, чтобы её исправить.

Есть у меня одно предположение... Не по поводу того, как надо писать, а относительно твоих слов...
Не мог бы ты изложить свою мысль на языке С++, то есть привести правильное на твой взгляд написание этой строки. [Ответ]
Hopkroft 09:16 12.09.2013

Сообщение от manifest:
Интересно, Вас заставляют поддерживать дедушкино приложение или это особая форма извращений?

Там туева куча различных библиотек, и для домашних поделок самое то.

Сообщение от manifest:
Там какой-то "особый" С++, больше похожий на Delphi. Скорее привьет плохой стиль чем научит языку, имхо.

+100500. Но как написал выше, для домашних поделок пойтёт. Хотя в последних версиях вроде как добавили поддержку С++11, поддержку 64-х разрядной архитектуры и другие свистелки-перделки. [Ответ]
Hopkroft 09:34 12.09.2013
-=Женек=-, так что по поводу TeeChart скажешь? Он достаточно навороченный, можно и его для графиков использовать. И вроде как стандарт для вывода графиков в различных бизнес приложениях. Плюс для него примеров много на C++.
Могу дать ссылку на ломаную версию. [Ответ]
manifest 09:49 12.09.2013
Автор просил не флудить в теме, поэтому постараюсь ограничиться только лишь одним ответом

Сообщение от Hopkroft:
Там туева куча различных библиотек, и для домашних поделок самое то.

Оставлю это здесь:
Qt SDK
Qt Creator
Qt Designer

А уж библиотек для "стандартного" С++ и Qt в частности не пересчитать.
И оно бесплатно даже для коммерческого использования, и не нужно ничего ломать и идти на компромисы с совестью
Все же 2013 год на носу.

Сообщение от Hopkroft:
+100500. Но как написал выше, для домашних поделок пойтёт. Хотя в последних версиях вроде как добавили поддержку С++11, поддержку 64-х разрядной архитектуры и другие свистелки-перделки.

Builder имеет смысл пока пользуешся VCL, а VCL к С++ имеет весьма сомнительное отношение. Другими словами, пользователи Builder пишут на VCL а не на С++ описанном в стандарте, поэтому, что добавили они С++11 что нет, имхо, для пользователей Builder это практически ничего не меняет
[Ответ]
Spectator 10:06 12.09.2013

Сообщение от -=Женек=-:
Есть у меня одно предположение... Не по поводу того, как надо писать, а относительно твоих слов...
Не мог бы ты изложить свою мысль на языке С++, то есть привести правильное на твой взгляд написание этой строки.

нет, конечно, надо смотреть типы членов объекта AdvGDIPChartView1, которого у меня нет (и не будет).
тебе посоветую научиться вот чему - пользоваться кнопкой F1, если с компонентом поставляется адекватная документация, или смотреть в хедерах (заголовочных H / HPP файлах) ТИПЫ ПЕРЕМЕННЫХ, с которыми ты работаешь (члены класса или нет - это не суть важно в данном случае).
Ты должен, обязан осознавать - ЧТО ТЫ ДЕЛАЕШЬ. и должен понимать какого типа КАЖДЫЙ член вот в этой строке AdvGDIPChartView1->Panes[0]->Series[0]->AddSinglePoint(RandomRange(0, 50));
иначе в лучшем случае будешь продолжать мучиться с компиляцией, в худшем - писать говнокод, который в Builder'е рождается просто замечательно и при достижении критической массы превращает программу в аццкое глюкало, которое можно только выкинуть. [Ответ]
Hopkroft 10:11 12.09.2013

Сообщение от Spectator:
AdvGDIPChartView1->Panes[0]->Series[0]->AddSinglePoint(RandomRange(0, 50));

Этот вариант уже рассматривался. К сожалению он не работает.
Я уже пробовал, удалять и вручную добавлять свои Panes и Series через конструктор. Один фиг не работает. Может где-нибудь нужно какую-то галку поставить, но обычно такие компоненты работают из "коробки" на ура. [Ответ]
Spectator 10:15 12.09.2013

Сообщение от Hopkroft:
Этот вариант уже рассматривался. К сожалению он не работает.
Я уже пробовал, удалять и вручную добавлять свои Panes и Series через конструктор. Один фиг не работает. Может где-нибудь нужно какую-то галку поставить, но обычно такие компоненты работают из "коробки" на ура.

в смысле???
это твой вариант.
ты должен понять, где надо заменить -> на .
пользуясь документацией и / или заголовочными файлами.
адекватный C/C++ программист должен уметь не задумываясь пользоваться и тем и другим способом. [Ответ]
Hopkroft 10:49 12.09.2013

Сообщение от Spectator:
в смысле???
это твой вариант.
ты должен понять, где надо заменить -> на .
пользуясь документацией и / или заголовочными файлами.
адекватный C/C++ программист должен уметь не задумываясь пользоваться и тем и другим способом.

Panes был объявлен как указатель на структуру, поэтому я и поставил ->. Плюс у него вроде как был определён оператор [](int).
Я конечно могу ошибаться, поэтому приложил hpp файл.
Можешь подсказать по hpp файлу?
Изображения
[Ответ]
-=Женек=- 11:15 12.09.2013
Spectator,

Сообщение от :
ты должен понять, где надо заменить -> на .

Вот.... именно это я и ожидал увидеть, именно об этом я спрашивал в посте №9.

Уважаемый! Ты грамотный программист, это чувствуется. Но когда же ты научишься читать посты и вникать в их суть, вместо того чтобы писать фразы типа "ты дурак, а как правильно делать я тебе не скажу." ?

Сообщение от :
а зачем ты пытаешься работать под С++ Builder, а не в Delphi, если С++ ты, похоже, не знаешь совсем.
я не о том что ты не сообразил сам что используются указатели, а о том что сообщение об ошибке более чем явно дает понять что надо делать, чтобы её исправить.

Внимательно перечитываем посты №№2,3. При вдумчивом чтении должно быть очевидным, что нет у меня проблем ни с указателями, ни с типами. Hopekroft предложил мне эту строку, я ее скормил компилятору и просто продемонстрировал полученный результат советчику. Изначально в своей программе я так не писал, проблем с указателями и с типами у меня не было.

Дальше, читаем пост №1

Сообщение от :
Пишет что Series не является членом Panes, а функция AddSInglePoint неизвестна.

Это он пишет как раз тогда, когда с точками и стрелочками все нормально. То есть обращение организовано правильно, но не к тем членам.

А к этому

Сообщение от :
AdvGDIPChartView1->Panes->Items[0]->Series->Items[0]->

я пришел пользуясь интерактивными возможностями билдера (наводишь куда надо курсор, жмешь CTRL+Space - вылазит список доступных функций и прочая и прочая...), так что учить меня пользоваться F1 не надо, к тому же мог бы и сообразить, что обладай я документацией адаптированной под C++, я бы здесь тем не создавал, а документация, как и примеры, адаптирована под Дельфи. Оно конечно читаемо и познаваемо, но вот именно в этом месте я споткнулся, ощущение складывается, что структуры под С и Дельфи по разному организованы.

А сама тема - я даже в заголовке указывал не саму проблему, а интересовался - есть ли люди, которые работали с этим VCL. Работали, значит тоже сталкивались с этой проблемой и как-то ее решали.

Описанный в последней цитате вариант не просто компилируется, но и не конфликтует со структурами, так как уже в ходе работы программы никаких ошибок, свидетельствуюищих об обращении к несуществующим элементам, не выдается. График просто не рисуется.
Что ж... вернусь домой попробую писать в элементы структур, а потом читать из них, может проблема чисто с отображением. Хотя я и свой компонент кидал на форму, и копировал из рабочей формы из примера для дельфи - результат один. [Ответ]
-=Женек=- 11:21 12.09.2013
А ведь я оказался прав!
Пришло письмо от разработчика:

Сообщение от :
Hi,
Use the following code to add a point:
AdvChartView1->Panes->Items[0]->Series->Items[0]->AddSinglePoint(RandomRange
(0, 100));

То есть синтаксически я все сделал правильно и даже копнул в правильную сторону (Items[0]->). Так что вопрос по указателям можно закрыть.
Может объявится билдерист, который с этим работал... [Ответ]
Hopkroft 11:26 12.09.2013

Сообщение от -=Женек=-:
А ведь я оказался прав!
Пришло письмо от разработчика:

То есть синтаксически я все сделал правильно и даже копнул в правильную сторону (Items[0]->). Так что вопрос по указателям можно закрыть.
Может объявится билдерист, который с этим работал...

Блин, опередил То-же самое хотел написать.
А что тебе нужно сделать? Я скачал pdf с мануалами, там вроде всё норм расписано.

я так понял ты использовал вначале AdvGDIPChartView1, т.к. хотел алиасинги и прочую красоту, а то в итоге хочешь получить?
[Ответ]
Spectator 11:48 12.09.2013

Сообщение от Hopkroft:
Panes был объявлен как указатель на структуру, поэтому я и поставил ->. Плюс у него вроде как был определён оператор [](int).
Я конечно могу ошибаться, поэтому приложил hpp файл.
Можешь подсказать по hpp файлу?

__property TAdvGDIPChartPanes* Panes = {read=GetPanes, write=SetPanes};

теперь смотри.
если ты обращаешься к Panes, то, в соответствии с определением, надо использовать ->
НО, ты обращаешься не к Panes, а к элементам массива, на который ссылается Panes, следственно это будет уже [B].[B]
Panes[4].blahBlahBlah

операции -> и [] взаимоисключающие, как бы. вот если бы там было ДВЕ *, то одна бы ушла [], а другая - в ->

как правильно писать в Билдере проверяется, на самом деле, очень просто и не используя головной мозг - пишем ->, если Code Insight не срабатывает и список членов класса не вываливается, значит нужна точка. в частности, для перевода примера с Дельфей надо скопировать текст примера в код программы, закомментарить, а потом заново набрать руками, обращая внимание на то - срабатывает ли Code Insight на точки или на ->

если не научиться делать упомянутое выше на интуитивном уровне, работа со сторонними компонентами, портированными из дельфей, превратится в кромешный ад, так что настоятельно рекомендую разобраться. [Ответ]
Hopkroft 12:01 12.09.2013
Spectator, вместо 10000 строк теории лучше бы 1 строчку кода. Про то как CodeInsight пользоваться думаю знают многие [Ответ]
-=Женек=- 12:04 12.09.2013
Hopkroft,

Сообщение от :
Я скачал pdf с мануалами, там вроде всё норм расписано

там в мануале фрагменты кодя для билдера? Если для Дельфи, то выкинь его, в нем написано

Сообщение от :
AdvGDIPChartView1.Panes[0].Series[0].AddSinglePoint(RandomRange(0, 50));

А вот разработчик говорит что в С++ надо вставлять Items[0]->
То есть уже ясно, что мануал хоть и содержит много полезной информации, но может сбить с толку. [Ответ]
-=Женек=- 12:19 12.09.2013
Spectator,

Сообщение от :
как правильно писать в Билдере проверяется, на самом деле, очень просто и не используя головной мозг - пишем ->, если Code Insight не срабатывает и список членов класса не вываливается, значит нужна точка. в частности, для перевода примера с Дельфей надо скопировать текст примера в код программы, закомментарить, а потом заново набрать руками, обращая внимание на то - срабатывает ли Code Insight на точки или на ->

В том то и дело, что CoedeInsight довел до нужной конструкции, которая компилируется и только. [Ответ]
Hopkroft 12:19 12.09.2013
-=Женек=-, да там просто можно подсмотреть как какой эффект сделать и в какой последовательности что вызывать.
Остальное можно додумать. Там основная фишка в том что обращаются либо к Series либо к Panes. А т.к. теперь известно что к ним через Items нужно обращаться, поэтому должно проще пойти. [Ответ]
Spectator 12:32 12.09.2013

Сообщение от -=Женек=-:
Spectator,

В том то и дело, что CoedeInsight довел до нужной конструкции, которая компилируется и только.

с CodeInsight есть один фокус, к которому на практике можно прийти. сначала всегда пробуй точку, а не ->
если точка срабатывает, пробуй откомпилироваться с ней. если ТОЧНО с точкой не выходит, тогда уже пробуем ->
это, конечно, танцы с бубном, но программирование в Builder - это в принципе танцы с бубном, так что карму мы этим не испортим, а на практике такая метода сильно облегчает жизнь при привинчивании криво портированных из дельфей библиотек.

а вот

Сообщение от Hopkroft:
-=Женек=-, да там просто можно подсмотреть как какой эффект сделать и в какой последовательности что вызывать.
Остальное можно додумать. Там основная фишка в том что обращаются либо к Series либо к Panes. А т.к. теперь известно что к ним через Items нужно обращаться, поэтому должно проще пойти.

к чему конкретно обращаться всё же можно и нужно смотреть в документации. это при портировании абсолютно не меняется, поэтому нужно не гадать, а прочитать и понять. [Ответ]
-=Женек=- 12:40 12.09.2013
Производитель написал что нужно добавлять BeginUpdate() и EndUpdate().
Я видел в мануале информацию об этих функциях, но в дельфевых примерах работает и без них. Что ж вечером приду с работы попробую. [Ответ]
-=Женек=- 12:47 12.09.2013
Spectator,

Сообщение от :
CodeInsight есть один фокус, к которому на практике можно прийти. сначала всегда пробуй точку, а не ->
если точка срабатывает, пробуй откомпилироваться с ней. если ТОЧНО с точкой не выходит, тогда уже пробуем ->

по-моему с -> ничего не вылазило, а с точкой открывался ниспадающий список, в котором нет Series. Зато есть Items, а вот в нем уже кроется Series. [Ответ]
Hopkroft 12:48 12.09.2013
-=Женек=-, если работает без них, то не значит что не нужно их выкидывать.
С их помощью ты предотвращаешь перерисовку компонента во время большого количества изменений. В противном случае либо тормозить начнёт либо мерцать будет.
Так что мануал лучше читать! [Ответ]
-=Женек=- 13:37 12.09.2013

Сообщение от Hopkroft:
-=Женек=-, если работает без них, то не значит что не нужно их выкидывать.
С их помощью ты предотвращаешь перерисовку компонента во время большого количества изменений. В противном случае либо тормозить начнёт либо мерцать будет.
Так что мануал лучше читать!

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

Да и потом, что значит выкидывать? По-моему в дельфевом примере вообще не было этих функций. Ну или они запускались где-то по какому-то другому событию. В общем, приду домой, попробую. [Ответ]
-=Женек=- 16:24 12.09.2013
Hopkroft,

Сообщение от :
если работает без них, то не значит что не нужно их выкидывать.

Блин... да их там и не было. В дельфи идет без этой функции.

А так попробовал - наконец-то все заработало. Всем спасибо))) [Ответ]
Вверх