Ghk
-
Постов
24 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные Ghk
-
-
Накидайте просто пример - рисование линии в одну сторону и в другую по таймеру - ничего никуда не залипает и не зависает.
Repaint по таймеру вызывается ?
Вы бы код приложили ...
-
Да почти для любого "графического" компонента есть эти методы
Откройте справку на Paintbox раздел методов - там есть описание обоих .
Работаем на билдере так
myPainbox->BeginUpdate();
//... тут код чо мы там рисуем - кривые . косые . графики окружности и прочие мегауравнения
myPainbox->EndUpdate();
myPainbox->Repaint();// выводим на экран все что накалякали в буфере
Оно и будет идти неравномерно ибо вашему приложению система не обязана давать 100% процессорного времени -
Вопрос вот в чем.
В портретной ориентации напихано дофига контролов и все красиво.
Поворачиваю смартфон , и конечно же теперь большая часть контролов спряталась.
воткнул вертикальный скролл под них , но не удобно .
Мысля пришла перекомпоновать контролы под андройд - оказалось нифига! Иерархия должна остаться той же .
Тогда появилась другая идея - налепить копий контролов как удобно именно в альбомной ориентации.
налепил - они видны и в портретной. Если отключаю видимость отключаются в обоих ориентациях
Отсюда вопросы:
1) Верно ли я понимаю, что в редакторе форм под андроид - ориентация , просто сделана чтоб посмотреть , как оно будет выглядеть.
И нельзя сделать портретную-один вид , а альбомную -другой, именно используя визуальный редактор?
2) Разумно ли налепить копий контролов для удобства , которые видно в одной ориентации и не видно в другой , и включать/отключать их видимость по событию формы OnResize( вроде как можно определить смену ориентации) ?если мои предположения не верны , просветите плиз , как вообще это правильно и разумно сделать ?
-
Свой обработчик приема пишется с секундамерами и т.п.
по другому никак ... -
методы beginupdate endupdate используются ?
если нет, то оно и будет тормозить и залипать ибо при каждом чихе идет перерисовка всей канвы.
-
Интересно было обезьяну попробовать
-
Цитата
А вопрошающий разрабатывает под Android.
Вообще-то тестирует как оно работает .... на XE8 тоже куча глюков было обнаружено , но костылями вылечено , но такое выпускать в свет явно нельзя , поэтому терь попытка 10.2.2
Если Здесь такая же ерунда , то я под андрюшу в андроидстудии лучше ваять буду - модель на плюсах , представление на джаве
Цитата
Пруф можно, кто Вам такое сказал... "год-два ждать пока допилят"Ну я сужу по скачанным релизам и дате их создания - все очень и очень глюкавое.
Под винду -хорошо , но под андроид - тихий ужас. -
ну хорошо пусть 1.5k$ .
Мне после покупки год-два ждать пока допилят и можно будет пользоваться или как ? -
Итак отписываюсь о результатах:
Все глюки связаны со средой RAD xe10.2 Tokyo
Код и прочее абсолютно не причем.
Все снес, выкачал другую версию 10.2.2 с хотфиксом
Под андроид все скомпилилось и установилось без ошибок , отладка работает.
Хорошо - допустим купил я лицензию на 10.2 и получил бы кучу вот таких вот глюков и узнал бы потом что билдер выпускают официально сырой и недопиленный, а пилят в процессе ( хорошо хоть на стековерфлоу написали об этом ) -эт получается заплати я почти 6k$ и потом еще год-два жди пока они все глюки допилят и наконец-то можно будет работать ? Я логики не пойму ...
п.с. запустилось sdk 25.2.5 ndk r9c
сейчас проверю на более свежих NDK
-
Вопросом покупки задавался .... ток встает ответный вопрос - за что платить столько денег ? - за кучу глюков ? Хорошо , куплю лицензию, есть гарантия , что это на 100% позволит вести разработку без детских проблем? - если нет , тогда ап чем собственно речь - абракадабра радоваться должны , что им багрепорты пишут ... ми тут по сути бетатестеры LOL
-
Пришел писец ! Переустанавливаю ...
-
Под XE8 все прекрасно компилится и встает на устройство , работает стабильно.
Я на плюсах ваяю и кажись на дельфи такой проблемы нет.
Нашел аналогичные проблемы на стековерфлоу, только там у чувака вылет идет именно при закрытии приложения ( тоже на С++ проблема ). Абракадабра написала , что -то там было недореализовано и они исправят в обновлении.
Сейчас качаю хотфикс с рутрекера, поглядим что получится.
Причем забавно вот что - если ставлю одну версию NDK , то приложение даже не стартует - по отладчику не доходит даже до создания форм сразу вываливает эту ошибку.
При использовании другой версии NDK свистопляски начинаются при присваивании указателей и т.п.
-
Отладка заработала , после создания нового проекта и добавления туда файлов и форм из старого проекта.
Теперь другая беда - под вин 32 компилируется без ошибок , а вот под андроид(в зависимости от NDK) лезет Class segmentation fault error(11) на разных этапах запуска приложения. -
До этого стояла XE8 и все прекрасно собиралось и дебажилось.
На днях качнул xe10 tokyo с рутрекера.
Приложение (из начально делалось в XE8) скомпилилсоь собралось, установилось , но отладка не работает ( конфигурация debug)Попробовал новое приложение - форма и кнопка, то же самое - отладка не работает.
Т.е. XE10 устанавливает и запускает приложение на телефоне и на этом все - студия отключается от телефона.
Устройство redmi2 adnroid 5.1.1
Чего делать и куда копать ?
п.с. отладка под винду работает
РЕШЕНО:
Чтоб сэкономить ваше время и чтобы вы не читали всю тему, вот краткое руководство.
Для перехода с XE8
Создаем новые проект- приложение в XE10 затем добавляем туда все формы и файлы из старого проекта ( я имею ввиду макеты форм, cpp , h, ico и более ничего не добавлять!).
Из деплоймент менеджера удаляем задеполеные файлы и ставим все по умолчанию.
Компилим -билдим.
Затем в деплоймент менеджер добавляем чего там раньше было. И удаляем из проекта лишнюю новую форму ( она у нас создается при создании проекта)
Все - можно пользоваться .Кроме того версия Токио должна быть 10.2.2. с хотфиксом от 2018 года, версии ниже с рутрекера глючат
-
Решено!!!!
Чтобы файлы стали видны в проводнике телефона и далее ими можно было делиться и перекидывать на комп, а также чтобы они стали видны другим приложениям необходимо всего-то при создании файла указывать права доступа линукс.
На билдере для мультиплатформы я сделал так
fileHandle=FileCreate(FileName #ifndef WIN32 ,S_IRWXU|S_IRWXG|S_IRWXO #endif );
-
В билдере порядком инклюдов( аналог uses в дельфях) нифига не решается. В _published явное указание типа не работает- ошибки выдает.
Зато пока задал вопрос - догадался как написать костыль
в public класса формы пишем определение самопальной функции-обработчика с полным указанием типов , как в прототипе
void __fastcall VKbShown(TObject *Sender, bool KeyboardVisible, const System::Types::TRect &Bounds); Имя можно от балды - в данном случае
VKbShown.
Далее в основном файле формы в этой функции пишем чего нада делать при появлении вирутальной клавиатуры
void __fastcall TSomeForm::VKbShown(TObject *Sender, bool KeyboardVisible, const System::Types::TRect &Bounds)
{ //
ShowMessage("Опаньки! Клавушка появилась !"');
};
ну и чтобы все это свистело и пердело как нада при появлении клавы
В событии OnCreate нашей формы навешиваем эту функцию на обработчик
TSomeForm->OnVirtualKeyboardShown=TSomeForm->VKbShown;
Теперь все прекрасно работает и компилится под андроидом
Всем спасибо вопрос можно закрывать,
буду дальше покумекать свою программу.
-
Создаем форму, кидаем на нее TChart.
Далее вешаем пустой обработчик // OnVirtualKeyboardShown
И все - под андроид не компилится - пишет TRect Ambiguity.
Засада В Bilder XE8Глюк ловится даже в пустом проекте.
В ошибке пишет Типа TRect определен в дух местах,
Первое место SystemTypes.h System::Types::TRect - там структура.
второе место FMXTee.Canvas.hpp FmxTeee::Canvas::TRect - там написано typedef System::Types::TRectF TRect;Прототип обработчика
typedef void __fastcall (__closure *TVirtualKeyboardEvent)(System::TObject* Sender, bool KeyboardVisible, const System::Types::TRect &Bounds);
Понятно что TRect по разному определен в модулях и эт типа два разных типа.
Но какого черта оно компилится под винду, что делать и какого черта ему нада чтоб оно скомпилилось под андроид ?Весь день интерент рою не мог найти. на одном форуме было упоминание , но человек не помнит что делать.
-
Андройд девелопер в помощь - на официальном сайте все прекрасно расписано - значения приоритетов от 0 до 10
https://developer.android.com/reference/java/lang/Thread.html#MAX_PRIORITY
ну и выше там по потокам в андройде почитаете -
1.Запомните одну простую вещь : Метод Synchronize - это ни что иное как "остановить текущий поток и выполнить кусок действий из указанной процедуры в главном потоке"
2. С визуальными компонентами формы напрямую из потока работать нельзя!
Теперь понятно почему мерцает ?
У автора сам алгоритм несколько коряв - поток постоянно тормозится и передает управление главному , потом назад опять обработка . опять тормоз и т.д. все это в цикле.
+ если я не ошибаюсь, к тому же идет обращения к визуальным компонентам главной формы, что без синхронизации делать нельзя.
Т.е. как таковой смысл в этом потоке отсутствует
Создайте временное хранилище, в который пихнете выборку из базы . И по окончании обработк-выборки всех данных, через synchronize уже вышвырните на Form1 со всеми вашими модификациями в одной единственной процедуре. .
-
Значит что-то неверно используете. Synchronize нужен по сути только для того, чтобы какая-то часть кода выполнилась в главном потоке. В основном используется для вывода диалоговых окон, или обновления контролов.
-
-
Всем привет.
Прошу помощи.
имеем вот такой кусок кода для запления комбобокса возможными сервисами , которые предоставляет выбранное блютуз устройство
Цитатаvoid __fastcall TTabbedForm::PrListItem_MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
float X, float Y) // событие по клику в листе блютуз устройств
{ TargetPaireNo = PrListBox->ItemIndex; //номер индекса устройства от которого будем получать список сервисов
Services_cb->Clear(); // очистили комбобокс с сервисов
ToastMessage_On(((TListBoxItem*)Sender)->Text + L"Service Searching..." ); //вывели тост
if (TargetPaireNo>-1)// если выбрано какое-то устройство в листе устройств
{//объявляем класс потока чтобы сделать поиск сервисов в фоновом режиме , для исключения тормозов приложения
class TAnThread: public TThread
{ public:
__fastcall TAnThread():TThread(false) //конструктор
{FreeOnTerminate=true;
};
void _fastcall TreadToast()// периносим названия сервисов в комбобокс и схлопываем тост
{for(int i=0; i<BT->ServiceList->Count;i++)
TabbedForm->Services_cb->Items->Add( BT->ServiceList->Items.Name);
TabbedForm->ToastMessage_Off(L"Searching Completed.");
};
// Ниже поток- запрос сервисов у выбранного блютуз устростваvoid _fastcall TAnThread::Execute(void)
{BT->ServiceList = BT->DeviceList->Items[TabbedForm->TargetPaireNo]->GetServices();
Synchronize(&TreadToast);
};
};
//запускаем поток на исполнение
TAnThread* D= new TAnThread ; // TAnThread}
}
Все это прекрасно работает при компиляции под win32 никаких проблем нет .
При попытке компиляции под Android . компилятор матерится на Synchronize(&TreadToast);Цитата[bccaarm Error] TabbedTemplate.cpp(126): no matching member function for call to 'Synchronize'
Ну и в развороте вот что там имеется:
System.Classes.hpp(2136): candidate function not viable: no known conversion from 'void (__closure *)()' to 'PSynchronizeRecord' (aka 'System::Classes::TThread::TSynchronizeRecord *') for 1st argument;
System.Classes.hpp(2154): candidate function not viable: no known conversion from 'void (__closure *)()' to 'TThreadMethod' (aka 'void (__closure *)() __attribute__((pcs("aapcs-vfp")))') for 1st argument;
System.Classes.hpp(2156): candidate function not viable: no known conversion from 'void (__closure *)()' to '_di_TThreadProcedure' (aka 'DelphiInterface<System::Classes::TThreadProcedure>') for 1st argument;
System.Classes.hpp(2177): candidate function not viable: requires 2 arguments, but 1 was provided
System.Classes.hpp(2180): candidate function not viable: requires 2 arguments, but 1 was providedЧего ему надо-то ? Сижу сутки бьюсь ...хз чо делать.
Портетная и альбомная ориентация - как лучше сделать разный дизайн?
в Формы
Опубликовано · Изменено пользователем Ghk
я бы кинул на форму лэйаут и на него уже накидывал бы все компоненты. Затем при старте формы - крутим этот лэйаут на 90 градусов и смещаем на ширину экрана.
При реальном повороте устройства - крутим и смещаем обратно.
Получилось бы всегда одна и та же ориентация - альбомная, не зависимо от реального положения устройства.