SIEMENS, DF&PD

Предыдущее посещение: Пн мар 07, 2016 13:50 Текущее время: Пн мар 07, 2016 13:50

Часовой пояс: UTC + 3 часа




 [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Заполнить ComboBox из SQL
СообщениеДобавлено: Пн апр 27, 2009 18:17 
Не в сети
Известный Писатель

Зарегистрирован: Чт авг 02, 2007 13:50
Сообщения: 195
Откуда: ООО "ЭСПЕЙС", Санкт-Петербург
WinCC 7.0 (6.2)
На фейсплейте лежит ComboBox (MS Forms 2.0), надо его заполнить записями из SQL.

Код:
#include "apdefap.h"
void OnOpenPicture(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
   __object *cn;
   __object *rs;

   __object *app = NULL;
   __object *pic = NULL;
   __object *obj = NULL;

   char StrSelect[_MAX_PATH], StrCombo[_MAX_PATH];

   app = __object_create("PDLRuntime");
   pic = app->GetPicture(lpszPictureName);
   obj = pic->GetObject("ComboBox1");

   cn=__object_create("ADODB.Connection");
   cn->Open("Provider=MSDASQL;DSN=WINCC_DATABASE;");

   sprintf(StrSelect,"%s","SELECT [NumberObject], [Description] FROM TA_OBJECTS WHERE ([NumberTA] = '1')");
   rs=cn->Execute(StrSelect);

   rs->MoveFirst;
   while(!rs->eof)
   {
      sprintf(StrCombo,"%d.%s",rs->Fields(0),rs->Fields(1));
      obj->AddItem (StrCombo);
      rs->MoveNext;
   }
   if (rs!=NULL) __object_delete(rs);
   if (cn!=NULL) {cn->Close; __object_delete(cn);}
   __object_delete(obj);
   __object_delete(pic);
   __object_delete(app);
}

Где ошибка?

Если вместо obj->AddItem (StrCombo); вывести StrCombo в StaticText: SetPropChar(lpszPictureName,"StaticText1",Text",StrCombo)
То видно, что данные из SQL читаются.
А вот комбо остается пустой :S
В диагностике видно:
255,27.04.2009,18:52:30:549,1007001,4,,SRV1,SCRIPT,ExecuteError in Action @171 @SCREEN.@WIN12:@1001.@TOP17:@PG_R_RECIPE.VIEW:@PG_R_RECIPE_STANDARD


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 28, 2009 9:07 
Не в сети
Известный Писатель

Зарегистрирован: Пт ноя 14, 2008 15:15
Сообщения: 119
Не знаю где ошибка но попробуй заполнять комбо бокс

for(i=0;i<rs->RecordCount;i++)
{
strcpy(tmp,rs->Fields(0));
Ocx->AddItem(tmp);
rs->MoveNext;
}
да, еще не забудь про очищение комбобокса

for(i=Ocx->ListCount;i>0;i--)
Ocx->Removeitem(i-1);

выдержки из рабочего Си скрипта


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 24, 2012 10:43 
Не в сети
Написал больше чем Вы читали

Зарегистрирован: Вс янв 25, 2009 22:05
Сообщения: 1819
Откуда: Киров
Старая тема, но актуальность не потеряла...
Roman_C писал(а):
...
да, еще не забудь про очищение комбобокса

for(i=Ocx->ListCount;i>0;i--)
Ocx->Removeitem(i-1);

выдержки из рабочего Си скрипта


А как очистить весь комбобокс?
И вообще: где Вы информацию берете по свойствам и методам объектов Control в WinCC?

ЗЫ: разобрался - нада весь цикл и писать...
ЗЫЫ: неужели нельзя одной строкой очистить все?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 24, 2012 15:23 
Не в сети
Известный Писатель

Зарегистрирован: Ср авг 08, 2007 14:00
Сообщения: 418
Откуда: Старый Оскол
Свойства и методы этого комбобокса берем из документации МикроСофт.
Там же находим метод Clear (это чтоб цикл не городить).

ЗЫ: а вообще работать с этим комбобоксом через Си скрипты - извращение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 25, 2012 7:43 
Не в сети
Написал больше чем Вы читали

Зарегистрирован: Вс янв 25, 2009 22:05
Сообщения: 1819
Откуда: Киров
Muller писал(а):
Свойства и методы этого комбобокса берем из документации МикроСофт.
Там же находим метод Clear (это чтоб цикл не городить).

Киньте в меня ссылкой пожалуйста.

Muller писал(а):
ЗЫ: а вообще работать с этим комбобоксом через Си скрипты - извращение.

А способ без извращения каков? При условии, что список нада создавать/изменять динамически и совершать действия по изменению строки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 25, 2012 12:21 
Не в сети
Известный Писатель

Зарегистрирован: Ср мар 28, 2007 8:50
Сообщения: 129
Си или VBS - это больше зависит от личных предпочтений. Тут скорее идеология(опять же индивидуальная):
Си лучше использовать для важных задач, которые нужно делать быстро и часто,
а иногда обновить список из базы - это можно и на VBS, чтобы не мешать важному.

---
приведенный скрипт - это недокументированный артефакт по использованию MS Forms 2.0.
Начиная с версии 7.0 в WinCC есть свой ComboBox. Его и надо использовать. Стандартными средствами. Путем записи значений в свойства.

Использование сторонних элементов даже/особенно от MS может обернуться разными сюрпризами.
Например, MS FlexGrid Control - через некоторое время сохранение мнемосхемы с этим элементом вызывает увеличение размера файла в два раза, и так незаметно от 50 Кб до 100 Мб, и т.д... Чтобы вернуть изначальные 50 Кб - приходится пересоздавать элемент и пересохранять кадр с другим именем.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт окт 26, 2012 8:20 
Не в сети
Известный Писатель

Зарегистрирован: Ср авг 08, 2007 14:00
Сообщения: 418
Откуда: Старый Оскол
Михайлов Максим писал(а):
Си или VBS - это больше зависит от личных предпочтений.
Согласен, у кого-то это зависит от личный предпочтений, а у профессионалов это зависит от выполняемой задачи и решение что в конкретном случае использовать Си или VBS основывается на принципах быстродействия, надежности, компактности кода, личного опыта да и просто здравого смысла.

В случае с MS Forms 2.0 лучше использовать VBS, ведь эта библиотека изночально была заточена под Бейсик. Логично не правда ли?
support.microsoft.com/kb/171673 писал(а):
The Microsoft Forms 2.0 package was not designed to work outside the Visual Basic for Applications environment.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 31, 2012 11:18 
Не в сети
Написал больше чем Вы читали

Зарегистрирован: Вс янв 25, 2009 22:05
Сообщения: 1819
Откуда: Киров
Что-то я не понимаю в этом мире...
Смотрю в справку на ComboBox из MS Forms 2.0

Цитата:
To Add Items C++
Код:
ComboBox1->Items->Add("Tokyo");

Такой код возвращает ошибку "Unknow Properties Items..."

А код, который нигде не описан, и взят из имеющегося примера, работает:
Код:
ComboBox1->AddItem("Tokyo");



Объект ComboBox1 - является контролом Microsoft Forms 2.0

Изображение

Вопрос: из какого документа взят код, который работает? Мне нужно полное описание для С++ ComboBox контрола и др из библиотеки MS Forms 2.0


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
 [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], nickel3000 и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group