InputQueryについて御教授下さい。
通常ですと、'OK'と'キャンセル'ボタンの選択となりますが
'キャンセル’を'Cancel'と表示させることは可能でしょうか?
目的は、英語版ウィンドウズで表示させた際の文字バケ対処です。
以上、宜しくお願い致します。
ソース上では、Constsで設定されていますので、そのままでは無理で
しょう。
ControlsのInputQueryのソースを参考に、自身で関数を作成されたほう
が早いと思いますが如何でしょうか?
手軽な方法は下記のような感じではないでしょうか?
1.Consts.pasを別フォルダにコピー
(仮にこのディレクトリをC:\MyVCLとします)
2.コピーしたConsts.pas内の該当文字列定数を'Cancel'に書き換え
3.<ツール>→<環境オプション>でライブラリタブ内のライブラリパスに "C:\MyVCL" を追加
※メニューはDelphi5の場合です
4."C:\MyVCL"の優先順位をDelphiの標準ライブラリより上に設定
以上で完了です。コンパイルすると書き換えた変更内容が反映されます。
回答有難う御座います。
御指摘通り作成したいのですが
具体的に参考のソースありますでしょうか?
初心者なものですみません。
>御指摘通り作成したいのですが
ご指摘通り???
Basserさんのならソース云々は関係有りません。
明記されている通りの作業だけです。
私の案なら
>ControlsのInputQueryのソース
それがそのまんまですけど・・・
SMsgDlgCancelとSMsgDlgOKの定数を宣言しているのがConsts.pasです。
なので、自作するならこのソースををコピペして、関数名を適当に
変更しSMsgDlgCancelを'Calcel'とでも変更する。
共有関数ユニットを作成して、そこにしたほうが良いと思います。
そのユニットをUsesすれば、どこでも使えますから・・・
ちなみに・・・
場所がわからなければ、自身のコードのInputQueryの箇所を
Ctrlキーを押しながらマウスをポイントしてみてください。
青文字に変わって、アンダーラインが表示されるはずです。
後は、そのままそこをクリックすればソースに飛びます。
いろいろと有難う御座います。
① 関数名を適当に変更し
SMsgDlgCancelを'Calcel'とでも変更する。
② 共有関数ユニットを作成して、そこにしたほうが良いと思います。
そのユニットをUsesすれば、どこでも使えますから・・・
お手数ですが、①②の意味が分かりません。
すみませんが、御教授願います。
一部抜粋ソース
①
※↓関数名をユニークな物に変更。変更しないと関数が重複しエラーになる可能性あり
function InputQuery(const ACaption, APrompt: string;
var Value: string): Boolean;
var
Form: TForm;
Prompt: TLabel;
Edit: TEdit;
DialogUnits: TPoint;
ButtonTop, ButtonWidth, ButtonHeight: Integer;
begin
Result := False;
・
・
・
with TButton.Create(Form) do
begin
Parent := Form;
Caption := SMsgDlgCancel ※← ここの部分言われていると思います。
ModalResult := mrCancel;
Cancel := True;
SetBounds(MulDiv(92, DialogUnits.X, 4), Edit.Top + Edit.Height + 15,
ButtonWidth, ButtonHeight);
Form.ClientHeight := Top + Height + 13;
end;
・
・
・
end;
①・・・
Controls.Pasに以下の関数があると思います。
function InputQuery(const ACaption, APrompt: string;
var Value: string): Boolean;
var
・・・
begin
・・・
end;
この関数を新規作成したユニットにコピーします。
説明するの面倒だからこんな感じ
//-----------------------------------------------------
unit Unit1;
interface
uses Windows,Forms,stdCtrls,Graphics,Controls;//追加
function MyInputQuery(const ACaption, APrompt: string; var Value: string): Boolean;//に宣言する。
implementation
function GetAveCharSize(Canvas: TCanvas): TPoint;
var
I: Integer;
Buffer: array[0..51] of Char;
begin
for I := 0 to 25 do Buffer[I] := Chr(I + Ord('A'));
for I := 0 to 25 do Buffer[I + 26] := Chr(I + Ord('a'));
GetTextExtentPoint(Canvas.Handle, Buffer, 52, TSize(Result));
Result.X := Result.X div 52;
end;
//コピペした関数をInputQueryからMyInputQueryに変更した。
function MyInputQuery(const ACaption, APrompt: string;
var Value: string): Boolean;
var
Form: TForm;
Prompt: TLabel;
Edit: TEdit;
DialogUnits: TPoint;
ButtonTop, ButtonWidth, ButtonHeight: Integer;
begin
Result := False;
Form := TForm.Create(Application);
with Form do
try
Canvas.Font := Font;
DialogUnits := GetAveCharSize(Canvas);
BorderStyle := bsDialog;
Caption := ACaption;
ClientWidth := MulDiv(180, DialogUnits.X, 4);
Position := poScreenCenter;
Prompt := TLabel.Create(Form);
with Prompt do
begin
Parent := Form;
Caption := APrompt;
Left := MulDiv(8, DialogUnits.X, 4);
Top := MulDiv(8, DialogUnits.Y, 8);
Constraints.MaxWidth := MulDiv(164, DialogUnits.X, 4);
WordWrap := True;
end;
Edit := TEdit.Create(Form);
with Edit do
begin
Parent := Form;
Left := Prompt.Left;
Top := Prompt.Top + Prompt.Height + 5;
Width := MulDiv(164, DialogUnits.X, 4);
MaxLength := 255;
Text := Value;
SelectAll;
end;
ButtonTop := Edit.Top + Edit.Height + 15;
ButtonWidth := MulDiv(50, DialogUnits.X, 4);
ButtonHeight := MulDiv(14, DialogUnits.Y, 8);
with TButton.Create(Form) do
begin
Parent := Form;
Caption := 'OK';//ここと
ModalResult := mrOk;
Default := True;
SetBounds(MulDiv(38, DialogUnits.X, 4), ButtonTop, ButtonWidth,
ButtonHeight);
end;
with TButton.Create(Form) do
begin
Parent := Form;
Caption := 'Cancel';//ここだけ変更した
ModalResult := mrCancel;
Cancel := True;
SetBounds(MulDiv(92, DialogUnits.X, 4), Edit.Top + Edit.Height + 15,
ButtonWidth, ButtonHeight);
Form.ClientHeight := Top + Height + 13;
end;
if ShowModal = mrOk then
begin
Value := Edit.Text;
Result := True;
end;
finally
Form.Free;
end;
end;
//-------------------------------------------------------
②はこのユニットを共通で使用できるように保存する。
例えば、共有するユニットをプロジェクトとは別に保存しておくフォルダー
を任意に決めておき其のフォルダーにこのユニットを適当な名前で保存しま
す。例えばMyDialogs.pasなど・・・
他のプロジェクトでこの関数を使用したい場合は、「プロジェクト」の「プ
ロジェクトの追加」でこのファイルを指定します。
また、使いたいユニットでは、「ファイル」から「ユニットの追加」でこのユニットを指定することでUses部にユニット名が追加されます
もしくは、自身でUses部にユニット名を記述しても構いません。
(上記の例では MyDialogs )
Uses部に記述すると、そのユニットで記述した関数なりが使用できます。
追加するUses部はこの場合は、interface節でもimplementation節のどちら
でも構いません。
多くの場合は、作成した関数を他のプロジェクトでも使用できるように
こんな感じで作成します。
ご承知の事と思いますが、ちなみにフォームを新規作成すると
既に、interface節のUses部に
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
が自動で追加されていると思います。
だから、Controls.pasに記述されているInputQueryが使用できます。
各コンポーネントもFormに配置すれば、必要に応じてUses部にユニット名が
自動で追加されます。
でも、DayOfやMonthOfなどDelphiで提供される便利な日付処理ルーティン
等は、Uses部にDateUtilsを別途追加して記述しないと使えません。
このDateUtils.pas(ユニット)は、この日付処理ルーティンをまとめて記述し
てあります。(詳しくはHelpでDateUtilsを参照の事)
他にも、文字列処理関数をまとめたものもあります。
Delphiで提供されるこの様なルーティンをまとめたユニットはある仕組みで
プロジェクトに追加しなくてもUses部に記述するだけで使えます。
共有化は、これと同じ事を自作関数でもしようというわけです。
でも、自身で作成したユニットは、自身でプロジェクトに追加しなければ
使えません。
もっとも、そうしなくても使える方法はありますが、まあこれはまたの
機会に・・
unit Dialogsにコピぺして①②の作業を行い実行させました。
未定義の識別子’MyInputQuery’となります。
Uses節には、Dialogsを追加しております。
(デフォルトで追加されてるみたいですが....)
unit Dialogsに追加するとダメですか?
なにか足りないのでしょうか?
>unit Dialogsにコピぺして①②の作業を行い実行させました。
Dialogs.pasの中にコピペしたのですか?
どぇ!そんな事をしてはいけません。Dialogs.pasの中身をいらうなんて、もってのほかです。
内容をよく読んでください。お願いしますよ(^_^;)
①の、新規でユニットを作成するが意味不明ですか?
「ファイル」→「新規作成」→「ユニット」です。
で、新規作成されたユニットはで念のため
unit Unit1;
interface
//-----ここから
implementation
//-----の間に
end.
①のinterfaceの次の行から最終行の記述までをコピペしてください。
其の上で、②の作業を行ってください。
できました。
Syakeさんお手数をお掛けしてすみません。
できてしまえば、簡単ですね。笑
もう少し、勉強します。
ツイート |