決まった処理を使い回しするには?

解決


Gach  2003-05-20 06:41:18  No: 3569

もう一つ質問させてください。

if 〜 then ○○ else △△;
if 〜 then △△ else □□;

○○
begin
処理内容1
end;

△△
begin
処理内容2
end;

□□
begin
処理内容3
end;

といった感じで、同じ処理を使い回ししたいのですが、これはlabelとgotoを使う以外に何かスマートなやり方はあるのでしょうか?


たかみちえ  URL  2003-05-20 07:12:37  No: 3570

Delphiには内部関数(正式名称ではないかも)というものがあります。
それが便利に使えるでしょう。
  まあ、多分ヘルプに載っていると思いますので、
procedureやfunction をキーワード検索で探したら、載ってるかもしれません。


Gach  2003-05-20 11:33:02  No: 3571

たかみちえさん、ありがとうございます。
ヘルプを検索してみましたが、それらしきものが見つかりませんでした。
具体的にどのように記述するかご存じでしょうか?


たかみちえ  URL  2003-05-20 15:54:35  No: 3572

うーん、うちのサイトで公開しているソフトのソースを見れば、一番いいのですけど…。
(思いっきり使ってるし)

  まあ、たいしたことはなく、procedureからbeginまでの間に、
もうひとつ関数を定義すればいいんですけどね。
procedure Outer;
  procedure Inner;
  begin
  end;
begin
end;
外の関数の引数、中の関数の定義の上で宣言した変数は、中の関数でも使えます。


null  2003-05-21 01:04:31  No: 3573

interface部に
var
  procedure ○○;

implementation部に

procrdure ○○;
begin
  処理内容1
end;

procrdure Button1Click(...);
begin
  if 〜 then ○○;
end;

procrdure Button2Click(...);
begin
  if 〜 then ○○;
end;

というやり方もあります


null  2003-05-21 01:09:43  No: 3574

> procrdure
スペルミスです。procedureでした。

関数内でコンポーネントを使いたい場合には、
TFormのpublicのところにでも入れるといいでしょう。
ここらへんは用途によって変えてください。

procrdure ○○;
begin
  if Edit1.Text = '' then 
     処理内容1
  else
     処理内容2;
end;


Gach  2003-05-21 06:09:59  No: 3575

今ソースを整理しているので、その後に実践してみます。
たかみちえさん、nullさん、ありがとうございました。


Gach  2003-05-21 07:10:56  No: 3576

private
  procedure ABC;
------
procrdure Button1Click(...);
begin
  if 〜 then ABC;
end;

procedure ABC;
begin
  PageControl1.Height := ***;
end;

のようにしてみたんですが、
「未定義の識別子 : 'PageControl1'」
とエラーが出てしまいました。
どの部分が違うのでしょうか?


にしの  2003-05-21 07:45:33  No: 3577

ABCプロシージャはクラスのメンバではないようですが、PageControl1とスコープは同じになっているのでしょうか。
たぶん、
・ABCプロシージャがFormクラスのメンバプロシージャで、Formに貼り付けたPageControl1を操作したい
・ABCプロシージャはクラスのメンバプロシージャではなく、PageControl1も、ユニットに宣言した(クラスのメンバではない)変数である

か、どちらかだと思います。

クラスとユニットは違いますよ。そこはOKでしょうか。
クラス内で定義した変数は、クラスを通して使わないといけません。
ClassA=class
private
  i: integer;
end;

とあったとき、
procedure ABC;
begin
  i := 0;
end;

とはできません。
procedure ABC;
var
  objA: ClassA;
begin
  objA := ClassA.Create;
  objA.i := 0;
end;
これはOKです。
この違いがわかれば、どこで間違えているかわかると思います。


にしの  2003-05-21 07:47:00  No: 3578

もう1つOKなパターンを出しておきますね。
# これがないと比較になりませんでした

ClassA=class
private
  i: integer;
public
  procedure ABC;
end;
として、
procedure ClassA.ABC;
begin
  i := 0;
end;

これならOKです。

たぶん、PageControl1もこのように使いたかったのだと思います。


Fago  2003-05-21 08:37:05  No: 3579

単純に
procedure?Form1.ABC
とすれば、エラーでなくなると思いますけど。


Fago  2003-05-21 08:38:35  No: 3580

procedure?Form1.ABC(誤)
procedure Form1.ABC(正)
でした。失礼。


Gach  2003-05-21 09:09:11  No: 3581

private
  procedure ABC;
の部分を消去し、

procedure ABC;
begin
  PageControl1.Height := ***;
end;


procedure ABC;
begin
  Form1.PageControl1.Height := ***;
end;

のように書き直し、

procrdure Button1Click(...);
begin
  if 〜 then ABC;
end;
を記述する手前に移動する事で解決しました。
ありがとうございました。


にしの  2003-05-21 09:12:09  No: 3582

Gachさんがどう定義しているかによると思いますよ。
ABCを呼んでいるButton1Clickも、クラスのメンバプロシージャではなさそうですし。
PageControl1の宣言をするだけで動くかもしれません。

いずれにしても、Gachさんがもう少し略さずに書いてもらわないと、予測にしかなりません。


Gach  2003-05-21 11:09:16  No: 3583

ポップアップメニューで「タイトルバー非表示」「縦型スタイル」など、見た目を変更する項目を作ってあります。
これらの見た目変更を全て1つの処理で全部使い回しできるようにしたいと思い、処理内容は書けたのですが、それを呼び出す方法がわからず、こちらに質問させて頂きました。

procedure MainForm.pumBsNoneClick(Sender: TObject);
begin
  pumBsNone.Checked := not pumBsNone.Checked;
  HyoujiChange;
end;

procedure MainForm.ViewChangeClick(Sender: TObject);
begin
  ViewChange.Checked := not ViewChange.Checked;
  HyoujiChange;
end;

procedure HyoujiChange;
begin
  if pumBsNone.Checked = True then
    MainForm.ClientHeight := ***;
    MainForm.ClientWidth := ***;
    PageControl1.Height := ***;
    PageControl1.Width := ***;
  else
    MainForm.ClientHeight := ***;
    MainForm.ClientWidth := ***;
    PageControl1.Height := ***;
    PageControl1.Width := ***;
  (略)
end;

という感じで呼び出したいのです。
言葉足らずで申し訳ありませんでした。


Gach  2003-05-21 11:16:40  No: 3584

上記を書いた後、下のようにしてみるとあっさり解決してしまいました。
private
  procedure ABC;
------
procrdure Button1Click(...);
begin
  if 〜 then ABC;
end;

procedure TMainForm.ABC;
begin
  PageControl1.Height := ***;
end;

処理内容を下の方に移動しても大丈夫でしたので、これで良いと思うのですが、合っていますでしょうか?


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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