TWinContorl ClassとSetImeメソッドの関係???


山下  2007-01-12 10:42:39  No: 24458  IP: [192.*.*.*]

TWinControlクラスのprotected SetImeメソッドは、ClassメソッドではないのにClassメッソド見たいな動作をするんでしょうか?
ご存知の方いらっしゃいましたら情報お願い致します。

編集    削除
山下  2007-01-12 21:27:24  No: 24459  IP: [192.*.*.*]

すいません、質問の意図が見えにくくて.
以下に訂正
TWinControlクラスのprotected SetImeメソッドは、ClassメソッドではないのになぜClassメッソド見たいな動作をするんでしょうか?
ご存知の方いらっしゃいましたら情報お願い致します。

編集    削除
みえない  2007-01-12 22:35:41  No: 24460  IP: [192.*.*.*]

「Classメッソド見たいな動作」とは具体的にどんな動作なの?

編集    削除
山下  2007-01-13 00:19:47  No: 24461  IP: [192.*.*.*]

【classメソッド見たいな動作】= インスタンスを生成しなくても使える。

実際は、知らない間に何らかのobjectがTWinControlのインスタンスを生成していると思っているのですが・・・・

編集    削除
にしの  2007-01-13 01:40:46  No: 24462  IP: [192.*.*.*]

procedure TForm1.FormCreate(Sender: TObject);
begin
  TWinControl.SetIme;
end;
としても、コンパイルエラーが発生して実行できません。
# Delphi7

どういうコードでクラスメソッドみたいな動きと判断したのでしょうか。

編集    削除
にしの  2007-01-13 01:42:40  No: 24463  IP: [192.*.*.*]

追記。
procedure TForm1.FormCreate(Sender: TObject);
begin
  TForm1.SetIme;
end;
としても、
[エラー] uMain.pas(33): このメソッドの呼び方はクラスメソッドの場合に限られます
と出るため、SetImeはクラスメソッドとしては動いていないようです。

編集    削除
山下  2007-01-13 02:16:31  No: 24464  IP: [192.*.*.*]

ご返信有難うございます。
下記ソースです。

procedure TfrmShiftMasterEdit.sgdTimeOfStaticsSelectCell(Sender: TObject;
  ACol, ARow: Integer; var CanSelect: Boolean);
begin
  if ACol = 1 then
  begin
***************************************************************
    ImeMode := imDisable;  ←の部分です。
    SetIme;
***************************************************************
  end else
  begin
    with sgdTimeOfStatics do
    begin
      if  (Cells[0,Row] <> '') and (Cells[1,Row] = '')then
      begin
        if  (ARow <> Row) then
        begin
          MessageDlg('値を入力してください。',mtWarning,[mbOK],0);
          CanSelect := false;
        end;
      end;
    end;
  end;
end;

編集    削除
にしの  2007-01-13 02:30:59  No: 24465  IP: [192.*.*.*]

このコードをみても、クラスメソッドのような動きは推測できませんね。

TfrmShiftMasterEditクラスはTFormクラスを継承しているかと思いますが、さらに継承元を追っていくとTWinControlにたどり着きます。
つまり、TfrmShiftMasterEditクラスは、TWinControlクラスの下位クラスです。

プロテクトメソッドは、ヘルプをみると
「そのクラスおよび下位クラスが定義されているユニットのコードからアクセスできる」
とかかれています。
TfrmShiftMasterEditクラスはTWinControlクラスの下位クラスなので、SetImeメソッドを呼び出すことができます。
このとき、すでにTfrmShiftMasterEditオブジェクトが生成されており、そのオブジェクトの持つsgdTimeOfStaticsSelectCellプロシージャが呼ばれているはずです。

編集    削除
山下  2007-01-13 02:45:43  No: 24466  IP: [192.*.*.*]

にしのさん丁寧親切な情報ありがとうございした。
お元気で♪

編集    削除
Fusa  2007-01-15 23:36:05  No: 24467  IP: [192.*.*.*]

蛇足だとは思いますが

frmShiftMasterEdit = TfrmShiftMasterEdit
だとすると、
山下さんのかかれておられるSetImeの部分は
frmShiftMasterEdit.SetImeになってますので
ふつうだと思いますよ。

クラスメソッドなら
TfrmShiftMasterEdit.SetImeと呼べますが
クラスメソッドじゃないので、呼べないかと。

Tの有無に要注意ですね。

編集    削除