古いアプリケーションを delphi7 から delphi xe8 に移植し、intraweb 8 から intraweb XIV に移植しています。
私のアプリは、メイン プログラムといくつかの子パッケージに分割され、古いコンポーネントと完全に連携していました。
これらの新しいコンポーネントを使用すると、子パッケージからそのようなページを作成して、ページを生成してサーバー コントローラーに返そうとすると、例外が発生するようになりました。代わりに、メイン アプリからページを生成すると、機能します。
プロシージャ TIWServerController.IWServerControllerBaseGetMainForm で、子パッケージからメイン ウィンドウを取得しようとするコンポーネント (packman) のプロシージャを呼び出します。これはサーバーコントローラー関数です
procedure TIWServerController.IWServerControllerBaseGetMainForm(var vMainForm : TIWBaseForm);
begin
VMainForm := PackMan.MainLoginForm(webApplication);
end;
そして、これは packman 関数です:
function tPackMan.MainLoginForm (aOwner:tComponent) : tIwAppForm;
var Proc : tGetMainFormProc;
begin
@Proc := GetProcAddress (LoginPkg,'MainForm');
Result := Proc(aOwner);
end;
これは手続き型の定義です:
tGetMainFormProc = function (aOwner:tComponent): tIwAppForm;
これは、子パッケージ (packlogin) 内の MainForm プロシージャです。最初に、コンポーネントでいっぱいの元のフォームを作成しようとしましたが、その後、元のフォームからすべてのコンポーネントを削除しましたが、成功しませんでした。最後に、次のサンプルに示すように、空のフォームを作成しようとしました:
function MainForm (aOwner:tComponent): tIWAppForm;
begin
Result := tIWAppForm.Create(aOwner);
end;
exports MainForm;
いくつかの Outputdebugstring メッセージ (ここでは示していません) を使用してプログラムの動作を追跡し、次の結論に達しました。
1) パッケージ内の Mainform プロシージャは、有効な tIwAppform を返すようです
2) このオブジェクトは IWServerControllerBaseGetMainForm プロシージャに正しく返され、変数 VMainForm が正しく割り当てられます。
3) この変数の classname プロパティを調べると、値が "tIWAppform" であることがわかります。
プロシージャリターンで例外が発生するようです。次のコードを使用して、プロシージャ IWServerControllerBaseException でインターセプトしました。
procedure TIWServerController.IWServerControllerBaseException(
AApplication: TIWApplication; AException: Exception;
var Handled: Boolean);
begin
Dump ('UNEXPECTED EXCEPTION ' + AException.message);
Handled := true;
end;
何が欠けていますか?
なにか提案を ?
よろしく。
マウリツィオ。