もう一つ質問させてください。
if 〜 then ○○ else △△;
if 〜 then △△ else □□;
○○
begin
処理内容1
end;
△△
begin
処理内容2
end;
□□
begin
処理内容3
end;
といった感じで、同じ処理を使い回ししたいのですが、これはlabelとgotoを使う以外に何かスマートなやり方はあるのでしょうか?
Delphiには内部関数(正式名称ではないかも)というものがあります。
それが便利に使えるでしょう。
まあ、多分ヘルプに載っていると思いますので、
procedureやfunction をキーワード検索で探したら、載ってるかもしれません。
たかみちえさん、ありがとうございます。
ヘルプを検索してみましたが、それらしきものが見つかりませんでした。
具体的にどのように記述するかご存じでしょうか?
うーん、うちのサイトで公開しているソフトのソースを見れば、一番いいのですけど…。
(思いっきり使ってるし)
まあ、たいしたことはなく、procedureからbeginまでの間に、
もうひとつ関数を定義すればいいんですけどね。
procedure Outer;
procedure Inner;
begin
end;
begin
end;
外の関数の引数、中の関数の定義の上で宣言した変数は、中の関数でも使えます。
interface部に
var
procedure ○○;
implementation部に
procrdure ○○;
begin
処理内容1
end;
procrdure Button1Click(...);
begin
if 〜 then ○○;
end;
procrdure Button2Click(...);
begin
if 〜 then ○○;
end;
というやり方もあります
> procrdure
スペルミスです。procedureでした。
関数内でコンポーネントを使いたい場合には、
TFormのpublicのところにでも入れるといいでしょう。
ここらへんは用途によって変えてください。
procrdure ○○;
begin
if Edit1.Text = '' then
処理内容1
else
処理内容2;
end;
今ソースを整理しているので、その後に実践してみます。
たかみちえさん、nullさん、ありがとうございました。
private
procedure ABC;
------
procrdure Button1Click(...);
begin
if 〜 then ABC;
end;
procedure ABC;
begin
PageControl1.Height := ***;
end;
のようにしてみたんですが、
「未定義の識別子 : 'PageControl1'」
とエラーが出てしまいました。
どの部分が違うのでしょうか?
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です。
この違いがわかれば、どこで間違えているかわかると思います。
もう1つOKなパターンを出しておきますね。
# これがないと比較になりませんでした
ClassA=class
private
i: integer;
public
procedure ABC;
end;
として、
procedure ClassA.ABC;
begin
i := 0;
end;
これならOKです。
たぶん、PageControl1もこのように使いたかったのだと思います。
単純に
procedure?Form1.ABC
とすれば、エラーでなくなると思いますけど。
procedure?Form1.ABC(誤)
procedure Form1.ABC(正)
でした。失礼。
private
procedure ABC;
の部分を消去し、
procedure ABC;
begin
PageControl1.Height := ***;
end;
を
procedure ABC;
begin
Form1.PageControl1.Height := ***;
end;
のように書き直し、
procrdure Button1Click(...);
begin
if 〜 then ABC;
end;
を記述する手前に移動する事で解決しました。
ありがとうございました。
Gachさんがどう定義しているかによると思いますよ。
ABCを呼んでいるButton1Clickも、クラスのメンバプロシージャではなさそうですし。
PageControl1の宣言をするだけで動くかもしれません。
いずれにしても、Gachさんがもう少し略さずに書いてもらわないと、予測にしかなりません。
ポップアップメニューで「タイトルバー非表示」「縦型スタイル」など、見た目を変更する項目を作ってあります。
これらの見た目変更を全て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;
という感じで呼び出したいのです。
言葉足らずで申し訳ありませんでした。
上記を書いた後、下のようにしてみるとあっさり解決してしまいました。
private
procedure ABC;
------
procrdure Button1Click(...);
begin
if 〜 then ABC;
end;
procedure TMainForm.ABC;
begin
PageControl1.Height := ***;
end;
処理内容を下の方に移動しても大丈夫でしたので、これで良いと思うのですが、合っていますでしょうか?
ツイート | ![]() |