2007年12月13日木曜日

WindowsMobile 開発メモ(full screen)

Windows Mobile 6.0 .Net Compact Framework 2.0では、
Full Screen化するのに少々難儀な様です。

色々と漁ってみて、ようやく実現出来ました。

まず、メニューバーを消しましょう。
これは、普通にデザイナー上でメニューを削除すればOKです。



次にキャプションバーを消します。

this.WindowState = FormWindowState.Maximized;
this.TopMost = true;

これでフルスクリーンなアプリを書くことが出来ます。
コードステップ的にはWM5とかより短いが、情報少なさ過ぎ…。
簡単すぎてみんな書かないのかな(´・ω・`)



ちなみに、5.0等では、下記コードでいいみたい。

this.ControlBox = false;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.MaximizeBox = false;
this.MinimizeBox = false;

WM6.0 Stdでコンパイルするとthis.ControlBoxで警告が出ますヽ(`Д´)ノ

2007年11月27日火曜日

dhtmkxGrid 背景色と表示切り替え

読み込んだデータの内容で色分けする方法


function colorSets(){
var chk;
var col;
for(var y=0;y<mygrid.getRowsNum();y++){
chk = mygrid.cells(mygrid.getRowId(y),2).getValue();
if(chk=="新規"){
col = "Pink";
}else if(chk=="保留"){
col = "Lavender";
}else if(chk=="完了"){
col = "LemonChiffon";
}else if(chk=="受付済"){
col = "#ffb2b2";
}else if(chk=="修正済"){
col = "#ccffcc";
}
for(var i=0;i<=4;i++)
mygrid.cells(mygrid.getRowId(y),i).setBgColor(col);
}
}


セルの特定のカラムを読み取って、内容別にrow毎の色を変更する。

読み込んだデータ別に表示を切り替える方法


var hideids = new Array();
function changeType(){
var chk;
var vitm = $F("changeType");
for(var i=0;i<hideids.length;i++){
mygrid.setRowHidden(hideids[i],false);
}
if(vitm=="全体"){
return;
}
for(var y=0;y<mygrid.getRowsNum();y++){
chk = mygrid.cells(mygrid.getRowId(y),2).getValue();
if(chk!=vitm){
hideids.push(mygrid.getRowId(y));
mygrid.setRowHidden(mygrid.getRowId(y),true);
}
}
}


changeTypeというプルダウンの内容を取得し、
その内容と一致していないrowはidを保持した後(hideids.push部分)、
setRowHiddenを実行し、表示を隠す。
このとき、idを忘れると非表示を復活させられないので、注意が必要。
サンプルでは一度、全rowを表示にしてから比較処理をしている。
こうしないと、全rowを舐めてチェック出来ないからである。
別途、テーブルを持ってれば、こんなことをしなくてもOK。

2007年11月21日水曜日

WindowsMobile 開発メモ(ソフトキー)

ソフトキーの値が判らないので、ヘッダ漁ってみた。
softkey1VK_TSOFT1(VK_F1)0x70
softkey2VK_TSOFT2(VK_F2)0x71
upVK_TUP(VK_UP)0x26
downVK_TDOWN(VK_DOWN)0x28
leftVK_TLEFT(VK_LEFT)0x25
rightVK_TRIGHT(VK_RIGHT)0x27
中心VK_TACTION(VK_RETURN)0x0D
homeVK_THOME(VK_LWIN)0x5B
backVK_TBACK(VK_ESCAPE)0x1B
talkVK_TTALK(VK_F3)0x72
tendVK_TEND(VK_F4)0x73
録音VK_TRECORD(VK_F10)0x79
電源VK_TPOWER(VK_F18)0x81
音量大VK_TVOLUMEUP(VK_F6)0x75
音量小VK_TVOLUMEDOWN(VK_F7)0x76
フリップVK_TFLIP(VK_17)0x80
漢字VK_KANJI0x19


まぁこれはいいとして…。
backキーのイベントが取れないねー。
さっぱりわからん。


