計算機ソフトウェア＃ 2
久野靖∗

1992.5.6

本日の内容
本日はまず、前回積み残した NeXT Step 上の簡単な例題を説明して、少し「遊んでみるためのヒント」を差し上げます。
その後岡野さんが論文紹介をしてくださいます。時間が足りなければ続きを次回にやります。現在のところ次が野須さん、その次が原田さんの予定だと理解しています。
前回言い忘れましたが、発表者以外の人にも私から論文コピーを差し上げますので、できるだ
け自分でも読んでおくと「盛り上がる」と思います...
なお、本日もミニアンケートを (あとで) 出しますので、 2・3 日中に答を投稿してください。

例題 1.0: ごく簡単なアプリケーション

1

なお、以下の例題を動かす場合には NeXT 上で端末窓を開き、cc なんとか.m .... -lNeXT_s -lsys_sのようにして翻訳し、できあがったら例によってa.outで起動してください。
最初の例題は以下のファイル main.m だけです。
#import <appkit/appkit.h>main() {id myWin, myPanel, myMenu, winText;
NXRect aRect;[Application new];
NXSetRect(&aRect, 100.0, 350.0, 300.0, 300.0);
myWin = [Window newContent: &aRect
style: NX_TITLEDSTYLE
backing: NX_BUFFERED
buttonMask: NX_MINIATURIZEBUTTONMASK
defer: NO];
[myWin setTitle: "CompSoftDemo 1.0"];
NXSetRect(&aRect, 0.0, 0.0, 300.0, 300.0);
winText = [Text newFrame: &aRect
text: "Edit Me."alignment: NX_LEFTALIGNED];[winText setOpaque: YES];∗

筑波大学大学院経営システム科学専攻

1[[myWin contentView] addSubview: winText];
NXSetRect(&aRect, 100.0, 700.0, 300.0, 40.0);
myPanel = [Panel newContent: &aRect
style: NX_TITLEDSTYLE
backing: NX_BUFFERED
buttonMask: NX_CLOSEBUTTONMASK
defer: YES];[myPanel setTitle: "About CompSoftDemo"];[myPanel removeFromEventMask: (NX_KEYDOWNMASK|NX_KEYUPMASK)];
myMenu = [Menu newTitle: "CS Demo"];[[myMenu addItem: "Info..."action: @selector(orderFront:)
keyEquivalent: ’i’] setTarget: myPanel];[myMenu addItem: "Hide" action: @selector(hide:) keyEquivalent: ’h’];[myMenu addItem: "Quit" action: @selector(terminate:) keyEquivalent: ’q’];[myMenu sizeToFit];[NXApp setMainMenu: myMenu];[myWin display];[myWin orderFront: nil];[myWin makeKeyWindow];[winText selectAll: nil];[NXApp run];[NXApp free];}2

例題 1.1: 自分独自の View オブジェクト
今度のは main.m、TestView.h、TestView.m、の 3 つから成っています。
#import <appkit/appkit.h>#import "TestView.h"main() {id myWin, myPanel, myMenu, myView;NXRect aRect;[Application new];
NXSetRect(&aRect, 100.0, 350.0, 300.0, 300.0);
myWin = [Window newContent: &aRect
style: NX_TITLEDSTYLE
backing: NX_BUFFERED
buttonMask: NX_MINIATURIZEBUTTONMASK
defer: NO];
[myWin setTitle: "CompSoftDemo 1.1"];
NXSetRect(&aRect, 0.0, 0.0, 300.0, 300.0);
myView = [TestView newFrame: &aRect];[[myWin contentView] addSubview: myView];
NXSetRect(&aRect, 100.0, 700.0, 300.0, 40.0);
myPanel = [Panel newContent: &aRect
style: NX_TITLEDSTYLEbacking: NX_BUFFERED
buttonMask: NX_CLOSEBUTTONMASKdefer: YES];[myPanel setTitle: "About CompSoftDemo"];[myPanel removeFromEventMask: (NX_KEYDOWNMASK|NX_KEYUPMASK)];
myMenu = [Menu newTitle: "CS Demo"];[[myMenu addItem: "Info..."action: @selector(orderFront:)
keyEquivalent: ’i’] setTarget: myPanel];2

[myMenu addItem: "Hide" action: @selector(hide:) keyEquivalent: ’h’];[myMenu addItem: "Quit" action: @selector(terminate:) keyEquivalent: ’q’];[myMenu sizeToFit];[NXApp setMainMenu: myMenu];[myWin display];[myWin orderFront: nil];[myWin makeKeyWindow];[NXApp run];[NXApp free];}#import <appkit/View.h>@interface TestView : View {}@end#import "TestView.h"@implementation TestView@end

3

例題 1.2: 自分独自のオブジェクトの機能強化
こんどは TestView.[hm] のみの変更です。
#import <appkit/View.h>@interface TestView : View {NXCoord size;
NXCoord angle;}+ newFrame: (const NXRect*)frameRect;- mouseDown: (NXEvent*)theEvent;- drawSelf: (const NXRect*)rects : (int)rectCount;@end#import "TestView.h"@implementation TestView+ newFrame: (const NXRect*)frameRect {self = [super newFrame: frameRect];size = 100.0;
angle = 0.0;
return self;}- mouseDown: (NXEvent*)theEvent {if(theEvent->flags & NX_CONTROLMASK)
angle = angle + 3.0;
else if(theEvent->flags & NX_ALTERNATEMASK)
angle = angle - 3.0;
else if(theEvent->flags & NX_SHIFTMASK)
size = size - 10.0;
elsesize = size + 10.0;3

[self display];}- drawSelf: (const NXRect*)rects :(int)rectCount {NXRect aRect;[self translate: 150.0 : 150.0];[self rotate: angle];
NXSetRect(&aRect, -size/2.0, -size/2.0, size, size);
NXEraseRect(&aRect);
PSsetgray(NX_BLACK);NXFrameRect(&aRect);[self rotate: -angle];[self translate: -150.0 : -150.0];
}
@end

4

遊んでみるためのヒント

上の例題 1.2 について、どう思いますか? ある、重大な弱点があるのですが、分かりますか? 納
得したら次の練習をやってみてください。
練習 1 上述の弱点を改良した版を作ってみよ。
練習 2 もっと別の動作をさせてみよ。
なお、「練習」をやっておくと後でレポート用にプログラムを書く時絶対有利だと思います... たぶん。

4