私は多くのフォームを持つプロジェクトを持っています。私はすべてのフォームでレイアウトを使用しています。
各フォームには、それらの間を移動するときの基本的に同じコード (以下を参照) があります。
Application.GotoForm('frmInventory', feFromRight);
向きを変更するまでは、すべてが素晴らしいです (たとえば、プロファイルからランドスケープに)。次に、レイアウトが台無しになります。
スクリーンショット 1 とスクリーンショット 2を参照してください。
コード例:
procedure TfrmMenu.frmMenuDeactivate(Sender: TObject);
begin
fLayout:= nil;
end;
procedure TfrmMenu.frmMenuActivate(Sender: TObject);
begin
fLayout:= Layout.Client([Layout.Top(fHeader),
Layout.Bottom(fFooter),
Layout.Client(fList)]);
end;
procedure TfrmMenu.Resize;
begin
inherited;
if assigned(FLayout) then
begin
fLayout.Resize(self)
end;
end;
それは正しいです!なぜだろう。私は何が欠けていますか?向きの変化をどのように捉えますか?
- - - アップデート - - -
このサイトで検索すると、次の記事に出くわしました。
http://www.thedelphigeek.com/2012/02/detecting-device-movement.html
次に、このstackoverflowの回答につながりました:
AndroidでJavascriptを介して加速度計にアクセスしますか?
if (window.DeviceMotionEvent == undefined) {
//No accelerometer is present. Use buttons.
alert("no accelerometer");
}
else {
alert("accelerometer found");
window.addEventListener("devicemotion", accelerometerUpdate, true);
}
SMSでは、これはそれを行うようです:
function window: variant; external 'window' property;
procedure TfrmItem.InitializeObject;
begin
inherited;
{$I 'Item:impl'}
window.addEventListener('devicemotion', @Resize, false);
.
.
.
end;
procedure TfrmItem.Resize;
begin
inherited;
if assigned(fLayout) then
begin
fLayout.Resize(self);
ResizeControls;
end;
end;