InputQueryについて

解決


りえ  2007-06-11 21:04:24  No: 26592

InputQueryについて御教授下さい。
通常ですと、'OK'と'キャンセル'ボタンの選択となりますが
'キャンセル’を'Cancel'と表示させることは可能でしょうか?
目的は、英語版ウィンドウズで表示させた際の文字バケ対処です。
以上、宜しくお願い致します。


Syake  2007-06-11 22:15:28  No: 26593

ソース上では、Constsで設定されていますので、そのままでは無理で
しょう。
ControlsのInputQueryのソースを参考に、自身で関数を作成されたほう
が早いと思いますが如何でしょうか?


Basser  2007-06-11 22:56:46  No: 26594

手軽な方法は下記のような感じではないでしょうか?

1.Consts.pasを別フォルダにコピー
  (仮にこのディレクトリをC:\MyVCLとします)

2.コピーしたConsts.pas内の該当文字列定数を'Cancel'に書き換え

3.<ツール>→<環境オプション>でライブラリタブ内のライブラリパスに "C:\MyVCL" を追加
  ※メニューはDelphi5の場合です

4."C:\MyVCL"の優先順位をDelphiの標準ライブラリより上に設定

以上で完了です。コンパイルすると書き換えた変更内容が反映されます。


りえ  2007-06-11 23:00:34  No: 26595

回答有難う御座います。
御指摘通り作成したいのですが
具体的に参考のソースありますでしょうか?
初心者なものですみません。


Syake  2007-06-11 23:33:32  No: 26596

>御指摘通り作成したいのですが
ご指摘通り???
Basserさんのならソース云々は関係有りません。
明記されている通りの作業だけです。
私の案なら
>ControlsのInputQueryのソース
それがそのまんまですけど・・・
SMsgDlgCancelとSMsgDlgOKの定数を宣言しているのがConsts.pasです。
なので、自作するならこのソースををコピペして、関数名を適当に
変更しSMsgDlgCancelを'Calcel'とでも変更する。
共有関数ユニットを作成して、そこにしたほうが良いと思います。
そのユニットをUsesすれば、どこでも使えますから・・・


Syake  2007-06-11 23:39:50  No: 26597

ちなみに・・・
場所がわからなければ、自身のコードのInputQueryの箇所を
Ctrlキーを押しながらマウスをポイントしてみてください。
青文字に変わって、アンダーラインが表示されるはずです。
後は、そのままそこをクリックすればソースに飛びます。


りえ  2007-06-12 00:18:28  No: 26598

いろいろと有難う御座います。

① 関数名を適当に変更し
   SMsgDlgCancelを'Calcel'とでも変更する。
② 共有関数ユニットを作成して、そこにしたほうが良いと思います。 
   そのユニットをUsesすれば、どこでも使えますから・・・

お手数ですが、①②の意味が分かりません。
すみませんが、御教授願います。


Ru  2007-06-12 00:59:48  No: 26599

一部抜粋ソース

      ※↓関数名をユニークな物に変更。変更しないと関数が重複しエラーになる可能性あり
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;


Syake  2007-06-12 01:06:46  No: 26600

①・・・
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節のどちら
でも構いません。
多くの場合は、作成した関数を他のプロジェクトでも使用できるように
こんな感じで作成します。


Syake  2007-06-12 01:42:33  No: 26601

ご承知の事と思いますが、ちなみにフォームを新規作成すると
既に、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部に記述するだけで使えます。
共有化は、これと同じ事を自作関数でもしようというわけです。
でも、自身で作成したユニットは、自身でプロジェクトに追加しなければ
使えません。
もっとも、そうしなくても使える方法はありますが、まあこれはまたの
機会に・・


りえ  2007-06-12 03:08:24  No: 26602

unit Dialogsにコピぺして①②の作業を行い実行させました。
未定義の識別子’MyInputQuery’となります。
Uses節には、Dialogsを追加しております。
(デフォルトで追加されてるみたいですが....)
unit Dialogsに追加するとダメですか?
なにか足りないのでしょうか?


syake  2007-06-12 03:24:45  No: 26603

>unit Dialogsにコピぺして①②の作業を行い実行させました。
Dialogs.pasの中にコピペしたのですか?
どぇ!そんな事をしてはいけません。Dialogs.pasの中身をいらうなんて、もってのほかです。

内容をよく読んでください。お願いしますよ(^_^;)


Syake  2007-06-12 03:45:08  No: 26604

①の、新規でユニットを作成するが意味不明ですか?
「ファイル」→「新規作成」→「ユニット」です。

で、新規作成されたユニットはで念のため
unit Unit1;

interface
//-----ここから
implementation
//-----の間に
end.
①のinterfaceの次の行から最終行の記述までをコピペしてください。
其の上で、②の作業を行ってください。


りえ  2007-06-12 06:16:52  No: 26605

できました。
Syakeさんお手数をお掛けしてすみません。
できてしまえば、簡単ですね。笑
もう少し、勉強します。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加