/* iアプリ, MIDP での不揮発性メモリへの記録の例 Time-stamp: "2005/12/08 Thu 19:45 hig" Saburo Higuchi 2003-2005 http://www.math.ryukoku.ac.jp/~hig/ プログラム解説等 http://www.a.math.ryukoku.ac.jp/~hig/course/juniors_2005/09/ */ #if DOJA import com.nttdocomo.ui.*; import javax.microedition.io.*; // スクラッチパッド import java.io.*; // スクラッチパッド #elif MIDP import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.rms.*; // レコード #endif #if DOJA #elif MIDP #else // DoJa/MIDP Builder を使われる方へ: // まず, プログラムの先頭で, #define DOJA // などと定義する必要があります. // 以下の define 文は, #if - #endif の中に書かれていますので, // DoJa/MIDP Builder のプリプロセッサでは処理できません. // そこで, #if - #endif はやめて, // いらない方をJava の意味でコメント文にしてください. #endif #if DOJA #define MYALIGN +0 #define MYAP IApplication #define MYSTART start #define MYBLACK Graphics.getColorOfName(Graphics.BLACK) #define MYWHITE Graphics.getColorOfName(Graphics.WHITE) #define MYBLUE Graphics.getColorOfName(Graphics.BLUE) #define MYRED Graphics.getColorOfName(Graphics.RED) #define MYGREEN Graphics.getColorOfName(Graphics.GREEN) #define MYYELLOW Graphics.getColorOfName(Graphics.YELLOW) #define MYMAGENTA Graphics.getColorOfName(Graphics.MAROON) #define MYCYAN Graphics.getColorOfName(Graphics.AQUA) #define MYDIALOG Dialog #define MYLABEL Label #define MYADD add #define MYTEXT Text #define MYCHOICE ListBox #define MYTEXTBOX TextBox #define MYPANEL Panel #define MYNULL +"" #define MYGETTEXT getText #define MYSETTEXT setText #elif MIDP #define MYALIGN ,Graphics.LEFT|Graphics.BOTTOM #define MYAP MIDlet #define MYSTART startApp #define MYBLACK 0,0,0 #define MYWHITE 255,255,255 #define MYBLUE 0,0,255 #define MYRED 255,0,0 #define MYGREEN 0,255,0 #define MYYELLOW 255,255,0 #define MYMAGENTA 255,0,255 #define MYCYAN 0,255,255 #define MYDIALOG Alert #define MYLABEL StringItem #define MYADD append #define MYTEXT String #define MYIMAGELABEL ImageItem #define MYADD append #define MYCHOICE ChoiceGroup #define MYTEXTBOX TextField /* MIDP の TextBox は Form と同列みたいなもの */ #define MYPANEL Form #define MYNULL ,null #define MYGETTEXT getString #define MYSETTEXT setString #endif /** IApplication または MIDlet を継承するクラス */ public class MemorySample extends MYAP { /** 起動するときに呼ばれる メソッド. 必須. */ #if DOJA public void start(){ MemoryCanvas cc=new MemoryCanvas(this); Display.setCurrent(cc); } #elif MIDP public void startApp(){ MemoryCanvas cc = new MemoryCanvas(this); Display.getDisplay(this).setCurrent(cc); } public void pauseApp(){} public void destroyApp(boolean unconditional){} #endif } /** Canvas を継承するクラス. */ class MemoryCanvas extends Canvas implements #if DOJA SoftKeyListener #elif MIDP CommandListener #endif { MemorySample parent; MYPANEL p; private int rgb[] = {0,0,0}; // RGB 値 String tblabel [] = {"R","G","B"}; MYTEXTBOX tbparam[]; String cctitle [] = {"入力"}; String cftitle [] = {"色"}; #if DOJA private final int dataversion=1; #elif MIDP Command [] cc; Command [] cf; String rsname="color"; #endif /** コンストラクタ. 最初に1回だけ実行される */ MemoryCanvas(MemorySample m){ this.parent=m; #if DOJA DataInputStream in=null; try { in = Connector.openDataInputStream("scratchpad:///0"); if( dataversion == in.readInt()){ for(int i=0; i < rgb.length; i++){ rgb[i]=in.readInt(); } } } catch (Exception e){ Dialog dlg=new Dialog(Dialog.DIALOG_WARNING,"入力失敗"); dlg.setText("" + e); dlg.show(); } finally { if( in!=null ){ try { in.close(); } catch ( Exception e){ } } } #elif MIDP RecordStore in=null; try { in = RecordStore.openRecordStore(rsname,true); RecordEnumeration re=in.enumerateRecords(null,null,true); while(re.hasNextElement()){ int id=re.nextRecordId(); int z=Integer.parseInt(new String(in.getRecord(id))); rgb[( z>>8 ) & 0x3 ]=z%256; } } catch (Exception e){ } finally { if( in!=null ){ try { in.closeRecordStore(); } catch ( Exception e){ } } } #endif #if DOJA setSoftLabel(Frame.SOFT_KEY_1, cctitle[0]); #elif MIDP cc = new Command [ cctitle.length ]; for(int i=0; i< cctitle.length ; i++){ cc[i]=new Command(cctitle[i],Command.SCREEN,i); addCommand(cc[i]); } setCommandListener(this); #endif } public void paint(Graphics g){ #if DOJA g.setColor(Graphics.getColorOfRGB(rgb[0],rgb[1],rgb[2])); #elif MIDP g.setColor(rgb[0],rgb[1],rgb[2]); #endif g.fillRect(0,0,getWidth(),getHeight()); // 画面を消す } /** Panel/Form を表示するメソッド*/ public void showPanel(){ #if DOJA p = new MYPANEL(); p.setTitle("色の入力"); #elif MIDP p = new MYPANEL("色の入力"); #endif // 数値入力用 TextBox tbparam = new MYTEXTBOX [tblabel.length]; for(int i=0; i < tbparam.length ; i++){ #if DOJA p.MYADD(new Label(tblabel[i])); tbparam[i]= new MYTEXTBOX("",3,1,TextBox.DISPLAY_ANY); tbparam[i].setEditable(true); tbparam[i].setInputMode(TextBox.NUMBER); #elif MIDP tbparam[i]= new MYTEXTBOX(tblabel[i],"",3,TextField.NUMERIC); #endif p.MYADD(tbparam[i]); tbparam[i].MYSETTEXT(""+rgb[i]); } #if DOJA // DOJA では Panel と Canvas で異なる. p.setSoftLabel(Frame.SOFT_KEY_1,cftitle[0]); p.setSoftKeyListener(this); #elif MIDP /* MIDP では component Listener はない.*/ /* MIDP では Canvas と同じ方法でよい. */ cf = new Command [cftitle.length]; for(int i=0; i < cf.length; i++){ cf[i] = new Command(cftitle[i], Command.SCREEN,i); p.addCommand(cf[i]); } p.setCommandListener(this); #endif // Panel/Form p に制御を移す #if DOJA Display.setCurrent(p); #elif MIDP Display.getDisplay(parent).setCurrent(p); #endif } #if DOJA // パネルでのソフトキーイベント public void softKeyPressed(int key){ if( key==Frame.SOFT_KEY_1 ){ for(int i=0; i< tbparam.length ; i++){ rgb[i]=Integer.parseInt(tbparam[i].MYGETTEXT()); } DataOutputStream out=null; try { out = Connector.openDataOutputStream("scratchpad:///0"); out.writeInt(dataversion); for(int i=0; i < rgb.length; i++){ out.writeInt(rgb[i]); } } catch (Exception e){ Dialog dlg=new Dialog(Dialog.DIALOG_WARNING,"出力失敗"); dlg.setText("" + e); dlg.show(); } finally { if( out!=null){ try { out.close(); } catch (Exception e){ } } } Display.setCurrent(this);// Canvas に復帰 } } public void softKeyReleased(int key){ } public void processEvent(int type, int param){ if( type==Display.KEY_PRESSED_EVENT ){ switch( param ){ case Display.KEY_SOFT1: showPanel(); break; default: } } } #elif MIDP // コマンドイベント public void commandAction(Command cx, Displayable s){ if( cx==cc[0] ){ // 値入力 showPanel(); } else if ( cx==cf[0] ){ // 図表示 for(int i=0; i< tbparam.length ; i++){ rgb[i]=Integer.parseInt(tbparam[i].MYGETTEXT()); } RecordStore out=null; try { out = RecordStore.openRecordStore(rsname,true); RecordEnumeration re=out.enumerateRecords(null,null,true); while(re.hasNextElement()){ int id=re.nextRecordId(); out.deleteRecord(id); } for(int i=0; i