QNX.ORG.RU

Разработка => Программирование под QNX 4.x => Тема начата: Дмитрий от Мая 17, 2017, 02:09:33 pm



Название: очистка текста в PtMultiText
Отправлено: Дмитрий от Мая 17, 2017, 02:09:33 pm
Здравствуйте!

Очень нужна Ваша помощь!!!

Есть виджет PtMultiText, созданный при помощи меню виджетов на экране.

В программе к нему обращаюсь как MTex1=ApGetWidgetPtr(wSe,ABN_PtMTevents);// где wSe - виджет окна.
Текст в программе добавляется только в конец позиции виджета MTex1.
Я же хочу очищать виджет перед записью нового текста, но почему-то не получается.
Код:
Код:
memset(&buffer2,0,sizeof(buffer2));
PtTextModifyText(MTex1,0,sizeof(buffer2),-1,buffer2,sizeof(buffer2)); // очистка виджета

 while( fgets( buffer, 128, fj ) != NULL )
  {  
   PxTranslateToUTF(trans,buffer,strlen(buffer),
            &srctaken,buffer1,sizeof(buffer1),
    &dstmade);
   PtMultiTextModifyText(MTex1,NULL,NULL,-1,buffer1,strlen(buffer1),NULL,
                 Pt_MT_FONT|Pt_MT_FOREGROUND|Pt_MT_TEXT_COLOR|Pt_MT_BACKGROUND|
                 Pt_MT_BACKGROUND_COLOR); //добавляем текст
   memset(&buffer,0,sizeof(buffer));
   memset(&buffer1,0,sizeof(buffer1));          
  }
Текст виджета не очищается...
Подскажите, в чем дело!


Название: Re: очистка текста в PtMultiText
Отправлено: GrayCat от Мая 17, 2017, 09:25:30 pm
А кто такой у вас "buffer2" ? Если это имя массива, то выражение "memset( &buffer2,0,sizeof(buffer2));" пытается обнулить указатель на массив. Иногда такое тоже нужно, но тут вы, скорее всего, имели в виду совсем другое ;-) .


Название: Re: очистка текста в PtMultiText
Отправлено: A_O от Мая 18, 2017, 08:18:02 am
А кто такой у вас "buffer2" ? Если это имя массива, то выражение "memset( &buffer2,0,sizeof(buffer2));" пытается обнулить указатель на массив. Иногда такое тоже нужно, но тут вы, скорее всего, имели в виду совсем другое ;-) .

Это неверно - в C buffer2 и &buffer2 в данном случае абсолютно эквивалентны.

Код:
Код:
memset(&buffer2,0,sizeof(buffer2));
PtTextModifyText(MTex1,0,sizeof(buffer2),-1,buffer2,sizeof(buffer2)); // очистка виджета

А каков размер массива buffer2? В вашем варианте он должен быть заведомо больше длины очищаемого текста.
Но вообще-то массив buffer2 здесь вовсе не обязателен. Достаточно задать третий параметр PtTextModifyText() заведомо бОльшим, чем длина текста, а последние два параметра - NULL, 0.


Название: Re: очистка текста в PtMultiText
Отправлено: Дмитрий от Мая 18, 2017, 04:16:00 pm
Вот я затуркался, болван!
Я указал буфер в 16 байт :D
Ваш пример более правильный, я думаю!
Только вопрос еще такой:
Как в виджете считается количество байт в буфере, по количеству символов на экране?
А символы перевода строки наверное тоже учитываются?
И да, наверное, глупый вопрос.
Т. е. как правильно посчитать размер текста, у меня, например, список....

P.S. Было бы удобно, если бы была бы реализована функция PtSetResourse CLEAR_ALL_TEXT


Название: Re: очистка текста в PtMultiText
Отправлено: A_O от Мая 18, 2017, 06:03:09 pm
Попробуйте поиграть с ресурсом Pt_ARG_TEXT_STRING. С его помощью можно и очистить виджет (через PtSetResources), и получить указатель на текст (через PtGetResources). Не знаю, правда, что выдаст PtGetResources в случае наличия нескольких сегментов текста с разным форматированием, но, скорее всего, это предусмотрено. В общем, надо пробовать.
Что касается длины текста, то она складывается из длины всех сегментов, которые вы туда пишете, и больше ни из чего (если, конечно, у вас не предусмотрено редактирование текста пользователем). Следует только различать длину текста в байтах и в символах - в кодировке UTF это не одно и то же.


Название: Re: очистка текста в PtMultiText
Отправлено: da-nie от Мая 18, 2017, 07:05:08 pm
Цитировать
Это неверно - в C buffer2 и &buffer2 в данном случае абсолютно эквивалентны.

А вот это интересно.  8)
Правильно я понимаю, что написав:
unsigned char buffer[100];

Оказывается, что &buffer=buffer? Это в Си такое работает? В Си++ не работает?
Мой компилятор VC6 (в проекте для Си++) такую строку не принимает:

