기존 iOS (XCode) 앱 중 하나를 Delphi FireMonkey (XE4)로 이식하기 시작했습니다. 지금까지 놀랍도록 매끄러운 과정이었습니다. 그러나 우리는 해결책을 모르는 막 다른 골목에 처했습니다.iOS 컨트롤을 기반으로 한 FireMonkey 컨트롤이 올바르게 작동하지 않습니다.
기존 앱은 새로운 Google Maps 앱과 비슷합니다. webbrowser 컨트롤에 여러 핀이 포함 된 Google지도가 표시됩니다. 또한 설정 버튼과 핀이 빠졌을 때 나타나는 정보 패널이 있습니다. 해당 버튼/핀이 눌려지면 설정 및 정보 패널이 맵의 왼쪽 및 오른쪽에서 슬라이드됩니다. 이 모든 Xcode 응용 프로그램에서 잘 작동합니다.
여기에 우리가 FireMonkey 포트가있는 문제입니다
- 우리는 웹 브라우저 컨트롤의 위쪽에 걸쳐 FireMonkey 제어를 표시 할 수 없습니다. webbroswer가 iOS 컨트롤 인 네이티브이기 때문에 이것이 맞는 것 같습니다.
- 웹 브라우저 컨트롤이 표시되면 예를 들어 이동할 수 없습니다.
position.x
속성을 변경하면 웹 브라우저는 그대로 유지됩니다. 내장 된 애니메이션을 사용하여 x 속성으로 변경하면 동일합니다. 올바르게 작동하는 것으로 보이는 유일한 속성은visible
입니다.
TMS iCL 구성 요소를 사용하여 첫 번째 문제를 해결할 수 있습니다. 그러나 가장 걱정스러운 문제는 두 번째입니다. Webbrowser 구성 요소를 움직일 수 없으면 웹 브라우저 (또는 기본 iOS 제어)를 사용하는 현대적인 (슬라이딩) UI를 구현하는 것이 불가능합니다.
누구도 이러한 FireMonkey 제한 사항을 극복하는 방법을 찾아 왔습니까?)
1 버튼과 웹 브라우저로 두 번째 폼을 만든 : 1
UPDATE는 야로슬라프의 제안에 따라 경찰 나는 다음을 시도했다.
unit Unit2;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
FMX.StdCtrls, FMX.WebBrowser;
type
TForm2 = class(TForm)
WebBrowser1: TWebBrowser;
Button1: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.fmx}
end.
2) Form1을 Form1의 하위로 생성했습니다. 나는 응용 프로그램을 실행할 때
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.WebBrowser,
Unit2;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FForm2: TForm2;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
Fform2.left := Fform2.left - 5;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Fform2.left := Fform2.left + 5;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FForm2 := TForm2.Create(Self);
FForm2.Parent := Self;
FForm2.Left := 10;
FForm2.Show;
FForm2.BringToFront;
FForm2.WebBrowser1.URL := 'www.google.com';
FForm2.WebBrowser1.Navigate;
end;
end.
나는 이것을 참조 : 버튼을 클릭
- 는 효과가 없습니다 : 여기
내 관측이다. - Form2의 단추가 표시되지 않습니다.
- Form2의
Left
속성이 디자이너에서 40으로 설정됩니다. 그러나 양식은 0으로 표시됩니다.업데이트 2
: 주석의 제안에 따라
내가에 Form1의 소스를 변경 : 불행하게도
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.WebBrowser,
Unit2;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Popup1: TPopup;
WebBrowser1: TWebBrowser;
WebBrowser2: TWebBrowser;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FForm2: TForm2;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
TCustomForm(Popup1.Popupform).Left := TCustomForm(Popup1.Popupform).Left - 5;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TCustomForm(Popup1.Popupform).Left := TCustomForm(Popup1.Popupform).Left + 5;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.URL := 'www.google.com';
WebBrowser1.Navigate;
Popup1.Popup(FALSE);
end;
end.
, 운동이나 오버레이도 작동합니다. 현재 코드는 TCustomForm (Popup1.Popupform) .Left를 참조 할 때 예외를 throw합니다. 예외가 발생하는 이유는 상위 폼에서 마우스 왼쪽 아래쪽 이벤트가 발생하자마자 델파이가 팝업을 닫는 것 (팝업 폼을 파기) 때문입니다. 심지어 낯선 사람은 클릭했을 때 반응하지 않더라도 웹 브라우저가 닫힌 것으로 가정 된 후에도 여전히 볼 수 있다는 것입니다.
코드를 Popup1.Position.X로 변경해도 예외가 발생하지 않지만 물론 팝업은 계속 이동하지 않습니다.
또한 팝업을 부모로 사용하는 레이블은 기본 폼이 소유 한 웹 브라우저 아래에도 계속 표시됩니다.
업데이트 3
나는 문제의 번호를 발견 있지만 고정하는 것은 더 나은 작동하지 않습니다. 일부 (불가사의) 때문에
- , 그것의 주요 형태가 아닌 선택된 제어에 커트 제어를 붙여 그 후, 제어부 (CTRL-X)를 절단하는 다른 제어 및 붙여 넣기 (CTRL-V)를 선택하는 것으로 보인다. 컨트롤을 reparent하는 유일한 방법은 그것을 구조 트리에 드래그 앤 드롭하는 것입니다.
- Popup에 컨트롤을 다시 보급 한 후 Popup1.Popup (FALSE)을 호출하자마자 예외가 발생합니다. 팝업은 Create 이벤트에 표시되기 때문에 가능합니다. OnClick 이벤트로 이동하면 예외가 제거됩니다.
- 주 폼을 클릭 할 때 팝업 닫는 것을 중지하려면 .Popup을 호출하기 전에 StaysOpen 속성을 설정해야합니다. 그러나 실제로이 속성은 올바르게 작동하지 않는 것 같습니다. 예를 들어 다음 코드는 TCustomForm (Popup1.PopupForm) .Left 행으로 변경하지만 팝업 양식이 이미 소멸되어 예외가 발생합니다!
코드 : 솔루션을
procedure TForm1.Button1Click(Sender: TObject);
begin
Popup1.StaysOpen := TRUE;
Popup1.Popup(FALSE);
if Popup1.HasPopupForm then
TCustomForm(Popup1.PopupForm).Left := TCustomForm(Popup1.PopupForm).Left - 5;
end;
+ Yaroslav Brown - 귀하의 제안을 시도했습니다. 내 결과에 대해서는 위의 업데이트를 참조하십시오. – norgepaul
확인. 내가 참조. 1. 양식에 TPopup을 추가하십시오. 2. TPopup에 컨트롤을 추가하십시오. 3. Popup1.Popup; 나를 위해 팝업이 웹 브라우저 위에 나타납니다 –
지금 당장은이 방법을 사용할 수 없지만 ... a) 팝업에 컨트롤을 추가하면 기본 iOS 컨트롤과 b) 팝업을 통해 해당 팝업을 표시 할 수 있습니다. FireMonkey 컨트롤과 동일한 방식으로 네이티브 컨트롤이 이동 될 수 있습니다. iOS에서 팝업이 모달로 표시되지 않습니까? – norgepaul