Перейти к содержанию

Вся активность

Лента обновляется автоматически     

  1. Вчера
  2. Для C++ Builder до сих пор не сделана поддержка 64-bit Android. Только Delphi
  3. Последняя неделя
  4. Возмите TabControl отсюда https://github.com/Zeus64/alcinoe/
  5. При загрузке Googe Play Console показывает две ошибки Говорит что некоторые APK файлы требуют расширения android.permission.CAMERA и android.permission.READ PHONE STATE, и что надо добавить «политику конфиденциальности». 2. Говорит что приложение не соответствует требованием о 64 версии. Но в моей FireMоnkey в ComboBox есть только выбор Android 32. Что делать?
  6. Спасибо огромное за помощь - это то, что нужно. Даже много лишнего кода у меня оказалось.
  7. вообще ничего не понял, ни вопроса, ни названия темы
  8. если нужно просто установить фон для формы можно сделать это без всякого кода и дополнительных ресурсов:
  9. Исправил код на вот такой, но рисуется вместо картинки черный квадрат, а выставляя половинную прозрачность рисуется серый квадрат. То есть прозрачность - применяется. procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); var C1,C2:TRectF; begin PaintBox1.Canvas.BeginScene; C1:=rectF(0,0,420,680); C2:=rectF(0,0,420,680); fon.SetSize(420,680); Buf.Canvas.DrawBitmap(fon,C1, C2, 1); //0-1 prozrachnost (opacity), 0.5 - na polovinu prozrachniy PaintBox1.Canvas.DrawBitmap(Buf,C1, C2, 0); PaintBox1.Canvas.EndScene; end; Сам проект тоже прилагаю, может я с ним нахимичил что-то: https://dropmefiles.com/XXqWc
  10. рисовать надо в OnPaint конечно, никакой таймер не подойдет лучше всего для этого подойдет PaintBox
  11. Заинтересовал этот компонент. Пытаюсь доделать его для использования в 10.4.1. Осталась одна проблема, не видно анимации при отпускании пальца, то есть веду палец по экрану - вижу смену табов, но при отпускании пальца активный таб просто перерисовывается. Думаю проблема вот в этой процедуре procedure TUITabControl.EndSlide; procedure LocalAnimateInt(AParent : TFmxObject; const APropertyName: string; const NewValue: Integer; Duration: Single = 0.2; AType: TAnimationType = TAnimationType.In; AInterpolation: TInterpolationType = TInterpolationType.Linear); var A: TIntAnimation; begin TAnimator.StopPropertyAnimation(Self, APropertyName); A := TIntAnimation.Create(AParent); A.Parent := AParent; A.AnimationType := AType; A.Interpolation := AInterpolation; A.OnFinish := AnimationFinished; A.Duration := Duration; A.PropertyName := APropertyName; A.StartFromCurrent := True; A.StopValue := NewValue; A.Start; end; procedure LocalAnimateIntWait(AParent : TFmxObject; const APropertyName: string; const NewValue: Integer; Duration: Single = 0.2; AType: TAnimationType = TAnimationType.In; AInterpolation: TInterpolationType = TInterpolationType.Linear); var A: TIntAnimation; begin TAnimator.StopPropertyAnimation(Self, APropertyName); A := TIntAnimation.Create(AParent); try A.Parent := AParent; A.AnimationType := AType; A.Interpolation := AInterpolation; A.Duration := Duration; A.PropertyName := APropertyName; A.StartFromCurrent := True; A.StopValue := NewValue; A.Start; while A.Running do begin Application.ProcessMessages; Sleep(0); end; finally A.DisposeOf; end; end; const Duration = 0.2; begin if not FSlide then Exit; { if SlideVolume>0.5 then begin LocalAnimateInt(Layout1, 'Position.X', Round(-Layout1.Width)); LocalAnimateIntWait(Layout2, 'Position.X', 0); ActiveTab := Tab2; end else begin LocalAnimateInt(Layout1, 'Position.X', 0); LocalAnimateIntWait(Layout2, 'Position.X', Round(Layout1.Width)); ActiveTab := Tab1; end;} if (SlideVolume<0.5) and not IsSpeedUp then begin if SlideDirection=TSlideDirection.sdNext then begin P := Tab1.AbsoluteToLocal(LayoutPos); LocalAnimateInt(internalLayout1, 'Position.X', Round(P.X), Duration, TAnimationType.Out, TInterpolationType.Exponential); P := Tab2.AbsoluteToLocal(LayoutPos); LocalAnimateIntWait(internalLayout2, 'Position.X', Round(P.X + LayoutRect.Width), Duration, TAnimationType.Out, TInterpolationType.Exponential); end else begin P := Tab1.AbsoluteToLocal(LayoutPos); LocalAnimateInt(internalLayout1, 'Position.X', Round(P.X), Duration, TAnimationType.Out, TInterpolationType.Exponential); P := Tab2.AbsoluteToLocal(LayoutPos); LocalAnimateIntWait(internalLayout2, 'Position.X', Round(P.X - LayoutRect.Width), Duration, TAnimationType.Out, TInterpolationType.Exponential); end; ActiveTab := Tab1; end else begin if SlideDirection=TSlideDirection.sdNext then begin P := Tab1.AbsoluteToLocal(LayoutPos); LocalAnimateInt(internalLayout1, 'Position.X', Round(P.X - LayoutRect.Width), Duration, TAnimationType.Out, TInterpolationType.Exponential); P := Tab2.AbsoluteToLocal(LayoutPos); LocalAnimateIntWait(internalLayout2, 'Position.X', Round(P.X), Duration, TAnimationType.Out, TInterpolationType.Exponential); end else begin P := Tab1.AbsoluteToLocal(LayoutPos); LocalAnimateInt(internalLayout1, 'Position.X', Round(P.X+ + LayoutRect.Width), Duration, TAnimationType.Out, TInterpolationType.Exponential); P := Tab2.AbsoluteToLocal(LayoutPos); LocalAnimateIntWait(internalLayout2, 'Position.X', Round(P.X), Duration, TAnimationType.Out, TInterpolationType.Exponential); end; ActiveTab := Tab2; end; SetLength(TransitionTabs,0); // ClipChildren := False; SlideDirection := TSlideDirection.sdNone; FSlide := False; end; а конкретно тут while A.Running do begin Application.ProcessMessages; Sleep(0); end; но как исправить, пока не пойму. Нашел оригинальную функцию в FMX.TabControl, выглядит она вот так procedure TTabControl.SetActiveTabWithTransition(const ATab: TTabItem; const ATransition: TTabTransition; const ADirection: TTabTransitionDirection = TTabTransitionDirection.Normal); procedure AnimateControlPositionX(AParent: TFmxObject; const NewValue: Integer); var A: TIntAnimation; begin TAnimator.StopPropertyAnimation(AParent, 'Position.X'); A := TIntAnimation.Create(AParent); A.Parent := AParent; A.AnimationType := DefaultSlidingAnimationType; A.Interpolation := DefaultSlidingInterpoation; A.OnFinish := AnimationFinished; A.OnProcess := WebBrowserRealign; A.Duration := DefaultSlidingDuration; A.PropertyName := 'Position.X'; A.StartFromCurrent := True; A.StopValue := NewValue; A.Start; end; procedure AnimateControlPositionXWait(AParent: TFmxObject; const NewValue: Integer); var A: TIntAnimation; begin TAnimator.StopPropertyAnimation(AParent, 'Position.X'); A := TIntAnimation.Create(AParent); try A.Parent := AParent; A.AnimationType := DefaultSlidingAnimationType; A.Interpolation := DefaultSlidingInterpoation; A.Duration := DefaultSlidingDuration; A.PropertyName := 'Position.X'; A.StartFromCurrent := True; A.StopValue := NewValue; A.Start; while A.Running do begin Application.ProcessMessages; Sleep(0); end; finally A.DisposeOf; end; end; var Tab1, Tab2: TTabItem; Layout1, Layout2: TControl; LayoutRect: TRectF; P, LayoutPos: TPointF; begin if ATab = ActiveTab then Exit; FinishCurrentTabTransition; case ATransition of TTabTransition.Slide: begin FTransitionRunning := True; ClipChildren := True; try LayoutPos := ActiveTab.Content.LocalToAbsolute(TPointF.Zero); LayoutRect := ActiveTab.Content.BoundsRect; Tab1 := ActiveTab; Layout1 := ActiveTab.Content; ActiveTab := ATab; Tab2 := ActiveTab; Layout2 := ActiveTab.Content; FTransitionTabs := [Tab1, Tab2]; DisableDisappear(Tab1); Layout1.Visible := True; Layout2.Visible := True; if not Tab2.DisableDisappear then begin DisableDisappear(Tab2); PreloadContent(Layout2); end; if ADirection = TTabTransitionDirection.Normal then begin P := Tab1.AbsoluteToLocal(LayoutPos); Layout1.SetBounds(P.X, P.Y, LayoutRect.Width, LayoutRect.Height); AnimateControlPositionX(Layout1, Round(P.X - LayoutRect.Width)); P := Tab2.AbsoluteToLocal(LayoutPos); Layout2.SetBounds(P.X + LayoutRect.Width, P.Y, LayoutRect.Width, LayoutRect.Height); AnimateControlPositionXWait(Layout2, Round(P.X)); end else begin P := Tab1.AbsoluteToLocal(LayoutPos); Layout1.SetBounds(P.X, P.Y, LayoutRect.Width, LayoutRect.Height); AnimateControlPositionX(Layout1, Round(P.X + LayoutRect.Width)); P := Tab2.AbsoluteToLocal(LayoutPos); Layout2.SetBounds(P.X - LayoutRect.Width, P.Y, LayoutRect.Width, LayoutRect.Height); AnimateControlPositionXWait(Layout2, Round(P.X)); end; finally SetLength(FTransitionTabs, 0); ClipChildren := False; FTransitionRunning := False; Realign; end; // Force repaint Application.ProcessMessages; end; else ActiveTab := ATab; end; end; Работает вроде правильно, только нет анимации при движении пальца. Как бы теперь получить то, что нужно. PS. На всякий случай, хочу получить эффект прокрутки рабочих столов на андроиде. Когда смахиваю пальцем, рабочий стол следует за ним и показывается новый. Когда палец отпускаю - вижу анимацию смены рабочих столов. Надеюсь понятно объяснил))
  12. Ой - грубая ошибка с моей стороны. Прошу прощения. Теперь зависание и правда пропало - единственное - изображение так и не рисуется на форме - просто черный экран. Видимо я все еще делаю что-то не так. Компилирую приложение на Leagoo T5c (Android 7). Может я неправильно задаю параметры в прорисовке DrawBitmap?
  13. не fon.create а fon := TBitmap.Create причем это не зависит от платформы
  14. Спасибо всем большое. Да пропустил Create по невнимательности. А картинки я через resource and images загружаю так как все примеры, которые я находил так загружали. В Deployment тоже отображается путь к моей картинке на пк. По поводу bmp - в ресурсах увидел тип данных bitmap, поэтому, видимо, ошибочно решил, что поддержка этого формата есть. Проект, который я делаю - это мини игра (из старого своего проекта), которую я решил попробовать портировать под андроид и заодно разобраться с программированием под андроид В итоге я сделал следующие изменения: Прорисовку убрал из FormPaint в таймер: procedure TForm1.Timer1Timer(Sender: TObject); var C1,C2:TRectF; begin Canvas.BeginScene; C1:=rectF(0,0,420,680); C2:=rectF(0,0,420,680); fon.SetSize(420,680); Buf.Canvas.DrawBitmap(fon,C1, C2, 0); //0-1 prozrachnost (opacity), 0.5 - na polovinu prozrachniy Canvas.DrawBitmap(Buf,C1, C2, 0); Canvas.EndScene; end; Картинку bmp перезалил в формате jpg и добавил недостающую строчку Fon.Create; procedure DownloadImages; var RS: TResourceStream; begin RS:=TResourceStream.Create(HInstance, 'FonMain', RT_RCData); try fon.Create; Fon.Width:=420; Fon.Height:=680; Fon.LoadFromStream(RS); finally RS.Free; end; end; Но в итоге андроид приложение все еще виснет на отображении картинки заставки с огнем (то есть загрузка изображения все еще не идет).
  15. Как найти окно создания APK файла? У меня же он создаётся автоматически при нажатии на "зелёный треугольничек"?
  16. Мне бы сейчас мои исходники... Снова взялся за этот проект
  17. Здравствуйте! Нет, это не сообщение от С++Builder, но ответ от службы техподдержки Embarcadero, что FireDAC не поддерживается в Коммунити Едишн для разных платформ. Вот прислали ссылку возможностей разных версий - https://www.embarcadero.com/docs/rad-studio-feature-matrix.pdf Но соединение с базой устанавливается, у компонента TFDConnection свойство OidAbLOB == Yes, UnknownFormat == BYTEA, если последнее свойство установить Error, то просто ошибка Invalid pointer operation. А я даже не могу понять где ошибка, может в SQL запросе, может в настройках параметров запроса или еще где. С уважением, Навадвипа Чандра дас.
  18. Он, может, хотел скрыть от посторонних свои картинки. Если запихивать их в Deployment, то любой может распаковать APK и вытащить всё что угодно из assets. А если в ресурсы запихать, то их не достанешь никак
  19. Судя по всему, вы используете версию Community Edition, в которой функциональность FireDAC урезана. Об этом нам и говорит сообщение "Клиент PosgreSQL - 32 бит ODBC. 64 бит FireDAC недоступен для Community Edition." Для взаимодействия с сервером вам нужна полная версия Rad Studio.
  20. А разве bmp вообще на Android поддерживается?? Да и не нужны в этом приложении ресурсы как в Windows. Есть Deployment, это более современный способ помещения данных в проект. Кроме того, обращение к переменной класса Form1 в методе класса TForm1 - это ошибка. Перегружать рисование формы -FormPaint тоже не из этого мира. Это все должно остаться в VCL / WinApi Давайте сначала начнем - что хотели сделать изначально?
  21. procedure DownloadImages; var RS: TResourceStream; begin RS:=TResourceStream.Create(HInstance, 'FonMain', RT_RCData); try Fon <<<<<<<<<<<<<<<<<< Где Create??? Fon.Width:=420; Fon.Height:=680; Fon.LoadFromStream(RS); finally RS.Free; end; end; Тута нет procedure TForm1.FormCreate(Sender: TObject); begin Regim:=0; Buf:=TBitmap.Create; Buf.Width:=420; Buf.Height:=680; form1.Border.Styling:=false; DownloadImages; //zagruzka kartinok end;
  22. Здравствуйте все! Потихоньку начал переводит свою библиотеку, написанную для C++Builder 6 на новые рельсы C++Builder 10.3.3. Компонент сохранения настроек TNNConfig работает с бинарным форматом и уже отлажен для сохранения и чтения настроек в файл: TNNConfig->StoreKind = skFile; А вот если свойство StoreKind установить в значение skDB, то не получается сохранение в базе данных. База данных PostgreSQL 13. Таблица сохранения настроек выглядит так: -- Table: public.UserReg -- DROP TABLE public."UserReg"; CREATE TABLE public."UserReg" ( "UserRegKey" character varying(720) COLLATE pg_catalog."default" NOT NULL, "UserData" bytea ) TABLESPACE pg_default; ALTER TABLE public."UserReg" OWNER to "Navadvipa_Chandra_das"; COMMENT ON TABLE public."UserReg" IS 'Таблица, содержащая настройки пользователей в бинарном виде!'; COMMENT ON COLUMN public."UserReg"."UserRegKey" IS 'Поле - первичный ключ для настройки!'; COMMENT ON COLUMN public."UserReg"."UserData" IS 'Поле - настройки пользователей в бинарном виде!'; -- PROCEDURE: public.SelectUserReg(character varying, bytea) -- DROP PROCEDURE public."SelectUserReg"(character varying, bytea); CREATE OR REPLACE PROCEDURE public."SelectUserReg"( "UserRegKey_" character varying, INOUT "UserData_" bytea) LANGUAGE 'plpgsql' AS $BODY$ begin select a."UserData" into "UserData_" from "UserReg" a where a."UserRegKey" = "UserRegKey_"; --if not found then -- "UserData_" := Null; --end if; end; $BODY$; -- PROCEDURE: public.UpdateUserReg(character varying, bytea) -- DROP PROCEDURE public."UpdateUserReg"(character varying, bytea); CREATE OR REPLACE PROCEDURE public."UpdateUserReg"( "UserRegKey_" character varying, INOUT "UserData_" bytea) LANGUAGE 'plpgsql' AS $BODY$ begin update "UserReg" a set a."UserData" = "UserData_" where a."UserRegKey" = "UserRegKey_"; if not found then insert into "UserReg" ( "UserRegKey", "UserData" ) values ( "UserRegKey_", "UserData_" ); end if; end; $BODY$; COMMENT ON PROCEDURE public."UpdateUserReg"(character varying, bytea) IS 'Запись настроек пользователя'; Клиент PosgreSQL - 32 бит ODBC. 64 бит FireDAC недоступен для Community Edition. Методы LoadFromDB и SaveToDB я приведу ниже, но они нерабочие и не понятно где копать, так как документация по этому вопросу крайне скудна. bool __fastcall TNNConfig::LoadFromDB() { if ( Connection && !Connection->Connected ) return false; bool B = false; std::unique_ptr< TFDQuery > quReg( new TFDQuery( this ) ); std::unique_ptr< TFDTransaction > trReg( new TFDTransaction( this ) ); quReg->Connection = Connection; trReg->Connection = Connection; quReg->Transaction = trReg.get(); Connection->StartTransaction(); try { quReg->SQL->Text = "begin\n" " \"SelectUserReg\"( :key_, :lob_ );\n" "end;"; quReg->Params->Items[ 0 ]->DataType = ftString; quReg->Params->Items[ 0 ]->AsString = RegistryKey(); quReg->Params->Items[ 1 ]->DataType = ftStream; quReg->Params->Items[ 1 ]->AsStream = Filer; //quReg->Params->Items[ 0 ]->DataType = ftStream; //quReg->Params->Items[ 0 ]->FDDataType = dtBlob; quReg->Params->Items[ 1 ]->ParamType = ptOutput; quReg->Params->Items[ 1 ]->StreamMode = smOpenRead; quReg->ExecSQL(); TStream *LOB = quReg->Params->Items[ 0 ]->AsStream; if ( LOB && LOB->Size > 0 ) { ((TMemoryStream*)Filer->Stream)->Size = LOB->Size; LOB->Read( ((TMemoryStream*)(Filer->Stream))->Memory, Filer->Stream->Size ); } Connection->Commit(); B = true; } catch ( ... ) { Connection->Rollback(); } return B; } Вот тестовое приложение - https://github.com/Navadvipa-Chandra-das/TestFMX Вот библиотека Нижняя Навадвипа - https://github.com/Navadvipa-Chandra-das/NizhnyayaNavadvipa Кто может, помогите! Спасибо! С уважением, Навадвипа Чандра дас.
  23. Всем доброго времени суток. Начал осваивать создание приложений на андроид и столкнулся с проблемой. Приложение компилировалось ровно до того момента пока я не попытался загружать изображение из ресурсов. В ресурсы добавлена картинка с именем Fon (идентификатор FonMain) и типом RCData, формат Bmp (24 бита). Если убрать строчку DownloadImages, то приложение скопилируется и запустится. Код прилагаю ниже. Прошу помощи разобраться в проблеме - где я допустил ошибку? Учусь по статьям в интернете и довольно большая часть кода от туда не работает (даже с получением разрешения экрана были проблемы - пришлось пока ориентироваться просто на размер формы временно). unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Helpers.Android, Androidapi.JNI.Util; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormResize(Sender: TObject); procedure FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Buf:TBitmap; Regim,Xr,Yr:integer; fon:Tbitmap; procedure DownloadImages; implementation {$R *.fmx} {$R *.LgXhdpiPh.fmx ANDROID} procedure DownloadImages; var RS: TResourceStream; begin RS:=TResourceStream.Create(HInstance, 'FonMain', RT_RCData); try Fon.Width:=420; Fon.Height:=680; Fon.LoadFromStream(RS); finally RS.Free; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Regim:=0; Buf:=TBitmap.Create; Buf.Width:=420; Buf.Height:=680; form1.Border.Styling:=false; DownloadImages; //zagruzka kartinok end; procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); var C1,C2:TRectF; begin Form1.Canvas.BeginScene; C1:=rectF(0,0,420,680); C2:=rectF(0,0,420,680); fon.SetSize(420,680); Buf.Canvas.DrawBitmap(fon,C1, C2, 0); form1.Canvas.DrawBitmap(Buf,C1, C2, 0); Form1.Canvas.EndScene; end; procedure TForm1.FormResize(Sender: TObject); begin Xr:=form1.ClientWidth; Yr:=form1.ClientHeight; //Showmessage(Inttostr(Xr)+'x'+Inttostr(Yr)); end; end.
  1. Загрузить ещё активность
×
×
  • Создать...