トップページ⇒tech
1001コメント319KB

【Delphi初心者】今から始めるDelphi Part01

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
初心者同士馴れ合いながら、一つのアプリを作成していく目標を持ったスレです。
もちろん、質問もOKです。

質問はage
回答はsage


第一回 画像表示ソフトを作ろう


くだすれDelphi(超初心者向け) Part5
http://pc2.2ch.net/test/read.cgi/tech/1061090908/l50
0153デフォルトの名無しさんNGNG
>>152
どうもです。
どのスレか見失ってしまったのですが、XPは対応していない
という書き込みを見たような気がしたものですから。
thxです。
0154デフォルトの名無しさんNGNG
Delphi6 Personalはもう落とせないのでしょうか。OSを再インストールして、
もう一度Delphiを入れ直そうとしたらDelphi7(使用期限あり)に変わってたようで。
0155デフォルトの名無しさんNGNG
ダウンロードページが書き換わってるね。
ファイルはまだある
Ftp://ftpa.borland.co.jp/pub/delphi/personal/BorlandDelphiPersonalEditionJP.exe
0156デフォルトの名無しさんNGNG
>>155
ありがとうございます。助かりました。
0157デフォルトの名無しさんNGNG
delphi7ってアカデミーパックないの?
studio proを買おうと思ってるんだけど、アカデミーパックが見付からない。
0158デフォルトの名無しさんNGNG
>>157
http://www.amazon.co.jp/exec/obidos/ASIN/B0000794TV/qid=1083244594/sr=1-5/ref=sr_1_8_5/250-3713163-3141030
0159デフォルトの名無しさんNGNG
こんばんわ
ListBoxについて質問です。

リソースファイルを以下の様に宣言して、画面に表示されたのですが、
値の追加はどのようにすればいいのでしょうか?
SendMessage(hWnd,LB_INSERTSTRING,0,s);
では値か表示されませんでした・・・

PAGE1 DIALOG DISCARDABLE 0, 0, 160, 124
CAPTION "未読"
FONT 9, "MS Pゴシック"
BEGIN
AUTOCHECKBOX"送受後(&R)",101, 12, 12, 100, 10
LISTBOX 151, 14, 20, 80 , 65
PUSHBUTTON"送信(&D)", 199, 140, 72, 48, 14
END
0160デフォルトの名無しさんNGNG
>>159 なんでDelphi?
0161sageNGNG
>>160
ただで使えるからです・・・
0162デフォルトの名無しさんNGNG
SendMessage(GetDlgItem(hWnd, IDC_MCDLIST), LB_INSERTSTRING,0,Longint(PChar('kkk')));

で出来ました。ふぅ
0163デフォルトの名無しさんNGNG
FileListBoxに対してフルパス もしくは fileNmaeを与えることによってそのList内での順番を得るにはどうしたらよいのでしょうか?


FileListBoxの中身
001.txt
002.txt
003.txt
・・
・・・
・・
・・


これに対して
003.txt(もしくはC:\・¥・・¥003.txt)という引数をを入れた場合の返り血として 3 がほしいのです。
0164デフォルトの名無しさんNGNG
>>163
FileListBox1.Items.IndexOf('003.txt');
0から始まるから、2が返ってくるけど。
0165デフォルトの名無しさんNGNG
質問ですが、
配置したボタンをクリックすると、同時に起動している別のエディタのカーソルの位置に
指定の文字列が入力されるようにするにはどのようにすればよいのでしょうか?
0166デフォルトの名無しさんNGNG
以下のコードで起動してるメモ帳に Edit1 の内容を挿入できましたが、
ウィンドウの検索方法が厳密でないので、同名のウィンドウが複数
存在する場合、予期しない動作をするかもしれません。

procedure TForm1.Button1Click(Sender: TObject);
var
  Target: HWND;
begin
  Target := FindWindowEx(0, 0, 'Notepad', '無題 - メモ帳');
  if Target <> 0 then
  begin
    Target := FindWindowEx(Target, 0, 'Edit', nil);
    if Target <> 0 then
      SendMessage(Target, EM_REPLACESEL, 0, Integer(PChar(Edit1.Text)));
  end;
