Тема: Преобразовать CString в double???

Подскажите, плизззз!!! Уже замучался по тырнету лазить!
У меня есть элемент диалога edit control (IDC_LENGTH)
Я беру значение из edit control:

CString lengthtxt;
GetDlgItemText(IDC_LENGTH,lengthtxt);

А теперь мне надо провести с этим значением математические действия, но никак не получается преобразовать его в double :( Может кто подскажет?

(изменено: Мансур Мамкин, 24 августа 2010г. 07:59:22)

Re: Преобразовать CString в double???

посмотри функцию acdbDisToF
и обратная функция acdbRToS

Re: Преобразовать CString в double???

Вот описание из справки:

int acdbDisToF(
    const ACHAR * str, 
    int unit, 
    ads_real * v
);

Даже не пробуя, уже скажу, что не сработает, так как у нас CString!

Re: Преобразовать CString в double???

Попробывал такую конструкцию:

    CString massatxt;
    double ss;
    char *buf;
    GetDlgItemText(IDC_MASSA, massatxt);
    ss = atof((LPSTR)(LPCTSTR)massatxt) * 2;
    gcvt(ss,3, buf);
    m_result.SetWindowTextW((LPCTSTR)buf);
    m_result.UpdateData();

Но при работе с этой частью кода в Акаде происходит фатальная ошибка :( Уже руки начинают опускаться...

Re: Преобразовать CString в double???

Даже не пробуя, уже скажу, что не сработает, так как у нас CString!

Блин, а кто запрещает привести CString к (ACHAR *)? У меня почему-то замечательно работает  :D

Re: Преобразовать CString в double???

Блин, а кто запрещает привести CString к (ACHAR *)? У меня почему-то замечательно работает

Вот как раз во всех этих переводах и проблема :( Может поделитесь кусочиком кода, который у вас работает?

Re: Преобразовать CString в double???

Александр, как я понял Вы только начали изучать ARX. Я бы Вам посоветовал начать изучать Net Api, на мой взгляд это значительно проще и сделать можно все тоже самое что на ARX. На Net нельзя делать только Custom объекты и то с 2010 версии Акада, появились так называемые Overrule Net API, с помощью которых можно переопределять метод WordDraw акадовских объектов, например сделать мультивыноску, которая отображается как требуется или заданная полилиния будет отображаться как труба. На Net можно строить серьезные приложения для Acad, на Net можно писать под вертикальные приложения Акада (работа с объектами вертикальных приложений Акада на ARX без OMF невозможна). Еще бы отметил, что построить серьезное приложение под Акад с применением только Arx без Net очень трудоемкая задача. Современные приложения под Акад примерно состоят из 10% кода на Arx и 90% на Net. А уж что касается интерфейса, xml, баз данных на чистом С++ делать это ваще расстрел.

Re: Преобразовать CString в double???

К сожалению на Net сложнее найти документацию, да чтоб на русском. Есть как минимум один сайт посвященный Net, но сложно, когда все на англицком (( Конечно вещь хорошая, в этом можно убедиться скачав SPDS с autodesk.com (хотя там уже много недочетов замечено), но с какого бока к этому Net подойти - вопрос!

Re: Преобразовать CString в double???

Книг по программированию C# или VB.net на русском языке полно. ЧТо касается документации по Net, можно найти на сайте Бушмана Андрея почти полный перевод документации Net Api под Акад. Что касается непосредственно применения Net APi под голый Acad примеров на англоязычных сайтах тоже полно (например блог Kean Walmsley). Сам я перешел на net под Акад с VBA после того как в одной из версий акада поддержка ВБА не включалась в базовый пакет, где-то месяц потребовалось на переход, чтоб начать что-то писать. Ну вообщем, что это дело изучить знания английского не нужны, по крайней мере мне не потребовались.

Re: Преобразовать CString в double???

Спасибо. Интересно будет посмотреть и поизучать.
Но может кто-нить в этой теме оставит сообщение по теме?  :D

Re: Преобразовать CString в double???

double atof(
   const char *str 
);
double _wtof(
   const wchar_t *str 
);

Re: Преобразовать CString в double???

Спасибки. С этим уже разобрался )
А вот как терь это double загнать обратно в edit control?

Re: Преобразовать CString в double???

int CTEDialog::GetDlgItemFloat(int Item, double &AValue)
{
    HWND wnd = ::GetDlgItem(hwndDialog, Item); 
    UINT sellen = ::GetWindowTextLength(wnd);
    LPTSTR strbuf = new TCHAR[++sellen];
    ::GetWindowText(wnd, strbuf, sellen);
    int status = acdbDisToF(strbuf,-1,&AValue);
    delete strbuf;
    return status;
}
//-----------------------------------------------------------------------------
void CTEDialog::SetDlgItemFloat(int Item, double AValue)
{
    TCHAR strbuf[30];
    acdbRToS(AValue,-1,-1,strbuf); 
    ::SetWindowText(::GetDlgItem(hwndDialog, Item), (LPTSTR)&strbuf);
}

CString можно передавать как есть, если требуется (ACHAR *) только для чтения,
если же нужен буфер для записи, то у CString есть методы GetBuffer и ReleaseBuffer

    CString s;
    int textlen;
    textlen = edEdit.GetTextLengthEx(flags, 1200);
    LPTSTR buf = s.GetBuffer(textlen);
    GETTEXTEX st;
    ...
    edEdit.SendMessage(EM_GETTEXTEX, (WPARAM)&st, (LPARAM)buf);
    s.ReleaseBuffer();

(изменено: ash09, 26 августа 2010г. 13:08:20)

Re: Преобразовать CString в double???

можно и так:

СEdit m_ctrl_edit;
CString str1, str2;
m_ctrl_edit.GetWindowTextW(str1);
double len = wcstod(str1.Trim(),NULL);

обратно

str2.Format(_T(L"%g"), len);
m_ctrl_edit.SetWindowTextW(str2);