if (buffer==(&buffer)) MessageBox(NULL,"!!!!","",MB_OK);

У него к ней идиосинкразия "error C2446: '==' : no conversion from 'unsigned char (*)[100]' to 'unsigned char *'" И я с ним полностью согласен. Честно говоря, не вижу причин, по которым &buffer должен быть равен buffer.  ::)


Название: Re: очистка текста в PtMultiText
Отправлено: A_O от Мая 18, 2017, 07:14:56 pm
Причин вы можете не видеть, но в C (не C++) это действительно так.


Название: Re: очистка текста в PtMultiText
Отправлено: da-nie от Мая 18, 2017, 07:20:13 pm
На всё есть свои причины. :) Дело в том, что будет очень интересно, если вдруг buffer станет определяться через new. В этом случае программа просто рассыплется. Поэтому крайне интересно, зачем в Си сделано так. По логике, имя массива есть указатель на первый элемент. А взятие адреса от указателя должно давать адрес указателя. А тут получается зоопарк. Я про такой фокус не знал.
И действительно, если тип привести, то получится так:
Код:
unsigned char *p1=buffer;
unsigned char *p2=(unsigned char*)(&buffer);
if (p1==p2) MessageBox(NULL,"!!!!","",MB_OK);
И оно действительно выдаёт "!!!!". И в Си++. :)

Оказывается, и статья была на хабре с этим моментом: https://habrahabr.ru/post/251091/


Название: Re: очистка текста в PtMultiText
Отправлено: A_O от Мая 18, 2017, 07:39:58 pm
1. В Си нет new.
2. Имя массива есть ссылка на первый элемент, но не объект типа "указатель". Такой объект в данном случае не создается.


Название: Re: очистка текста в PtMultiText
Отправлено: da-nie от Мая 18, 2017, 07:44:30 pm
В Си есть malloc. И ваш пример в Си++ тоже работает. А это уже хреново.

Цитировать
Имя массива есть ссылка на первый элемент, но не объект типа "указатель".

Судя по статье с хабра - массив он свой собственный мальчик, и имя его в указатель преобразуется, но им не является, как не является и ссылкой.


Название: Re: очистка текста в PtMultiText
Отправлено: A_O от Мая 18, 2017, 08:04:18 pm
В случае malloc есть явный объект - указатель. Со всеми вытекающими.
Если вы напишете
Код:
char *buffer = malloc (16);
то buffer никак не будет равно &buffer.
А в случае
Код:
char buffer[16];
такое равенство будет. Но не будет объекта типа "указатель".
По крайней мере, компилятор Watcom в QNX 4.25 спокойно кушает оператор
Код:
if (buffer == &buffer) ...
Он выдает только туманное предупреждение "&array may not produce intended result", но результат сравнения при этом true.
Интересно проверить, что будет при арифметических операциях с этим указателем. Но в данной теме это значения не имеет - использование &buffer2 вместо buffer2 в обращении к функции ошибкой никоим образом не является.


Название: Re: очистка текста в PtMultiText
Отправлено: da-nie от Мая 18, 2017, 08:21:27 pm
Вроде бы я об этом и пишу? ;)

Это, кстати, элегантный способ уронить программу, когда вам это нужно. Допустим, вас увольняют. Меняете массивы на динамические и спокойно уходите. :)
В общем, спасибо за информацию. :)


Название: Re: очистка текста в PtMultiText
Отправлено: A_O от Мая 18, 2017, 08:25:50 pm
Если поменять массивы на динамические, компилятор как раз наверняка возмутится.


Название: Re: очистка текста в PtMultiText
Отправлено: da-nie от Мая 18, 2017, 09:29:50 pm
Не-а. Во всех местах, где вы будете задавать указатель, как &buffer, вы его будете приводить к типу указателя на тип буфера (иначе работать не будет так же, как у меня в VC6 в примере). А это значит, что компилятор подмены не заметит.


Название: Re: очистка текста в PtMultiText
Отправлено: A_O от Мая 18, 2017, 09:33:22 pm
Ну это ж надо вставлять явное приведение. Так вредить неинтересно - возни больно много.


Название: Re: очистка текста в PtMultiText
Отправлено: da-nie от Мая 18, 2017, 09:48:23 pm
Ну, если делать, как memset, то тут явно приведение писать не понадобится. :)


Название: Re: очистка текста в PtMultiText
Отправлено: Дмитрий от Мая 19, 2017, 03:33:35 pm
Кстати, действительно, получается что
PtSetArg(&args[0], Pt_ARG_TEXT_STRING,"", 0);
PtSetResources(MTex1, 1, args);
стирает весь текст.


Название: Re: очистка текста в PtMultiText
Отправлено: GrayCat от Июня 09, 2017, 11:22:24 am
Кстати, действительно, получается

Ну вот, мы тут уже планы порабощения мировой IT-индустрии строили, а дело всё оказалось в пустой строке!...

;)