public class MsgWindow : MessageWindow
{
const int MOD_ALT = 0x0001;
const int MOD_CONTROL = 0x0002;
const int MOD_SHIFT = 0x0004;
const int MOD_KEYUP = 0x1000;
const int WM_HOTKEY = 0x0312;
const int WM_USER = 0x400;
const int SHCMBM_OVERRIDEKEY = WM_USER + 403;
const int SHCMBM_SETBKCOLOR = WM_USER + 406;
const int SHMBOF_NODEFAULT = 0x00000001;
const int SHMBOF_NOTIFY = 0x00000002;

const int VK_F3 = 0x72;
const int VK_TTALK = VK_F3;
const int VK_TBACK = 0x1B;

const int HOTKEY_ID = 0x0001;

[DllImport("coredll.dll")]
extern static int RegisterHotKey(IntPtr HWnd, int ID, int MOD_KEY, int KEY);

[DllImport("coredll.dll")]
extern static int UnregisterHotKey(IntPtr HWnd, int ID);

[DllImport("coredll.dll", SetLastError = true)]
public static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

[DllImport("aygshell.dll")]
private extern static IntPtr SHFindMenuBar(IntPtr hwnd);

private MainWindow msgform;

private static int HiWord(int number)
{
if ((number & 0x80000000) == 0x80000000)
return (number >> 16);
else
return (number >> 16) & 0xffff;
}

private static int LoWord(int number)
{
return number & 0xffff;
}

private static int MakeLong(int LoWord, int HiWord)
{
return (HiWord << 16) | (LoWord & 0xffff);
}

private static IntPtr MakeLParam(int LoWord, int HiWord)
{
return (IntPtr)((HiWord << 16) | (LoWord & 0xffff));
}

public MsgWindow(MainWindow msgform)
{
this.msgform = msgform;
IntPtr hnwdMB = SHFindMenuBar(msgform.Handle);
int r;

// これも駄目
RegisterHotKey(msgform.Handle, HOTKEY_ID, 0, VK_TBACK);

// これも駄目
SendMessage(SHFindMenuBar(msgform.Handle), SHCMBM_OVERRIDEKEY, (IntPtr)VK_TBACK,
MakeLParam(SHMBOF_NODEFAULT | SHMBOF_NOTIFY,SHMBOF_NODEFAULT | SHMBOF_NOTIFY));

}

protected override void WndProc(ref Message msg)
{
if(msg.Msg== WM_HOTKEY)
{
if ((int)msg.WParam == HOTKEY_ID)
{
}
}
base.WndProc(ref msg);
}
}


X02HTの場合、HardwareButtonは使えないみたいだし、
どうやってフックすりゃいいのでしゃう。
同じ開発をやってるサイトでも判ってないっぽいし、
海外サイト見に行っても上記コードに似たようなものばっか…。

今日はもう諦め。

WM用 (x02ht限定) 2画面ファイラー dlf ver.0.02


右画面



左画面



内蔵ビュアー


今のところ実装は…。

・zip解凍
・拡張子連動
・実行
・名前変更
・コピー
・移動
・内蔵テキストビュアー

vzファイラ→あふ使いなんで、それに近づけたいね。
最近wfっていうのが出てきたから、開発継続しようか迷うな…。

http://enjoi.blogdns.net/up/src/1465.lzh

2007年10月6日土曜日

X02HT専用ファイラ



windows mobile 6 smartphone standard搭載のX02HTを買ったんだけども、
どーにも、おいら好みのファイラが無い…。
そんな訳で、初めてのWindows mobile .netプログラムを組むことに。
まだまだ作り始めて1日なんで、実装が少ないけど、置いておく。

http://www.youlost.mine.nu/html999/img/1764.lzh

あぷろだなんで、流されるかもw

2007年6月1日金曜日

dhtmlxGridの使い方(3)-2

以下がJavsScript部分。

var mygrid;