end;
0167デフォルトの名無しさんNGNG
メモ帳の場合はエディット部分がウィンドウズのEDITコントロールですから、
EM_XXXX メッセージが使えます。でも、秀丸とか EmEditor とか他のメジャー
なエディタは独自のエディットコントロールを使っていますので、EM_XXX や
WM_XXXX のようなメッセージにはほとんど応答しません。クリップボード経由
ならなんとかなるかも知れませんが。
0168デフォルトの名無しさんNGNG
SelectDirectoryで取得したパスの一階層上のパス(C:\AAAA\BBBBをC:\AAAに)
を取ろうと思い。ExtractHTTPFieldsで分解してリストボックスに表示させました。

uses HTTPApp

var
 DirPath: string;
 chrSepa,chrWhite: TSysCharSet;
 sltResult: TStringList;
begin
 DirPath := DirPathBox.Text;
 sltResult := TStringList.Create;
 sltResult.Clear;
 chrSepa := ['\'];
 // 分解
 ExtractHTTPFields(chrSepa,chrWhite,PChar(DirPath),sltResult);
 // 表示
 ListBox1.Items.Assign(sltResult);
 sltResult.Free;
end;

その結果次の様になったのですがドライブを指定した場合不明な文字・が出てきます。

パス :C:\AAAA\BBBB | C:\
文字列:C:             | C:
      :AAAA          | ・   
      :BBBB          |

このままだと、この後にfor文でリストボックスのカウントを使って一階層上のパスに
結合させようとした事ができません。
この・は何なのでしょうか。出ないようにすることはできるのでしょうか?
また、もっと簡単に一階層上のパスを取得する方法が有ればそちらも教えて頂きたいです。
0169デフォルトの名無しさんNGNG
えーと、C:\とC:\AAAを分解した時のリストボックスのカウントが
・のせいで同じ2になってしまうのです。
0170デフォルトの名無しさんNGNG
書き忘れ…使ってるバージョンはデルファイ5です
0171デフォルトの名無しさんNGNG
なんだか、ワケワカだが

> パスの一階層上のパス(C:\AAAA\BBBBをC:\AAAに)を取ろうと思い

なら、ExtractFilePath() をつかって

ExtractFilePath('C:\AAAA\BBBB') → C:\AAAA\

だけど。
0172デフォルトの名無しさんNGNG
つづき

ExcludeTrailingBackslash(ExtractFilePath('C:\AAAA\BBBB')) → 'C:\AAAA'
0173デフォルトの名無しさんNGNG
ExtractFileDir
0174デフォルトの名無しさんNGNG
おお!
0175168NGNG
>>171-173
ありがとうございます。
そうですか、関数でありましたか…
0176デフォルトの名無しさんNGNG
Delphi使い始めの初心者です。だれか助けてくださいonz
str: string;

if OpenDialog.Execute then
str := OpenDialog.FileName;

with IBDatabase do begin // InterBaseDBへの接続
Params.Clear;
Params.Add('user_name=SYSDBA');
Params.Add('password=??????');
Params.Add('lc_ctype=sjis_0208');
DatabaseName := str;
Open;
end;

with IBTransaction do begin
DefaultDatabase := IBDatabase;
Active := True;
end;
こんな感でデータベースとの接続が出来るのは分かりました。
OpenDialogで選ばれたフォルダがローカルの時は問題なく動きます。
例 strの中身←'c:\ib\test.gdb'
LAN上の別のパソコンのDBに繋ぐにはどうしたらよいのでしょうか?
例 strの中身←'\\server\サーバー\ib\test.gdb'
とかで繋がらなくてエラーになります。

strの中身を'server:d:\ib\test.gdb'に書き変えると繋がる場合、
strをどのように書き換えたら良いのでしょうか?
'd:'指定が要らずに繋がったはずなのですが、やり方を忘れましたtt
どなたか教えてください。
0177ミ,,゚Д゚彡 ◆A6VzDeLphI NGNG
共有フォルダの設定や、\\鯖\D$\Program Files\...とかじゃないんですか?

Explorerのアドレスバーへの入力ではそれでアクセス可能かと。

権限を得る方法は、知らないので誰か
フォローおねがいしまつ。
0178176NGNG
177さん、ありがとうございます。

Explorerのアドレスバーへ \\server\ib と入力したら確かに test.gdbファイルが見えました。
見えるって事は権限あるって事ですよね?

理屈から考えると、パス込みのファイル名は \\server\ib\test.gdb のはず
なのですが、IBDatabase.FileNameにそのまま渡してもうまくいきません。

う〜ん、行き詰まってしまいましたonz
0179デフォルトの名無しさんNGNG
'server:d:\ib\test.gdb'の場合、そのマシンのInterbaseサーバが処理してて、それとクライアントが通信してるんだよね。

Interbaseサーバは違うマシンのDBファイルを扱わなかったと思うが違うか?
0180176NGNG
179さん、ありがとうございます。

違うマシンのDBファイルじゃダメなんですね。
分かりました。他の方法を考えます。
0181デフォルトの名無しさんNGNG
>>180
安易な発想ですが、ネットワークドライブを割り当ててみたらどうですか?
0182デフォルトの名無しさんNGNG
質問なのですが、ShellListViewコンポーネントでフォルダを移動したときに
ディレクトリパスの表示を変えたいのですが、どのイベントで「フォルダを移動した」
ということがわかるのでしょうか??
onChangeでは取れないみたいなので。。
よろしくお願いします。
0183182NGNG
age~
0184デフォルトの名無しさんNGNG
>>182
OnClickでいいんじゃないの?
0185182NGNG
>>184
できたー!!ありがとうございます。
onDblClickでやったらできました!
ふぅ、勉強不足。。
0186デフォルトの名無しさんNGNG
質問です。swf(flash) を表示したいです。どうしたらよいですか。
0187デフォルトの名無しさんNGNG
ShellExecute
0188デフォルトの名無しさんNGNG
>>186
ShowMessage('swf(flash)');
0189186NGNG
>187
その単語で検索していろいろとやってみます。
>188
センスなし!次ぃっ!
0190デフォルトの名無しさんNGNG
>>189
swf(flash).Visible:=True;
0191デフォルトの名無しさんNGNG
>>186
表示したい場所に TWebBrowser を貼り付ける。
WebBrowser1.Navigate('ファイル名.swf');
もし 'ファイルのダウンロード' が出てくるならもう少し工夫が必要。
0192デフォルトの名無しさんNGNG
6.0使ってます。
QuickReportを使って、Paradox.DBの内容を一件ごとに一頁印刷し
改頁するというアプリを作ってるのですが、うまくいきません。

用紙は定形ではなく連続用紙なので、レポートの設定で用紙サイズと
同じ「カスタムサイズ幅210x長さ140」と設定してるんですが、実際
印刷するときはA4になってしまっているようで、改ページ位置がA4と
同じ位置になってしまいます。

プリンタ設定を見てみると用紙サイズA4になっているので、「ユーザー
定義1」に手動で変更してみても駄目です。
どうしたら縦140mmの位置で改ページできるでしょうか。
0193デフォルトの名無しさんNGNG
>>186
関連付けで実行したいなら>>187
IEコンポで開きたいなら>>191

そのまま開きたい場合。
Flashのバージョンや環境によって少々変化するかもしれません。
ActiveXコントロールからの取り込みでShockWave ActiveX Controlを取り込み
以下のような感じで開く。
LoadMovieの第一引数はよくわかりません
procedure TForm1.Open1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
ShockwaveFlash1.LoadMovie(0,od.FileName);
end;
0194186NGNG
>193
ご丁寧にありがとう御座います。無事うまくできました。
>187,>191
ご助言感謝します。ありがとう御座いました。
0195デフォルトの名無しさんNGNG
質問です。

ある9つのEditに、1から9の、それぞれ数字をランダムに入れたいと思います。
ランダマイズ関数だけでは数字がかぶってしまうことがあると思うのですが、どのようにすれば全て異なる数字になるのでしょうか。
0196デフォルトの名無しさんNGNG
配列に1..9をセットしてシャッフルする
0197デフォルトの名無しさんNGNG
>>196
ありがとうございます。
シャッフルというのを使ったことがないのでわからないのですが、どう記述すればよいのでしょう。
0198デフォルトの名無しさんNGNG
>>197
こんな感じとか

procedure TForm1.Button1Click(Sender: TObject);
var
num:array[1..9] of integer;
i,j,tmp:integer;
begin
for i := 1 to 9 do num[i] := i;

randomize;
for i := 9 downto 2 do begin
j := Random(i)+1;
tmp := num[j];
num[j] := num[i];
num[i] := tmp;
end;

Memo1.Clear;
for i := 1 to 9 do
Memo1.Lines.Add(IntToStr(num[i]));
end;
0199デフォルトの名無しさんNGNG
delphi6落としたんだけどまず何からつくればいい?
オンクリックメッセージとかなしで。
0200デフォルトの名無しさんNGNG
>>199
作りたいものがあるならそれを作ればいいし
単純に勉強したいならメモ帳クローン。
新規、ロード済み、編集中とかの状態を管理することを覚えられるし
標準的なメニューの実装方法をどう書くかとか
バージョン情報のダイアログの作り方とか一通りマスターできる。
0201デフォルトの名無しさんNGNG
>>199
プロジェクトを保存するディレクトリを作ろう。
0202デフォルトの名無しさんNGNG
俺はサブディレクトリ検索して分類・ランク付け・削除機能付のエロ画像をランダムに表示するビューア作ったな。
0203デフォルトの名無しさんNGNG
>>199
ゲームもよろしく

Delphiまとめ
http://gamdev.org/w/?%5B%5BDelphi%A4%DE%A4%C8%A4%E1%5D%5D
【Delphi】 ゲームつくるぞ(゚Д゚)ゴルァ 【作れば?】
http://pc5.2ch.net/test/read.cgi/gamedev/1051110669/
Delphiでアクションゲームが作りたい!! Part2
http://pc5.2ch.net/test/read.cgi/gamedev/1027482533/
Delphiゲームプログラミング相談室
http://pc5.2ch.net/test/read.cgi/gamedev/1006249204/
delphiでMMO
http://pc5.2ch.net/test/read.cgi/gamedev/1072515100/
ネットワークゲーム作成のお勉強(Delphi専用スレ)
http://pc5.2ch.net/test/read.cgi/gamedev/1028278884/
[Delphi] RPG作らねば [Delphi]
http://pc2.2ch.net/gamedev/kako/1013/10139/1013976376.html
0204デフォルトの名無しさんNGNG
>>199
画像サムネイル表示機能付きエクスプローラ。
0205デフォルトの名無しさんNGNG
それまんまExplorerじゃん
ShellExecute一発でできるよw
0206199NGNG
おー
たくさんのレスありがとう。
やる気が出たよ
0207デフォルトの名無しさんNGNG
>>198
お礼遅くなり申し訳ありません。
それではEditに書き込んでいく場合は、下の方のListBoxをEditでループさせていく、ということでしょうか。

本当にありがとうございます。
0208デフォルトの名無しさんNGNG
意味不明なこと書いてました

ListBoxをEditでループさせていく
↓
Memo.LinesでなくEditに置き換える
0209デフォルトの名無しさんNGNG
>>208
そうだね。Edit1 〜 Edit9 だとすると

for i := 1 to 9 do
TEdit(FindComponent('Edit'+IntToStr(i))).Text := IntToStr(num[i]);

のように。
0210デフォルトの名無しさんNGNG
as 使った方がいいよ。
0211デフォルトの名無しさんNGNG
どうして? キャストはノーコスト、as はいっぱいコードが走る。
確定時になぜに as ?
0212デフォルトの名無しさんNGNG
Edit1 という名前の TListBox があるかも知れない、とか心配してるんじゃないの
0213デフォルトの名無しさんNGNG
Edit1ってLabelがあったらクラッシュするから。
素のキャストをするのはisでチェックしたものだけにしといた方がいい。
プログラミングってそういうものだよ。
0214デフォルトの名無しさんNGNG
nil を心配してるんだろ
0215デフォルトの名無しさんNGNG
> Edit1 〜 Edit9 だとすると

これ読めないの?
0216デフォルトの名無しさんNGNG
TLabel に Edit1 っていう名前を付けないようにする。
プログラミングってそういうものだよ。
0217デフォルトの名無しさんNGNG
>>214
nilはasでも検出できない。

>>215
そういう別の場所で決められたルールには依存したくないってこと。
begin〜end内で完結した正しい記述ができればそうしたい。
パフォーマンスが問題にならないところで安全なコードが書けるなら安全に書く。
という習慣づけをしてるってだけ。強要はしないけどね。
0218デフォルトの名無しさんNGNG
as がいいことは分かった。でも TLabel に Edit1 っていう名前を付けるのはそれ以前の問題
0219デフォルトの名無しさんNGNG
>>216
>別の場所で決められたルールには依存したくないってこと

なら、FindComponent は、はなから使えないじゃん
0220デフォルトの名無しさんNGNG
for ループ内 FindComponent 使ってるんだから、名前にある種の規則性を前提に
していることは明白だろう
0221デフォルトの名無しさんNGNG
>>219-220
FindComponentの話はしてないよ・・・
is/asの使い分けの基準のことしか言ってないよ。
0222デフォルトの名無しさんNGNG
210は独りことかよ
0223デフォルトの名無しさんNGNG
「馬鹿に何を言っても無駄」の良い例ですね。
0224221NGNG
>is/asの使い分けの基準のことしか言ってないよ。
is/asじゃなくてキャストとasの使い分けだった。

>>222
210は自分じゃないよ。それ以降が自分が書いたレス。
ま、主張は同じだけど。
0225デフォルトの名無しさんNGNG
で 理由は 「Edit1ってLabelがあったらクラッシュするから。」ですか?
0226デフォルトの名無しさんNGNG
実行中にはコンポーネントの名前をユーザは変えられないんだから、キャストで問題ないんじゃないの
0227デフォルトの名無しさんNGNG
>>225
違う。もっと一般的な理由。

一般に外から渡されたTObjectなオブジェクトの参照はキャストすべきでない。
asを使うかisでチェックしてからキャストすべき。
理由はもし想定外のオブジェクトが渡されたときデバッグが困難になるから。
ただし、動作速度が問題になるようなケースではこのルールは適用しないことも考慮すべき。

補足すると>>209のケースに限定すればはっきりいってどうでもいいよ。
どうしてと聞いたので理由を述べただけだし。
ただ自分は常にasを書くね。>>217でも言ったとおり
どっちでもいいなら安全なコードを書きたいし
外部の条件を一々考慮せずになるべく統一的に書きたい心理があるから。

以上。もう寝る。
0228デフォルトの名無しさんNGNG
>>227
>一般に外から渡されたTObjectなオブジェクトの参照はキャストすべきでない。

はい、もちろんこれは同意します。

>補足すると>>209のケースに限定すればはっきりいってどうでもいいよ。

そうですね、FindComponent は「想定外のオブジェクトが渡されたとき」ってないですよね。
だから、

>確定時になぜに as ?

と訊いたのです。その回答が

>Edit1ってLabelがあったらクラッシュするから。

というものだったので、それは納得できないと。どっちでもいいのではなく、as が
この場合は冗長なのだと。

> 外部の条件を一々考慮せずに

一々考慮するべきだと思うよ。

>プログラミングってそういうものです。
0229デフォルトの名無しさんNGNG
>>227
一般論に適合しないケースに一般論を適用しようとしたら無理があるだろ
0230デフォルトの名無しさんNGNG
>>228
>一々考慮するべきだと思うよ。
まぁ、ベーシックは全てグローバル変数だから、
いちいち考慮する必要がありますけどね。
0231デフォルトの名無しさんNGNG
私なら型チェックは徹底して行いますね。

冗長性というのは、is の後に as でキャストする事では?
0232208NGNG
>>209
ありがとうございました。

>>210以降
私がいただいたアドバイスの派生ですよね。
難しすぎてわからず、何がなにやらというところなのですが(汗)、ありがとうございました。
0233デフォルトの名無しさんNGNG
>>228
>確定時になぜに as ?
>この場合は冗長なのだと。
それは問題があまりにも単純だからだよ。
イベントハンドラが数十個あってそのうちのいくつか(どれかはコーディングによって刻々と変化していく)
にはSenderに複数(場合によっては同一オブジェクトだったり異なるオブジェクトだったり)
渡されるような状況で、どのSenderにどのオブジェクトが渡されるか
ソースコード的にははっきり決まっているけどプログラマがきっちり把握するのが怪しくなるような
ケースであってもasが無駄だと思う?
0234デフォルトの名無しさんNGNG
>>228
>>233へのレスはやっぱいらないや。
一つ聞きたいんだけどバグがまったくない状態でasが失敗するようなコーディングってする?
つまりasは純粋にバグ検出のためにだけ使っているかどうか。
それだけ聞いておしまいにしたい。
0235デフォルトの名無しさんNGNG
>>234
> バグがまったくない状態でasが失敗するようなコーディングってする?

バグが無くて、as が失敗するようなコードをどうやって書くのかな。
0236デフォルトの名無しさんNGNG
バグが無いことを一般には確信出来ないから as をつかうんだろう。
>>209 の場合は >>233 も言うように単純すぎて as 使う意味がないから違う。
0237デフォルトの名無しさんNGNG
>>231
>冗長性というのは、is の後に as でキャストする事では?

is のあとに as で動的型チェックするのは冗長であると確信できるからですね?
わたしは Edit1 という名前のコンポは TEdit であると確信できるようなプログ
ラミングをすべきだと思います。
0238デフォルトの名無しさんNGNG
TObject.ClassNameは駄目なの?
0239デフォルトの名無しさんNGNG
as のような動的型チェックは、上位クラスでも true を返すようにしなければ
多態性がつかえなくなるので、TObject.ClassName ではだめです。
0240デフォルトの名無しさんNGNG
× >true を返すようにしなければ
○ >成功するようにしなければ
0241デフォルトの名無しさんNGNG
えーと
エディタでソースかいてるときの
最後のend.は何ですか?
なんでここだけend;じゃないの?
0242デフォルトの名無しさんNGNG
end; → 文の終わり
end. → プログラムの終わり
0243デフォルトの名無しさんNGNG
らじゃ
0244デフォルトの名無しさんNGNG
ヘルプより

・すべてのソースファイルと同じように,プロジェクトファイルはピリオドで終わります。
・ユニットは end とピリオドで終わらなければなりません。

・ブロック内の複数の文およびユニットの初期化部と終了処理部の複数の文を区切るには,セミコロンを使用します。
0245デフォルトの名無しさんNGNG
>end; → 文の終わり

これは違う。文の区切り。だから次に区切るべき文がない場合はなくてもよい。
end; の直前の文の末尾とか
0246デフォルトの名無しさんNGNG
正しくは
 end. → プロジェクトまたはユニットの終わり
でした。失礼しました。
0247sorryNGNG
end; → 文の区切り
end. → プロジェクトまたはユニットの終わり
0248デフォルトの名無しさんNGNG
どうもでした。
0249デフォルトの名無しさんNGNG
as の前に nil のチェックを入れた方が良さそう。
as のみの場合は軽いチェックにしか使えないな。

var
 Hoge: THoge;
begin
 Hoge := nil;
 (Hoge as THoge).Test;
 Hoge.Test;
end;

どちらも Test が呼び出されるけど、おかしいよね。
どうしてBorlandは nil as で例外を出さないようにしたのかな。
nil is は False なのに。
昔のDelphiは nil is が True を返してたけど、
このあたりの仕様の解りずらさが関係してたのかな。

>>237
私は型チェックもするし、紛らわしい名前も付けないように努力してますよ。
0250デフォルトの名無しさんNGNG
>>249
>私は型チェックもするし、紛らわしい名前も付けないように努力してますよ。

237 です。どうも真意が分かって頂いてないような気が・・・・

IDE が配置したコンポは、name プロパティーとインスタンス変数の名前が一致
しています。プログラマは、どのインスタンスがどのクラスなのか知っていない
とコードが書けません。'edtName' とか 'edtAge' に対応する edtName と
edtAge が TEdit であることを知っているからこそ

edtName.Text := 'John';
edtAge.Text := '23';

というコードが書けます。

(FindComponent('edtName') as TEdit).Text := 'John';

と書くのは、'edtName' に対応する edtName が TEdit であることを知って
いる場合は、冗長じゃないか、と言いたいのです。edtName が TEdit でない
かもしれないから as を使うべきだ、という主張どおりなら

(edtName as TEdit).Text := 'John';
(edtAge as TEdt).Text := '23';

と書かねばならず、コードは as だらけになってしまうでしょう。これは変です。
Sender:TObject で渡された場合には、実行時型チェックはキャストの前に必須
である、ということと FindComponent() の場合とは明らかに違います。
0251デフォルトの名無しさんNGNG
人間はミスを犯すもの。
コンパイル時チェックができないのであれば、実行時チェックをしましょう。

0252デフォルトの名無しさんNGNG
「両取り逃げるべからず」という将棋の格言があります。素直にそれに従って
玉を取られて負けた、という笑い話があります。格言も適用できるかどうか
頭を使って考える必要がありますね。
■ このスレッドは過去ログ倉庫に格納されています