以前、InkEditについて質問させていただいた者です。
InkEditを実装し、exeで起動させ、フォームを開くときに、
OLEコントロールのウィンドウハンドルの取得に失敗しました
というようなエラーメッセージが出て
フォームが開きません。
開発環境では問題ないのですが、
客先のPCで動く環境と動かない環境があります。
無知で申し訳ありませんが、解決方法はありますでしょうか?
教えていただけると助かります。
追記です。
環境はDelphiXE3 Win7 32bitです。
> 環境はDelphiXE3 Win7 32bitです。
客先の (動かない) 環境は何でしょう?
[InkEdit 再び]
http://ht-deko.minim.ne.jp/ft1302.html#130216
↑で作ったサンプルを "動かない環境" で
動作するかどうか試してみてはいかがでしょうか?
記載漏れ失礼しました。
客先のPCは、Win7 Proです。 恐らく32bitだと思うのですが、
今ちょっと分かりません…
Win7 Proで動く環境と動かない環境があります。
ちなみに、MS Win Server 2008 x64 R2 SP1 SE のサーバ上では
InkEditを含むフォームを開くと「クラスが登録されていません」という
エラーが出ていましたが、
ご教授いただいたものを試してみましたら、エラーは起こりませんでした。
ただ、手入力ができない状態です。マウスを動かしても、
カーソルが出て、キーボード入力状態になってしまいます。
客先のPCでは試せないので、サーバ上で動作できれば
大丈夫かと思っているのですが…原因がはっきりしません。
以下、DEKOさんのInkEdit再びをそのまま引用させていただき、
インク入力タイムアウト時間のプロパティを追加しました。
見よう見まねなのですが…
//-------------------------
unit uInkEdit;
interface
uses
Winapi.Windows, Winapi.Messages, Winapi.RichEdit, Vcl.Controls, Vcl.ComCtrls;
type
TInkMode =
(IM_Disabled = 0,
IM_Ink = 1,
IM_InkAndGesture = 2);
TInkInsertMode =
(IEM_InsertAsText = 0,
IEM_InsertAsInk = 1);
TInkDisplayMode =
(IDM_Ink = 0,
IDM_Text = 1);
TInkEditStatus =
(IES_Idle = 0,
IES_Collecting = 1,
IES_Recognizing = 2);
TInkEdit = class(Vcl.ComCtrls.TRichEdit)
private
function GetUseMouseForInput: Boolean;
procedure SetUseMouseForInput(const Value: Boolean);
function GetRecTimeOut: Integer;
procedure SetRecTimeOut(const Value: Integer);
protected
procedure CreateParams(var Params: TCreateParams); override;
published
property UseMouseForInput: Boolean read GetUseMouseForInput write SetUseMouseForInput;
property UseRecTimeOut: Integer read GetRecTimeOut write SetRecTimeOut; // インク入力タイムアウト時間
end;
const
InkEditClassName = 'INKEDIT';
IEC__BASE = WM_USER + $0200;
EM_GETINKMODE = IEC__BASE + 1;
EM_SETINKMODE = IEC__BASE + 2;
EM_GETINKINSERTMODE = IEC__BASE + 3;
EM_SETINKINSERTMODE = IEC__BASE + 4;
EM_GETDRAWATTR = IEC__BASE + 5;
EM_SETDRAWATTR = IEC__BASE + 6;
EM_GETRECOTIMEOUT = IEC__BASE + 7;
EM_SETRECOTIMEOUT = IEC__BASE + 8;
EM_GETGESTURESTATUS = IEC__BASE + 9;
EM_SETGESTURESTATUS = IEC__BASE + 10;
EM_GETRECOGNIZER = IEC__BASE + 11;
EM_SETRECOGNIZER = IEC__BASE + 12;
EM_GETFACTOID = IEC__BASE + 13;
EM_SETFACTOID = IEC__BASE + 14;
EM_GETSELINK = IEC__BASE + 15;
EM_SETSELINK = IEC__BASE + 16;
EM_GETMOUSEICON = IEC__BASE + 17;
EM_SETMOUSEICON = IEC__BASE + 18;
EM_GETMOUSEPOINTER = IEC__BASE + 19;
EM_SETMOUSEPOINTER = IEC__BASE + 20;
EM_GETSTATUS = IEC__BASE + 21;
EM_RECOGNIZE = IEC__BASE + 22;
EM_GETUSEMOUSEFORINPUT = IEC__BASE + 23;
EM_SETUSEMOUSEFORINPUT = IEC__BASE + 24;
EM_SETSELINKDISPLAYMODE = IEC__BASE + 25;
EM_GETSELINKDISPLAYMODE = IEC__BASE + 26;
IECN__BASE = $0800;
IECN_STROKE = IECN__BASE + 1;
IECN_GESTURE = IECN__BASE + 2;
IECN_RECOGNITIONRESULT = IECN__BASE + 3;
var
FInkEditModule: THandle;
implementation
{ TInkEdit }
procedure TInkEdit.CreateParams(var Params: TCreateParams);
const
dHideScrollBars: array[Boolean] of DWORD = (ES_DISABLENOSCROLL, 0);
dHideSelections: array[Boolean] of DWORD = (ES_NOHIDESEL, 0);
begin
if FInkEditModule = 0 then
begin
FInkEditModule := LoadLibrary('InkEd.dll');
if FInkEditModule <= HINSTANCE_ERROR then
FInkEditModule := 0;
end;
inherited CreateParams(Params);
CreateSubClass(Params, InkEditClassName);
with Params do
begin
Style := Style or dHideScrollBars[HideScrollBars] or
dHideSelections[HideSelection];
WindowClass.style := WindowClass.style and not (CS_HREDRAW or CS_VREDRAW);
end;
end;
function TInkEdit.GetUseMouseForInput: Boolean;
begin
result := SendMessage(Self.Handle, EM_GETUSEMOUSEFORINPUT, 0, 0) <> 0;
end;
procedure TInkEdit.SetUseMouseForInput(const Value: Boolean);
begin
SendMessage(Self.Handle, EM_SETUSEMOUSEFORINPUT, WPARAM(Value), 0);
end;
// インク入力タイムアウト時間
function TInkEdit.GetRecTimeOut: Integer;
begin
result := SendMessage(Self.Handle, EM_GETRECOTIMEOUT, 0, 0);
end;
procedure TInkEdit.SetRecTimeOut(const Value: Integer);
begin
SendMessage(Self.Handle, EM_SETRECOTIMEOUT, WPARAM(Value), 0);
end;
initialization
FInkEditModule := 0;
finalization
if FInkEditModule <> 0 then
FreeLibrary(FInkEditModule);
end.
procedure TForm1.FormCreate(Sender: TObject);
begin
RichEdit1.UseMouseForInput := True;
RichEdit1.UseRecTimeOut := 1000;
end;
なにか原因がありますでしょうか?
> ただ、手入力ができない状態です。マウスを動かしても、
> カーソルが出て、キーボード入力状態になってしまいます。
単なる RichEdit になっているようですが、
TForm1 が含まれるユニットに以下のコードが含まれていますか?
type
TRichEdit = class(TInkEdit); // これを追加
失礼しました。あの行がなければ、
> RichEdit1.UseMouseForInput := True;
> RichEdit1.UseRecTimeOut := 1000;
このコードでエラーになりますよね (^^;A
そうですね、下記は書いています。
type
TRichEdit = class(TInkEdit); // これを追加
補足ですが、上記のソースで、自分の環境では、InkEditと同じ動きをしました。
"Tablet PC Input Service" が停止されてるとかはないですか?
ありがとうございます。
自分の環境でTablet PC Input Serviceのサービスを停止してみましたが
手書き入力はできるので違う理由かなと思います…
> ちなみに、MS Win Server 2008 x64 R2 SP1 SE のサーバ上では
> InkEditを含むフォームを開くと「クラスが登録されていません」という
> エラーが出ていましたが、
"デスクトップ エクスペリエンス機能" はインストールされていますか?
[デスクトップ エクスペリエンスの概要]
http://technet.microsoft.com/ja-jp/library/cc772567.aspx
> 自分の環境でTablet PC Input Serviceのサービスを停止してみましたが
> 手書き入力はできるので違う理由かなと思います…
では、"Tablet PC コンポーネント" ですかね?
[ファイル名を指定して実行] から OptionalFeatures.exe と入力し、
"Tablet PC コンポーネント" にチェックが入っているかどうかを確認してみてください。
([コントロールパネル | Windows の機能の有効化または無効化] です)
誤: [コントロールパネル | Windows の機能の有効化または無効化]
正: [コントロールパネル | プログラムと機能 | Windows の機能の有効化または無効化]
ありがとうございます。
どうやらこの設定が怪しいですね…
自分の環境でやってみたら似たようなハンドルエラーになりました。
今度試してみようと思います。
サーバの設定についても確認してみます。
とりあえず解決ということにさせていただきます。
ありがとうございました。
Windows Vista / 7 の高速化とかいうトピックには
大抵この "Tablet PC" 関連の無効とか削除が掲載されていますからね。
[Google 先生に聞いてみた]
https://www.google.co.jp/search?q=Tablet+PC+コンポーネント+削除+高速化&ie=utf-8&oe=utf-8
サーバでない限り、デフォルトで有効かつ簡単には外せるものではないので、
高速化の記事を見たどなたかが外されたのかもしれませんね。
逆にサーバでは Vista / 7 の幾つかの機能がインストールされていないので、
必要であれば "デスクトップ エクスペリエンス機能" 等を
手動でインストールする必要があります。
情報ありがとうございます。
このような設定があることを知りませんでした…
他社のシステムも入っているPCなので導入時に外されたのかもしれません…
今後留意したいと思います。
ありがとうございました。
ツイート | ![]() |