onload=function(){
mygrid = new dhtmlXGridObject('dhtmlxGrid');
mygrid.imgURL = "imgs/";
mygrid.setHeader("Site Name,");
mygrid.setInitWidths("100,0"); // 2カラム目は0pixelにして表示させない
mygrid.setColAlign("left,left");
mygrid.setColTypes("ro,ro");
mygrid.setColSorting("str,str");
mygrid.init();
mygrid.loadXML("list.xml");
mygrid.onRowSelect=onrowsel;
}
onrowsel=function(id,u){
// クリックした行の2カラム目に表示されていないがURLが埋め込まれているので
// そのURLを取得してページ移動させる
url=mygrid.cells(id,1).getValue();
window.open(url,"_self);
}

以下が、list.xmlのイメージ。
<?xml version="1.0" encoding="EUC-JP"?>
<rows>
<row>
<cell>Yahoo! Japan</cell>
<cell>http://www.yahoo.co.jp</cell>
</row>
<row>
<cell>Google</cell>
<cell>http://www.google.co.jp</cell>
</row>
</rows>

上記のようにすると、クリックした行に仕込んでおいたURLへジャンプさせることが出来ると思います。
ちなみに、チェックはしていないので、初歩ミス等はお許し下さいw

2007年5月28日月曜日

dhtmlxGridの使い方(3)

過疎blogに迷い込んできたコサさんの質問に回答してトピック数を稼ごうとと思いますw
dhtmlxGridでのイベント取得方法で、行クリックしたときの処理がわからないとのこと。

マニュアルではattachEventを使えと記述されています。
ですが、どうも動作が怪しいので、直接指定する方法がいいかと思います。

onrowsel=function(){
alert("onrowsel");
}

 :グリッド処理
mygrid.onRowSelect=onrowsel;
 :グリッド処理

リンクはこのイベント内で例えばcolを0にした列を一つ用意し、
そこにURLを置いておき、それを参照しジャンプさせればいいと思います。
onrowsel=function(r,c){
aa=mygrid.cells(r,1).getValue();
document.html=aa;
}
※引数のrはrowIDで、1はcolサイズを0にした隠しセル番号。

元に戻す時は、使ってないイベントを指定してしまいましょう。
mygrid.onRowSelect=mygrid.onCheckBox;

この使ってないイベントっていう中身は下記みたいな感じで定義されています。
this.onCheckbox=this.onEnter=this.onRowSelect=this.onEditCell = function(){return true;};

なので、上記イベント名で上書きすればいいと思います。

ちなみに、下記の方法がdhtmlXGridの推奨方法です。
var eventId=mygrid.attachEvent("onRowSelect",function(){alert("hoge");});

製品版ではないGPL版には下記イベントが標準であります。

onOpenStart
onOpenEnd
onRowSelect
onScroll
onEditCell
onCheck
onEnterPressed
onBeforeRowDeleted
onRowAdded
OnGridReconstructed
OnBeforeContextMenu
OnRightClick
onDrag

詳しくは
http://www.scbr.com/docs/products/dhtmlxGrid/doc/index.html
を参照下さい。

こんな感じでいいでしょうか?w>コサさん

2007年5月17日木曜日

au端末のSIMカード

DoCoMoやSoftbankはSIMカードを入れ替えることで、
他人の端末を自分の端末として利用することが出来ます。

しかしauはただSIMカードを入れ替えるだけでは使えません。
端末側にSIMカードNOが登録され、
そのNOが一致した場合しか使えないようです。

今日、持込機種(中古)に機種変更をしてきたのですが、
31SA→52T、このとき52T内のSIM情報を書き換え、
31SAのSIM情報を書き込んだようです。
面白いのが、これによって31SA、52T双方に限り、
SIMカードの入替による端末切替えが出来るようになります。

この方法だと手数料2100円かかりますが、
店頭の白ロム端末購入時の機種変更と違って、
(この場合、SIMカードを流用しない為)
予*備*機*を*増*や*す*こ*と*が*出*来*ま*す*。

ま、あんまり意味は無いですが、
予備の端末があるとなんとなく安心ですもんね。

2007年4月20日金曜日

dhtmlxGridの使い方(2)

最新版ではXML渡しによるリンク表示が可能となったけど、
旧バージョンでもそれが使える。
下手にバージョンアップしたく無ければ、最新パッケージをダウンロードし、

dhtmlXGrid_excell_link.js

というファイルをjsディレクトリにコピーし、
読み込ませ、

<script src="librarys/scand/js/dhtmlXGrid_excell_link.js"></script>

設定をlinkにし、

mygrid.setColTypes("link,ro,ro");

XML出力で、

<cell>ラベル^リンク先^ターゲット</cell>

としてやることで、サンプルページみたいなリンクが実現する。
出来れば、<![CDATA[]]>でくくって出力したほうがよい。

ちなみに、この手法でjavascriptを記述するのは難しい。
自動でonclickが付与されてしまう為、
リンク先にjavascriptを書いてもまともに動作しない。

dhtmlXGrid_excell_link.js を dhtmlXGrid_excell_locallink.js 
などというファイルでコピーし、



function eXcell_link(cell){
this.cell = cell;
this.grid = this.cell.parentNode.grid;
this.edit = function(){}
this.getValue = function(){
if(this.cell.firstChild.getAttribute)
return this.cell.firstChild.innerHTML+"^"+this.cell.firstChild.getAttribute("href")
else
return "";
}
this.setValue = function(val){
var valsAr = val.split("^");
this.setCValue("<a href="'#'" onclick="'(isIE()?event:arguments[0]).cancelBubble="true;">"+valsAr[0]+"</a>");
}
}



修正後は、

<cell><![CDATA[リンク名^スクリプト]]></cell>

でjavascriptをonclickで実行出来る。

2007年4月19日木曜日

svnserveプロトコル解析:delete (delete-entry)

svn delete svn://localhost/var/svn/repos/phpacc/svn-commit.2.tmp -m "DelDel"

( success ( 1 2 ( ANONYMOUS ) ( edit-pipeline ) ) )
( 2 ( edit-pipeline ) 36:svn://localhost/var/svn/repos/phpacc )
( success ( ( ANONYMOUS ) 0: ) )
( ANONYMOUS ( 0: ) )
( success ( ) )
( check-path ( 16:svn-commit.2.tmp ( ) ) )
( success ( 36:28ddee6e-6324-0410-859d-a2726facb31c 29:svn://localhost/var/svn/repos ) )
( commit ( 6:DelDel ( ) true ) )
( success ( ( ) 0: ) )
( open-root ( ( ) 2:d0 ) )
( success ( file ) )
( success ( ( ) 0: ) )
( delete-entry ( 16:svn-commit.2.tmp ( ) 2:d0 ) )
( success ( ) )
( close-dir ( 2:d0 ) )
( success ( ) )
( close-edit ( ) )
( success ( ( ) 0: ) ) ( 5 ( 27:2007-04-18T03:07:34.681376Z ) ( ) )

2007年4月18日水曜日

svnserveプロトコル解析:co (finish-report)

svnコマンド相当:
svn co svn://localhost/var/svn/repos/phpacc/

( success ( 1 2 ( ANONYMOUS ) ( edit-pipeline ) ) )
( 2 ( edit-pipeline ) 36:svn://localhost/var/svn/repos/phpacc )
( success ( ( ANONYMOUS ) 0: ) )
( ANONYMOUS ( 0: ) )
( success ( ) ) ( success ( 36:28ddee6e-6324-0410-859d-a2726facb31c 29:svn://localhost/var/svn/repos ) )
( get-latest-rev ( ) )
( success ( ( ) 0: ) )
( success ( 8 ) )
( update ( ( 8 ) 0: true ) )
( success ( ( ) 0: ) )
( set-path ( 0: 8 true ( ) ) )
( finish-report ( ) )
( success ( ( ) 0: ) )
( target-rev ( 8 ) )
( open-root ( ( 8 ) 2:d0 ) )
( change-dir-prop ( 2:d0 23:svn:entry:committed-rev ( 1:8 ) ) )
( change-dir-prop ( 2:d0 24:svn:entry:committed-date ( 27:2007-04-18T03:10:38.376703Z ) ) )
( change-dir-prop ( 2:d0 14:svn:entry:uuid ( 36:28ddee6e-6324-0410-859d-a2726facb31c ) ) )
( add-file ( 10:index.html 2:d0 2:c1 ( ) ) )
( change-file-prop ( 2:c1 23:svn:entry:committed-rev ( 1:2 ) ) )
( change-file-prop ( 2:c1 24:svn:entry:committed-date ( 27:2007-04-17T09:05:25.943015Z ) ) )
( change-file-prop ( 2:c1 21:svn:entry:last-author ( 4:root ) ) )
( change-file-prop ( 2:c1 14:svn:entry:uuid ( 36:28ddee6e-6324-0410-859d-a2726facb31c ) ) )
( apply-textdelta ( 2:c1 ( ) ) )
( textdelta-chunk ( 2:c1 4:SVN ) )
( textdelta-chunk ( 2:c1 5:d
L ) )
( textdelta-chunk ( 2:c1 11:BP#D#D ) )
( textdelta-chunk ( 2:c1 76:form method="post" action="svn.php"
input name="ssssss" type="text"

) )
( textdelta-end ( 2:c1 ) )
( close-file ( 2:c1 ( 32:3bbb8bf02e6d2087ab1ad7dba1d625ad ) ) )
( add-file ( 7:svn.php 2:d0 2:c2 ( ) ) )
( change-file-prop ( 2:c2 23:svn:entry:committed-rev ( 1:2 ) ) )
( change-file-prop ( 2:c2 24:svn:entry:committed-date ( 27:2007-04-17T09:05:25.943015Z ) ) )
( change-file-prop ( 2:c2 21:svn:entry:last-author ( 4:root ) ) )
( change-file-prop ( 2:c2 14:svn:entry:uuid ( 36:28ddee6e-6324-0410-859d-a2726facb31c ) ) )
( apply-textdelta ( 2:c2 ( ) ) )
( textdelta-chunk ( 2:c2 4:SVN ) )
( textdelta-chunk ( 2:c2 5: ) )
( textdelta-chunk ( 2:c2 1: ) )
( textdelta-chunk ( 2:c2 25:
) )
( textdelta-end ( 2:c2 ) )
( close-file ( 2:c2 ( 32:7a61383013893c2d4ed6ca266a17b772 ) ) )
( close-dir ( 2:d0 ) )
( close-edit ( ) )
( success ( ) )
( success ( ) )

svnserveプロトコル解析:ls (get-dir)

svnコマンド相当:
svn ls svn://localhost/var/svn/repos/phpacc


( success ( 1 2 ( ANONYMOUS ) ( edit-pipeline ) ) )
( 2 ( edit-pipeline ) 36:svn://localhost/var/svn/repos/phpacc )
( success ( ( ANONYMOUS ) 0: ) )
( ANONYMOUS ( 0: ) )
( success ( ) ) ( success ( 36:28ddee6e-6324-0410-859d-a2726facb31c 29:svn://localhost/var/svn/repos ) )
( check-path ( 0: ( 2 ) ) )
( success ( ( ) 0: ) ) ( success ( dir ) )
( get-dir ( 0: ( 2 ) false true ) )
( success ( ( ) 0: ) ) ( success ( 2 ( ) ( ( 10:index.html file 100 false 2 ( 27:2007-04-17T09:05:25.943015Z ) ( 4:root ) ) ( 16:svn-commit.2.tmp file 49 false 2 ( 27:2007-04-17T09:05:25.943015Z ) ( 4:root ) ) ( 14:svn-commit.tmp file 43 false 2 ( 27:2007-04-17T09:05:25.943015Z ) ( 4:root ) ) ( 16:svn-commit.3.tmp file 48 false 2 ( 27:2007-04-17T09:05:25.943015Z ) ( 4:root ) ) ( 7:svn.php file 25 false 2 ( 27:2007-04-17T09:05:25.943015Z ) ( 4:root ) ) ( 16:svn-commit.4.tmp file 47 false 2 ( 27:2007-04-17T09:05:25.943015Z ) ( 4:root ) ) ) ) )

2007年4月17日火曜日

svnserveプロトコル実装 (1)解析

SVNのクライアントをPHPで実装する必要が出来たので、
数日で頑張って必要な機能だけ実装しようと思う。

必要な機能としては、
・ディレクトリ作成
・ディレクトリ削除
・ファイルインポート
・ファイルチェックアウト
・ファイルコミット
・ファイルチェックアウト&圧縮
である。基本的に全部なんだが、例外等は後回しにしよう。


( success ( 1 2 ( ANONYMOUS EXTERNAL ) ( edit-pipeline ) ) )
( 1 ANONYMOUS ( ) ( ) )
( success ( ) )
( 29:svn://localhost/var/svn/repos )
( success ( 36:28ddee6e-6324-0410-859d-a2726facb31c 29:svn://localhost/var/svn/repos ) )
( get-dir ( 0: ( 1 ) false true ) )

( success ( 1 ( ) ( ( 6:phpacc dir 0 false 1 ( 27:2007-04-17T08:58:05.164880Z ) ( 4:root ) ) ) ) )


基本的な動作として、上記のような処理となる。
上記はROOTディレクトリの内容を出力させるもの。
赤文字部分がこちらから出力するコマンド。

以降のトピックで必要機能のプロトコルを解析していく。

2007年4月13日金曜日

FlashLite with KDDI

シャープ製(特にW41SHは糞だと言ったけど、これはFlashのせいなのだろうか)

stat = fscommand2("RetrieveFocus");
if(stat==-1){
 trace("Use default cursor=" add _root._defezcursor);
 _root._cursor=_root._defezcursor;
}else{
 // 他機種向け復元処理
}

これは間違い。

if(_root._cli="W41SH"){ // しっかり機種分けを
 stat = fscommand2("RetrieveFocus");
 if(stat<0){
  // 読込失敗
  trace("Use default cursor=" add _root._defezcursor);
  _root._cursor=カーソルの初期値;
 }else{
  // 読込成功
  成功時処理
 }
}

で、注意しなければいけないのは、
このRetrieveFocus機能を呼び出したフレームが終了すると、
保存されたフレームにジャンプします。

決して、fscommand2コマンドが呼ばれたタイミングで、
内部的にgotoAndPlayが呼ばれる訳じゃない。
なのでこのフレームの描画とかも終わってから呼ばれる。

後は、更に癌なのは、fscommand2が呼ばれた場合、
読込失敗すると、フレームの最後にstop()があっても、
次のフレームに推移(next())してしまう。

なので、デフォルトカーソル処理はfscommand2コマンド発行の次フレームに、
それ以外は各フレームに書くようにする必要がある。

まったく糞だ。

2007年4月12日木曜日

FlashLite with KDDI(2)

メインメニューと、EZメニューではカーソルの保存方法が違うみたい。

保存方法

W51T/W52T
 メインメニュー:fscommand2("Set","Mainmenu","Position",cursor);
 EZメニュー:一緒

W51H/W51CA/MEDIASKIN/W51K/W52K
 メインメニュー:FSCommand2("Set","Mainmenu","Position",cursor);
 EZメニュー:一緒

W51S
 メインメニュー:FSCommand2("Set","EZMenu","Position",cursor);
 EZメニュー:一緒

W51SA/W43SA
 メインメニュー:Launchした文字列が保存される
 EZメニュー:一緒
 読み出した時、初回読み出しの時、まれにゴミ文字("m4")などが入るので、
 文字列チェック等をちゃんとやったほうがいい。

W51SH
 メインメニュー:FSCommand2("Set","Mainmenu","Position",cursor);
 EZメニュー:FSCommand2("Set","SH_Ezmenu","Position",cursor);

ほんと、面倒くさい仕様。
シャープが一番糞仕様です。

2007年4月10日火曜日

FlashLite with KDDI

端末毎にメニュー位置の記憶方法が異なり、非常に難儀したので、チラシの裏保存。

// 変数参照用のprefix
str=String(_root._submenuid) add "_" add String(_root._cursor);
// メニュー位置保存コード(00とか25とか)
cursor=String(_root._submenuid) add String(_root._cursor);

switch(_root._tC){
case "W51T":
case "W52T":
// T系は3byteしか保存出来ないので注意
fscommand2("Set","Mainmenu","Position",cursor);
fscommand("launch",eval("/:_ezmenuLaunch" add str));
break;
case "W51H":
case "W51CA":
FSCommand2("Set","Mainmenu","Position",cursor);
fscommand("launch",eval("/:_ezmenuLaunch" add str));
break;
case "MEDIASKIN":
case "W51K":
case "W52K":
FSCommand2("Set","Mainmenu","Position",cursor);
fscommand("launch",eval("/:_ezmenuLaunch" add str));
break;
case "W51S":
FSCommand2("Set","EZMenu","Position",cursor);
fscommand("launch",eval("/:_ezmenuLaunch" add str));
break;
case "W51SA":
case "W43SA":
// 一応呼び出し機能名に変換し保存
cursor=eval("/:_ezmenuLaunch" add str);
FSCommand2("Set","MainMenu","Position",cursor);
// 仕様上ではLaunchした時の文字列が保存されるらしいが…
fscommand("Launch",eval("/:_ezmenuLaunch" add str));
break;
case "W51SH":
FSCommand2("Set","Mainmenu","Position",cursor);
fscommand("Launch",eval("/:_ezmenuLaunch" add str));
break;
}

上記以外にW41SHは非常に癌で、実行中のフレームを記憶し、その時のフレームに戻される。

FRAME1の初期処理:
if(_root._tC eq "W41SH"){
_root._submenuid=0;
_root._luanchflg=false;
// 復元開始
stat = fscommand2("RetrieveFocus");
if(stat==-1){
trace("Use default cursor=" add _root._defezcursor);
_root._cursor=_root._defezcursor;
}
}else{
// 他機種向け復元処理
}

各FRAME:
if(_root._launchflg==true){
// カレントフレームを保存
FSCommand2("SaveFocus");
str="0_" add String(_root._cursor);
// 機能呼び出し
fscommand("launch",eval("/:_ezmenuLaunch" add str));
}else{
// メニュー位置を算出
_root._cursor=_currentframe-2;
_root._launchflg=true;
}

2007年3月20日火曜日

dhtmlxGridの使い方(1)

1.使用する前準備
必要なモジュールをあらかじめ読み込ませる
<link rel="STYLESHEET" type="text/css" href="dhtmlxGrid/css/dhtmlXGrid.css">
<script src="dhtmlxGrid/js/dhtmlXCommon.js"></script>
<script src="dhtmlxGrid/js/dhtmlXGrid.js"></script>
<script src="dhtmlxGrid/js/dhtmlXGridCell.js"></script>
<script src="dhtmlxGrid/js/dhtmlXGrid_start.js"></script>

2.簡単なグリッド作成
var gridUsers;
onload=function(){
gridUsers = new dhtmlXGridObject('dhtmlxGrid');
gridUsers.imgURL = "dhtmlxGrid/imgs/";
gridUsers.setHeader("ID,氏名,権限");
gridUsers.setInitWidths("100,120,120");
gridUsers.setColAlign("left,left,left");
gridUsers.init();
gridUsers.loadXML("userlist.xml");
}
(1)new
newでdhtmlxGridオブジェクトを生成。
(2) imgURL
imgURLメンバにGrid用スキンのディレクトリを設定してあげる。
(3)setHeader
グリッドのヘッダを設定する。
ここで横軸の数が決定されるので
"ID,氏名,権限,,,"
など空名等を入れると名前なしの列が出来る。
(4)setInitWidths
各列の表示サイズを設定します。
ここで隠し列にしたい時なんかは0を設定すればいい。
(5)setColAlign
各列の表示位置を設定します。
left,center,right
(6)init
設定に従って初期化を行い<div id="dhtmlxGrid"/>とhtml中に記述した場所にグリッドを描画する。
(7)loadXML
指定したURLからXMLを読み込みそれをグリッドに配置する。
ちなみにこの処理の次に読み込み後の処理などを入れても満足に動作しません。
読み込み後の処理を行いたい場合、loadXML("hoge.xml",onloadXMLhoge)などとしてonloadXMLhoge関数を作成して、そこに処理を書く。

3.セルへのアクセス

・1セルへのアクセス
var row=2;
var col=3;
var str=gridUsers.cells2(row,col).getValue();
・総舐め方法
for(var row=0;row<gridUsers.getRowsNum();row++){
for(var col=0;col<gridUsers.getColumnCount();col++){
str=gridUsers.cells2(row,col).getValue();
}
}
・行の複数選択(たとえば全行選択)
for(var row=0;row<gridUsers.getRowsNum();row++){
gridUsers.selectCell(row,0,true,true);
}
・選択行を舐める(複数選択も含む)・・怪しいやり方
for(var row=0;row<gridUsers.selectedRows.length;row++){
for(var col=0;col<gridUsers.getColumnCount();col++){
str = gridUsers.selectedRows[row].cells[col].textContent;
}
}