2016年9月2日星期五
2016年8月30日星期二
[Mstn PureMDL] mdlWindow_setFunction 捕捉打开窗口的变化
| MdlFunctionP | mdlWindow_setFunction |
| ( | |
| int | type , |
| MdlFunctionP | function |
| ); type : The type parameter sets which type of mdlWindow_... notification function is being set by the call to mdlWindow_setFunction. This parameter can be either WINDOW_MODIFYEVENTS (window is shown on the screen or hidden, size changes, or stacking order changes) or WINDOW_SCROLLEVENTS (window's contents are scrolled). WINDOW_MODIFYEVENTS : ウインドウが画面上に表示または非表示の変更、サイズ変更、など。 WINDOW_SCROLLEVENTS :ウィンドウの内容がスクロールされる 例文を見てみましょう。 要望:ウインドウで表示しているViewにより、DropLiast中に選択できるViewも変更できるようにする。
何と言いたいのは、以下の図を見てくださいね。
ActiveしているViewは1だけので、選択肢に1だけを活性してます。
もし、1,2,4のViewがActiveになっていて、選択肢に1,2,4を選択できるよになります。
========================================================================
Src Codeをざっくりと説明します。
①ダイアログをOpenして、Startするとき、いかのMDLの処理を追加してください。
Private void cmdSTART(void)
cmdNumber CMD_LIUBINTEST_START { mdlState_startPrimitive(NULL,NULL,1,1); mdlState_setFunction(STATE_COMMAND_CLEANUP, cleanup); mdlWindow_setFunction(WINDOW_MODIFYEVENTS, windowModifyFunc); EnableSet();
mdlInput_sendKeyin("LIUBINTEST SCAN", 0, INPUTQ_EOQ, NULL);
}
② windowModifyFuncを説明いたします。
Private void windowModifyFunc
( MSWindow *window, /* => window that event applies to */ int eventType, /* => type of event */ BSIRect *oldGlobalP /* => old global rectangle */ ) { int viewNo;
if (mdlWindow_isView(&viewNo,(MSWindow *)window)
&& (eventType == WINDOW_SHOWEVENT || eventType == WINDOW_ORDEREVENT || eventType == WINDOW_HIDEEVENT || eventType==WINDOW_MINIMIZEEVENT))
{ _viewNo = viewNo;
_eventType = eventType; mdlDialog_cmdNumberQueue(TRUE, CMD_LIUBINTEST_VIEW, NULL, TRUE); } return; }
eventType :Windowのイベントです。表示、順番変更、非表示、最小限などですね。
③ CMD_LIUBINTEST_VIEWのロジックです。
Private void cmdView(void) /*
=====================================================================================*/ cmdNumber CMD_LIUBINTEST_VIEW { DialogItem *diP; int ic, sic;
{ if (mdlView_isActive(_viewNo)) →Activeかどうか判断
{
// これはリストの表示制御です。
// _OptionrawItemP 引数は④で紹介します。
mdlDialog_optionButtonSetEnabled(_OptionrawItemP, _viewNo, TRUE);
} else if (_eventType == WINDOW_ORDEREVENT || _eventType == WINDOW_HIDEEVENT || _eventType == WINDOW_MINIMIZEEVENT) { mdlDialog_optionButtonSetEnabled(_OptionrawItemP, _viewNo, FALSE); if (_u40Sleeve2CSVDlg.View == _viewNo) { for (ic = 0, sic = -1; ic < _viewNo; ic++) { if(mdlView_isActive(ic)) sic = ic; }
if (sic != -1) _uLiuBinTestDlg.View = sic;
else { for (ic = _viewNo; ic < MAX_VIEWS; ic++) { if(mdlView_isActive(ic)) sic = ic; }
if (sic != -1) _uLiuBinTestDlg.View = sic;
else return; } }
if (diP = mdlDialog_itemGetByTypeAndId(mdlDialog_getToolSettings(), RTYPE_OptionButton, OPTIONBUTTONID_LIUBINTEST_VIEW, 0))
mdlDialog_itemSynch(mdlDialog_getToolSettings(), diP->itemIndex); } } }
④_OptionrawItemP 引数を紹介します。
この変数はOptionボタンの項目ですね。Hook関数に書いています。
Private void optionHook(DialogItemMessage *dimP) /*
================================================================================ */ { int i;
dimP->msgUnderstood = TRUE;
switch (dimP->messageType) { case DITEM_MESSAGE_CREATE: /* -------------------------------- */ break;
case DITEM_MESSAGE_INIT: /*
--------------------------------------------*/ _u40Sleeve2CSVDlg.View = -1; for(i=0;i _OptionrawItemP = dimP->dialogItemP->rawItemP; }
if(mdlView_isActive(tcb->lstvw))
{ _uLiuBinTestDlg.View = i; } else { for(i=0;i { _uLiuBinTestDlg.View = i; break; } } } break;
case DITEM_MESSAGE_SETSTATE:
break;
case DITEM_MESSAGE_STATECHANGED:
if( dimP->u.stateChanged.reallyChanged ) { mdlInput_sendKeyin("LIUBINTESTSCAN", 0, INPUTQ_EOQ, NULL); } break;
case DITEM_MESSAGE_RELOADDATA:
break;
case DITEM_MESSAGE_DESTROY:
break;
default:
dimP->msgUnderstood = FALSE; break; } }
⑤OPTIONBUTTONID_LIUBINTEST_VIEW
これはDlg中のOPTIONBUTTONIDです。IDです。識別子ですね。
以上の処理を付ければ、要望を実現することができると思います。
メモです。
| |
2016年8月28日星期日
mdlDialog_cmdNumberQueue
mdlDialog_cmdNumberQueue
今日はこの関数を使っている時、引数の意味を調べました。
今日はこの関数を使っている時、引数の意味を調べました。
| void | mdlDialog_cmdNumberQueue |
| ( | |
| BoolInt | localCmd , |
| long | cmdnum , |
| char* | unparsedP , |
| BoolInt | atEndOfQueue |
| ); localCmd : 呼び出し元のコマンドからの物の場合、このパラメータをTRUEに設定しなければならないです。そうでなければ、(FALSEの場合)コマンドはMstnコマンドテーブルからのものである と仮定されます。 cmdnum コマンド番号です。 キューに入れたいコマンドです。 unparsedP atEndOfQueue コマンドが入力キューの最後に配置される場合、パラメータがTRUEに設定されるべきです。それ以外の場合は、入力キューの先頭に配置されます。 自分で作った例文: Private void cmdCANCEL(void) /* // これは「終了」ボタンーを押して、現在のAPPをアンロードします。 // CMD_MDL_SILENTUNLOAD Mstn中で定義しているコマンドですので、FALSEに設定してる。 ================================================================================ */ cmdNumber CMD_U40SLEEVE2CSV_CANCEL { if(_settings.t.TRACE) printf("[U40Sleeve2CSV] cmdCANCEL -I- CMD_U40SLEEVE2CSV_CANCEL\n"); mdlDialog_cmdNumberQueue(FALSE,CMD_MDL_SILENTUNLOAD,mdlSystem_getCurrTaskID(),TRUE); return; } Private void cmdBACK(void) /* // この関数はサブダイアログからメイン画面へ戻る。 // CMD_LIUBINTESTAPP_START 自分で定義しているコマンドですので、TRUEに設定してる。 ================================================================================ */ cmdNumber CMD_U40SLEEVE2CSV_BACK { if(_settings.t.TRACE) printf("[U40Sleeve2CSV] cmdBACK -I- CMD_U40SLEEVE2CSV_BACK\n"); /*--------------------------------------------------------------------------*/ /* mainダイアログへ遷移 */ /*--------------------------------------------------------------------------*/ mdlDialog_cmdNumberQueue(TRUE, CMD_LIUBINTESTAPP_START ,mdlSystem_getCurrTaskID(), TRUE); return; } メモします。 何か不正の場合、是非指摘してくれてくださいね。 | |
2016年8月25日星期四
Mstn MDL 「表示」と言う文字を文字化けしました
文字化けについて
- シフトJISコードで「表示」という文字を、CGIスクリプト中に記述して出力すると「侮ヲ」と文字化けします。
- 「侮」という文字から、何だかコンピュータに馬鹿にされている気持ちになったりもします。
- どうしてこのように文字化けしてしまうのでしょうか? このコーナではそんな文字化けについて考察してみます。
- まず日本語文字コードの基礎知識として、大きく以下のようなコードが存在することを理解しておきましょう。
文字コード 摘要 JISコード JIS規格のX0208で定められた文字集合。7ビットコード2文字で日本語文字を表現します。メールで使用する代表的な文字コード。 EUCコード 日本語UNIX環境で使用される文字コード。8ビットコードで表現されます。 シフトJISコード Microsoft社が決めたコードで、主にパソコンを基盤に、WindowsやMacで使用されます。8ビット領域も使用します。 Unicode すべての文字を2バイトで表し、世界中の文字を表現しようとしています。
- KENT WEBではCGIスクリプトは「シフトJISコード」で記述しています。
- 本当は文字化けや正規表現処理などを考慮するとEUCコードで書く方が都合がよく、もし自分のためだけに使用するCGIスクリプトであるならば、迷わずEUCコードで記述することでしょう。
- ここでさきほど述べたシフトJISの「表示」という文字コードは以下のとおりです。
文字 表 示 シフトJISコード 95 5C 8E A6
- ここで都合の悪いことが発生します。実は、「表」の2バイト目の「5C」に問題があるのです。
- つまり、「5C」とはメタ文字(特殊文字)の「\」を表すからです。
- 「\」が文字列中にあると、それはエスケープ記号として単に取り去られてしまいます。
- したがって、「表示」という文字をCGIが出力するときには以下のように展開してしまいます。
(1) 95 5C 8E A6 .... 記述時点 (2) 95 8E A6 .... 「5C」を「\」と解釈し取り去る(その次の8Eをエスケープすると解釈) (3) 95 8E A6 .... 展開結果
- このようにして、展開結果は以下のようなコードで出力されることになります。
文字 侮 ヲ (半角) シフトJISコード 95 8E A6
- このような文字化けを防止するには以下のような方法があります。
- 「表」のようなメタ文字を含む文字には、後にエスケープ記号「\」を付ける。
例 : print "表\示";
理由 : 「表 + \」という文字コードで 95 5C 5C となり、中央の 5C が次の 5C をエスケープ展開し、結果として 95 5C として出力される。
- ダブルクオーテーションマーク「"」で囲まずに、シングルクオーテーションマーク「'」を使用する。
例 : print '表示';
理由 : シングルクオーテーション「'」内では文法上「展開」処理をしないため、文字コードの 95 5C はそのまま解釈されて出力される。
- 「表」のようなメタ文字を含む文字には、後にエスケープ記号「\」を付ける。
- 「表」のように2バイト目に「5C」のコードが使われている文字は以下のとおりです。
*これらの文字を使用する際は「表」に対する対処法とまったく同じです。― ソ Ы Ⅸ 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄 兔 喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 偆 砡
- 【注意】ただし、この文字化け文字(2バイト目に 5C が来る文字)をエスケープしない状態で「ダブルクオーテーション」又は「シングルクオーテーション」の中で末尾に使う場合には文字化けとはならずに Perlが「文法エラー」となってしまうので、特に注意が必要です。
この場合の対処方法は前掲と同じで直後にエスケープ記号「\」を付加します。- 悪い例1 : $title = "計画表"; → サーバエラー(文法エラーとなる)
- 悪い例2 : $title = '計画表'; → サーバエラー(文法エラーとなる)
- 良い例1 : $title = "計画表\";
- 良い例2 : $title = '計画表\';
- ★以上の文章以下のurlから:
- http://www.kent-web.com/pubc/jcode/
- 悪い例2 : $title = '計画表'; → サーバエラー(文法エラーとなる)
- 悪い例1 : $title = "計画表"; → サーバエラー(文法エラーとなる)
2016年7月22日星期五
find 命令 findコマンド
find コマンド
とは、指定した文字列をファイルの中から行単位で検索するためのコマンドであり、
その書式は、
------------------------------------------------------------
| find [/v][/c][/n][/i] "検索文字列" ファイル名... |
-------------------------------------------------------------
となっています。
各オプションは
/v 指定した文字列を含まない行を出力する。/抽取不含指定字符的行
/c 指定した文字列を含む行の数を出力する。/显示包含指定文字的行的个数
/n 出力する行の前に行番号を付ける。/在显示的行前面加上行号
/i 大文字と小文字を区別しないで検索を行う。/检索时不区分大小写
注意:検索文字は必ずダブルクォート記号で囲む必要がある。
なお、findは行単位で検索を行うコマンドあり、2行以上にまたがるような文字列の検索は行えない。
以下の例文見て見ましょう。
ファイル「findTest.txt」
ファイル内容:
===========================
I can use find!
The [find] is so usefully!
Yes! I am so intelligent!
FIND
===========================
とは、指定した文字列をファイルの中から行単位で検索するためのコマンドであり、
その書式は、
------------------------------------------------------------
| find [/v][/c][/n][/i] "検索文字列" ファイル名... |
-------------------------------------------------------------
となっています。
各オプションは
/v 指定した文字列を含まない行を出力する。/抽取不含指定字符的行
/c 指定した文字列を含む行の数を出力する。/显示包含指定文字的行的个数
/n 出力する行の前に行番号を付ける。/在显示的行前面加上行号
/i 大文字と小文字を区別しないで検索を行う。/检索时不区分大小写
注意:検索文字は必ずダブルクォート記号で囲む必要がある。
なお、findは行単位で検索を行うコマンドあり、2行以上にまたがるような文字列の検索は行えない。
以下の例文見て見ましょう。
ファイル「findTest.txt」
ファイル内容:
===========================
I can use find!
The [find] is so usefully!
Yes! I am so intelligent!
FIND
===========================
2016年7月21日星期四
mdlState_setFunction STATE のメモ
mdLsateとはどういう意味でしょうか?
実はイベントです。この状態でどんな処理をします。
JAVAの開発したことがある読者は前端な画面上のイベントと同じ感じる。
JSP画面のスクリプトみたいですね。
MicroStation V8iで:
eventTypeとしては以下の種類になります。「一部」
STATE_DATAPOINT,⇒一般的に左クリックする時
STATE_RESET, ⇒一般的に右クリックする時
STATE_KEYIN, ⇒入力する時
STATE_COMMAND_CLEANUP, ⇒A機能からB機能に変更する時、A機能の情報を削除する必要
STATE_COMPLEX_DYNAMICS,⇒図面作成する中 仮要素から正式要素にある間「ずっと呼び出せます。」
STATE_OOPSFUNCTION
STATE_DRAG_INITS
MdlFunctionP mdlState_setFunction
(
int eventType ,
MdlFunctionP stateFunc ⇒function to call when event happens.
);
mdlState_setFunction(STATE_DATAPOINT, createLabel);
mdlState_setFunction(STATE_RESET, resetLabel);
mdlState_setFunction(STATE_COMPLEX_DYNAMICS,genelatealabel);
沢山なstateがあるが、今まで、以上の有限な物をしています。
実はイベントです。この状態でどんな処理をします。
JAVAの開発したことがある読者は前端な画面上のイベントと同じ感じる。
JSP画面のスクリプトみたいですね。
MicroStation V8iで:
eventTypeとしては以下の種類になります。「一部」
STATE_DATAPOINT,⇒一般的に左クリックする時
STATE_RESET, ⇒一般的に右クリックする時
STATE_KEYIN, ⇒入力する時
STATE_COMMAND_CLEANUP, ⇒A機能からB機能に変更する時、A機能の情報を削除する必要
STATE_COMPLEX_DYNAMICS,⇒図面作成する中 仮要素から正式要素にある間「ずっと呼び出せます。」
STATE_OOPSFUNCTION
STATE_DRAG_INITS
MdlFunctionP mdlState_setFunction
(
int eventType ,
MdlFunctionP stateFunc ⇒function to call when event happens.
);
mdlState_setFunction(STATE_DATAPOINT, createLabel);
mdlState_setFunction(STATE_RESET, resetLabel);
mdlState_setFunction(STATE_COMPLEX_DYNAMICS,genelatealabel);
沢山なstateがあるが、今まで、以上の有限な物をしています。
2016年7月14日星期四
MSElementDescr Symbology 相关GET SET
20160714 メモ:
void mdlElmdscr_setSymbology
(
MSElementDescr* edP ,
UInt32* color ,
Int32* style ,
UInt32* weight ,
UInt32* fillColor
);
Changes the color, weight, and style in the element desciptor pointed to by edP to the values pointed to by color, weight and style. If parameters other than el are NULL, MicroStation does not change the value in element.
この関数でMSElementDescrの色、線種、線幅を変更できます。
引数については、edP以外のはNULLに設定できる。
例:
mdlElmdscr_setSymbology(ww, &color, &style, &weight, NULL);
以下の関数で画層を設定することができます。
mdlElmdscr_setProperties(ww, &level, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
BYLEVEL:
if(_ColorMode == 0) color = COLOR_BYLEVEL;
else color = (UInt32)_Color;
if(_WeightMode == 0) weight = WEIGHT_BYLEVEL;
else weight = (UInt32)_Weight;
if(_StyleMode == 0) style = STYLE_BYLEVEL;
else style = _Style;
mdlElmdscr_setSymbology(ww, &color, &style, &weight, NULL);
もし、COLOR_BYLEVELを利用している場合、色は選択している部品と同じです。
以下の二つ関数はMSElementDescrから持っているシンボロジー・画層を取得する。
mdlElement_getSymbology (&Color,&Weight,&Style,&s->el);
mdlElement_getProperties(&Level,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&s->el);
void mdlElmdscr_setSymbology
(
MSElementDescr* edP ,
UInt32* color ,
Int32* style ,
UInt32* weight ,
UInt32* fillColor
);
Changes the color, weight, and style in the element desciptor pointed to by edP to the values pointed to by color, weight and style. If parameters other than el are NULL, MicroStation does not change the value in element.
この関数でMSElementDescrの色、線種、線幅を変更できます。
引数については、edP以外のはNULLに設定できる。
例:
mdlElmdscr_setSymbology(ww, &color, &style, &weight, NULL);
以下の関数で画層を設定することができます。
mdlElmdscr_setProperties(ww, &level, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
BYLEVEL:
if(_ColorMode == 0) color = COLOR_BYLEVEL;
else color = (UInt32)_Color;
if(_WeightMode == 0) weight = WEIGHT_BYLEVEL;
else weight = (UInt32)_Weight;
if(_StyleMode == 0) style = STYLE_BYLEVEL;
else style = _Style;
mdlElmdscr_setSymbology(ww, &color, &style, &weight, NULL);
もし、COLOR_BYLEVELを利用している場合、色は選択している部品と同じです。
以下の二つ関数はMSElementDescrから持っているシンボロジー・画層を取得する。
mdlElement_getSymbology (&Color,&Weight,&Style,&s->el);
mdlElement_getProperties(&Level,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&s->el);
2016年7月11日星期一
MDL 对话框的常用操作函数
//========================================================
※グーロバルー変数
static DialogBox *_dialogBox=NULL;
今は開いているダイアログを取得すること、
■_dialogBox = mdlDialog_getToolSettings();// 现在的对话框取得
以上のツールセッティングでダイアログを取得することができる。
もし、取得した_dialogBoxはNULLではない場合、以下のメソッドで具体的内容を
取得できます。
------------------------------------------------------------------------
■すべて項目の設定
・Forces the appearance of all items in the Dialog Box specified
by dbP to match their external state.
・通強制規定的DBP,以配合其外部的状態在会話框中的所有項目的外観。
・一般的に以下の場面でよく使います。
○HOOK関数の DITEM_MESSAGE_STATECHANGED
case DITEM_MESSAGE_STATECHANGED:
mdlDialog_itemsSynch(d->db);
○再読み込む
BoolInt mdlDialog_itemsSynch
(
DialogBox* dbP
);
这个包括所有项目。
------------------------------------------------------------------------
■項目によって
例文:
itemP = mdlDialog_itemGetByTypeAndId(d->db, RTYPE_ToggleButton, TOGGLEID_INSERTSYMBOL_OFSSET_X, 0);
if(NULL != itemP)
{
mdlDialog_itemSynch(d->db, itemP->itemIndex);
}
BoolInt mdlDialog_itemSynch
(
DialogBox* dbP ,
int iItem
);
这个单个项目
------------------------------------------------------------------------
■ 定義ファイルでの項目タイプと項目のIDによって、
・Causes a DITEM_MESSAGE_SYNCHRONIZE message to be sent to the dialog
item indicated by itemType and itemId in the Dialog Box indicated by dbP.
例文:
memset(&spnBoxValue, 0, sizeof(ValueUnion));
spnBoxValue.doubleFormat = _HatchSpan;
if( diP = mdlDialog_itemGetByTypeAndId(_dialogBox, RTYPE_SpinBox, SPINBOXID_HatchSpan, 0) )
{
printf(pBuf, "%.1f %s", _HatchSpan, "mm");
mdlDialog_itemSetValue(NULL, doubleType, &spnBoxValue, pBuf, _dialogBox, diP->itemIndex);
mdlDialog_itemSynch(_dialogBox, diP->itemIndex );
}
BoolInt mdlDialog_itemSynchByTypeAndId
(
DialogBox* dbP ,
UInt32 itemType ,
int itemId
);
这个也是单个项目
------------------------------------------------------------------------
■mdlDialog_というMDL関数はダイアログの操作関数ですね。
mdlDialog_item** 項目と関連する関数
set、getもたくさんあります。
MicroStation V8 MDL Function Referenceを参照してください。
まずはダイアログの構成を理解して、自分のダイアログは何の項目を含めているかを
取得して、それに対して、どんなMDL関数を使うかを考えます。
※グーロバルー変数
static DialogBox *_dialogBox=NULL;
今は開いているダイアログを取得すること、
■_dialogBox = mdlDialog_getToolSettings();// 现在的对话框取得
以上のツールセッティングでダイアログを取得することができる。
もし、取得した_dialogBoxはNULLではない場合、以下のメソッドで具体的内容を
取得できます。
------------------------------------------------------------------------
■すべて項目の設定
・Forces the appearance of all items in the Dialog Box specified
by dbP to match their external state.
・通強制規定的DBP,以配合其外部的状態在会話框中的所有項目的外観。
・一般的に以下の場面でよく使います。
○HOOK関数の DITEM_MESSAGE_STATECHANGED
case DITEM_MESSAGE_STATECHANGED:
mdlDialog_itemsSynch(d->db);
○再読み込む
BoolInt mdlDialog_itemsSynch
(
DialogBox* dbP
);
这个包括所有项目。
------------------------------------------------------------------------
■項目によって
例文:
itemP = mdlDialog_itemGetByTypeAndId(d->db, RTYPE_ToggleButton, TOGGLEID_INSERTSYMBOL_OFSSET_X, 0);
if(NULL != itemP)
{
mdlDialog_itemSynch(d->db, itemP->itemIndex);
}
BoolInt mdlDialog_itemSynch
(
DialogBox* dbP ,
int iItem
);
这个单个项目
------------------------------------------------------------------------
■ 定義ファイルでの項目タイプと項目のIDによって、
・Causes a DITEM_MESSAGE_SYNCHRONIZE message to be sent to the dialog
item indicated by itemType and itemId in the Dialog Box indicated by dbP.
例文:
memset(&spnBoxValue, 0, sizeof(ValueUnion));
spnBoxValue.doubleFormat = _HatchSpan;
if( diP = mdlDialog_itemGetByTypeAndId(_dialogBox, RTYPE_SpinBox, SPINBOXID_HatchSpan, 0) )
{
printf(pBuf, "%.1f %s", _HatchSpan, "mm");
mdlDialog_itemSetValue(NULL, doubleType, &spnBoxValue, pBuf, _dialogBox, diP->itemIndex);
mdlDialog_itemSynch(_dialogBox, diP->itemIndex );
}
BoolInt mdlDialog_itemSynchByTypeAndId
(
DialogBox* dbP ,
UInt32 itemType ,
int itemId
);
这个也是单个项目
------------------------------------------------------------------------
■mdlDialog_というMDL関数はダイアログの操作関数ですね。
mdlDialog_item** 項目と関連する関数
set、getもたくさんあります。
MicroStation V8 MDL Function Referenceを参照してください。
まずはダイアログの構成を理解して、自分のダイアログは何の項目を含めているかを
取得して、それに対して、どんなMDL関数を使うかを考えます。
2016年7月8日星期五
20160708共通メソッドで値が戻ってこない
20160708
新規したの関数で値が戻ってこないので、調べたところ、
内部では正しく値が取得できていましたが、
引数に戻す値がセットできないかたちのようなので、
下記のように変更したところ値が返ってくる世になりました。
メソッドは省略に記載しています。
※※修正前※※--------------------------------------
Public Boolint Getinfomation
(
char *size,
char *material
)
{
size = GetIniFile(inifile, key1);
material = GetIniFile(inifile, key2);
return TRUE;
}
※※修正前※※--------------------------------------
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
※※修正後※※--------------------------------------
Public Boolint Getinfomation
(
char *p_size,
char *p_material
)
{
char *size, *material;
size = GetIniFile(inifile, key1);
material = GetIniFile(inifile, key2);
// 引数のcharポインターにメモリの内容をコピー
if (size && p_size) strcpy(p_size, size);
if (material && p_material) strcpy(p_material, material);
return TRUE;
}
※※修正後※※--------------------------------------
以上の問題に対して、よく分かてなくています。
C言語を学んでいくと、納得できていけるかもしれません。
C言語でのね渡しとポインタ渡しと参照渡しについては
まだまだですね。
もし、理解できれば、また本文章を更新します。
私も楽しみます。
勉強しかないなあ!!!
たぶん、 GetIniFile(inifile, key1);でアドレスを変更してしまった。
安全性のために、引数のアドレスはそのまま保留して、
取得された値でけを引数のメモリにコピーします。
strcpyは値のみをコピーします。
新規したの関数で値が戻ってこないので、調べたところ、
内部では正しく値が取得できていましたが、
引数に戻す値がセットできないかたちのようなので、
下記のように変更したところ値が返ってくる世になりました。
メソッドは省略に記載しています。
※※修正前※※--------------------------------------
Public Boolint Getinfomation
(
char *size,
char *material
)
{
size = GetIniFile(inifile, key1);
material = GetIniFile(inifile, key2);
return TRUE;
}
※※修正前※※--------------------------------------
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
※※修正後※※--------------------------------------
Public Boolint Getinfomation
(
char *p_size,
char *p_material
)
{
char *size, *material;
size = GetIniFile(inifile, key1);
material = GetIniFile(inifile, key2);
// 引数のcharポインターにメモリの内容をコピー
if (size && p_size) strcpy(p_size, size);
if (material && p_material) strcpy(p_material, material);
return TRUE;
}
※※修正後※※--------------------------------------
以上の問題に対して、よく分かてなくています。
C言語を学んでいくと、納得できていけるかもしれません。
C言語でのね渡しとポインタ渡しと参照渡しについては
まだまだですね。
もし、理解できれば、また本文章を更新します。
私も楽しみます。
勉強しかないなあ!!!
たぶん、 GetIniFile(inifile, key1);でアドレスを変更してしまった。
安全性のために、引数のアドレスはそのまま保留して、
取得された値でけを引数のメモリにコピーします。
strcpyは値のみをコピーします。
2016年7月6日星期三
20160707
今回の改修については
いろいろの方法を考えていました。
日本のソフトウェアにとって、安全性は第一ですので、
既存な方法を選んだほうがいいですね。
★「しかし、プログラマの私たちは、自分できちんと考えよう!
絶対に自分の頭に読み込でください。」
以下の点を注意しなきゃ!
①グローバル「Global」変数を利用する時、変数はNULLかどうか、
どんなタイミング変更できるか、ちゃんと注意してください。
②グローバル変数を利用してから、ほかのところの影響がないように、
クリアしたほうがいいと思います。
でも、全部とは限らないです。実現方法と現実状況によって、
判断して、どんな風にしますか。。。。
③業務上で、以下の内容をわかりました。
物件設定機能は別のチームの機能ですので、
連携しなければならないです。
連携の方法もいろいろあります。
一番簡単な方法は以下のとおりです。
SettingsIsom.ini⇒
;==============================================================================
;部材の設定で「OK」または「適用」が押されたら、キー入力するコマンド(Secionキーとの組み合わせ)
;物件設定との同期対応 add by LiuBin in 2017.07.07
;==============================================================================
[ISOMDRAFTFLH_OK]⇒部件設定で
ISOMDRAFTFLH SETTINGS⇒呼び出す元のCMDです。
呼び出す元側:
// 部件設定との同期対応 add by LiuBin in 2016.07.06
Private void cmdReadSettingOK(void)
===============================================================================
cmdNumber CMD_ISOMDRAFTFLH_SETTINGS
{
if(DBG0) printf("cmdReadSettingOK()...Start\n");
read_IsomDraft_INI();
// 関連文字を生成
if (g_loc_edp) place_generateElement(g_loc_edp, &g_loc_pt, g_loc_view, XORDRAW, g_xrot);
if(DBG0) printf("cmdReadSettingOK()...End\n");
}
mdlInput_sendKeyin(QSTR_015, 0, 0, NULL);
★QSTR_015:
#define QSTR_015 "mdl silentload SettingsIsom; SettingsIsom open; SettingsIsom Tree 関連文字; SettingsIsom Section=IsomDraftFLH"
やっばり、ファイルで連携すれば、よく使い方法ですね。
iniファイルやXMLファイルなど。。。。。
いろいろの方法を考えていました。
日本のソフトウェアにとって、安全性は第一ですので、
既存な方法を選んだほうがいいですね。
★「しかし、プログラマの私たちは、自分できちんと考えよう!
絶対に自分の頭に読み込でください。」
以下の点を注意しなきゃ!
①グローバル「Global」変数を利用する時、変数はNULLかどうか、
どんなタイミング変更できるか、ちゃんと注意してください。
②グローバル変数を利用してから、ほかのところの影響がないように、
クリアしたほうがいいと思います。
でも、全部とは限らないです。実現方法と現実状況によって、
判断して、どんな風にしますか。。。。
③業務上で、以下の内容をわかりました。
物件設定機能は別のチームの機能ですので、
連携しなければならないです。
連携の方法もいろいろあります。
一番簡単な方法は以下のとおりです。
SettingsIsom.ini⇒
;==============================================================================
;部材の設定で「OK」または「適用」が押されたら、キー入力するコマンド(Secionキーとの組み合わせ)
;物件設定との同期対応 add by LiuBin in 2017.07.07
;==============================================================================
[ISOMDRAFTFLH_OK]⇒部件設定で
ISOMDRAFTFLH SETTINGS⇒呼び出す元のCMDです。
呼び出す元側:
// 部件設定との同期対応 add by LiuBin in 2016.07.06
Private void cmdReadSettingOK(void)
===============================================================================
cmdNumber CMD_ISOMDRAFTFLH_SETTINGS
{
if(DBG0) printf("cmdReadSettingOK()...Start\n");
read_IsomDraft_INI();
// 関連文字を生成
if (g_loc_edp) place_generateElement(g_loc_edp, &g_loc_pt, g_loc_view, XORDRAW, g_xrot);
if(DBG0) printf("cmdReadSettingOK()...End\n");
}
mdlInput_sendKeyin(QSTR_015, 0, 0, NULL);
★QSTR_015:
#define QSTR_015 "mdl silentload SettingsIsom; SettingsIsom open; SettingsIsom Tree 関連文字; SettingsIsom Section=IsomDraftFLH"
やっばり、ファイルで連携すれば、よく使い方法ですね。
iniファイルやXMLファイルなど。。。。。
20160705
①=====================================
C言語で
char *s;
char s[256];
以上のSの区別が何ですか?
答え:
簡単な説明:http://qiita.com/jonichonpa/items/b38b760162a1f778b612
深い説明:http://www9.plala.or.jp/sgwr-t/c/sec10-2.html
②=====================================
今回開発の機能範囲:Isomの共通です。⇒Libです。
業務で問題ないですが、
C言語のメソッドの使い方とC言語のコーディング上の注意点がよくわかりませんでしたので、
たくさん疑問点が出ていたん。
問題点をまとめて、以下にメモしています。
------------------------------------------------------------------------------------------------------------------------
★第一:
------------------------------------------------------------------------------------------------------------------------
変数を使う時、不明なデータを書き込まないように、初期化したほうがいいです。
以下の関数を利用してください。
#include
void * memset( void *str , int chr , size_t len );
■戻り値:strの先頭アドレスを返す。
■説明:
strの先頭から文字chrをlen数分、コピーしてstrの先頭アドレスを返す。
一般的にstrをchrで埋める場合に使用する。
コピー後、末尾にNULLを自動的に設定しない。
■例文:
#include
main() {
char str[] = "ABCDE";
char * adr;
printf( "str=%s\n" , str );/* ABCEF */
memset(( void * )str , ( int )'\0'
, sizeof( str ));
/* strでprintfする */
printf( "str[0]=%c\n" , str[0] );/* NULL */
printf( "str[1]=%c\n" , str[1] );/* NULL */
printf( "str[2]=%c\n" , str[2] );/* NULL */
printf( "str[3]=%c\n" , str[3] );/* NULL */
printf( "str[4]=%c\n\n" , str[4] );/* NULL */
adr = ( char * )memset(( void * )str , ( int )'a'
, sizeof( str ));
/* strでprintfする */
printf( "str[0]=%c\n" , str[0] );/* a */
printf( "str[1]=%c\n" , str[1] );/* a */
printf( "str[2]=%c\n" , str[2] );/* a */
printf( "str[3]=%c\n" , str[3] );/* a */
printf( "str[4]=%c\n\n" , str[4] );/* a */
/* adrでprintfする */
printf( "adr[0]=%c\n" , adr[0] );/* a */
printf( "adr[1]=%c\n" , adr[1] );/* a */
printf( "adr[2]=%c\n" , adr[2] );/* a */
printf( "adr[3]=%c\n" , adr[3] );/* a */
printf( "adr[4]=%c\n" , adr[4] );/* a */
}
■自分の開発ソース:
char underSize[256], borderSize[256], intSize[256];
memset( intSize, 0, sizeof( intSize ));
memset( underSize, 0, sizeof( underSize ));
memset( borderSize, 0, sizeof( borderSize ));
------------------------------------------------------------------------------------------------------------------------
★第二:
------------------------------------------------------------------------------------------------------------------------
char underSize[256], borderSize[256], intSize[256];
sprintf( keyunder, "STRAIGHT_UNDER_SIZE%d", i );
strncpy( intSize, size, strlen(size) - 1 );
以上のメソッドの第一引数は「keyunder」
char keyunder[256]⇒○です。
char *keyunder⇒×です。
配列とポインタの区別を参照してください。
------------------------------------------------------------------------------------------------------------------------
★第三:
------------------------------------------------------------------------------------------------------------------------
strlen
sizeof
区別について:
※※文字列長と配列サイズの使い分け※※
【strlenの形式】
strlen(char *s) ⇒文字列sの長さを調べて返す。
⇒文字列の終端'\0'は長さに含まれない。
⇒漢字などの全角文字の場合、ひと文字で2と数えられる。
例文:
char s1 = "test";
char s2 = "テスト";
文字列長と配列サイズを調べるには:
printf( "%d\n", strlen( s1 ) );
printf( "%d\n", strlen( s2 ) );
printf( "%d\n", sizeof s1 );
printf( "%d\n", sizeof s2 );
実行すると、strlenの結果はs1が4、s2が6、sizeofはs1が5、s2が7となります。
【sizeofの形式】
C言語には、配列要素の数を調べる機能の標準関数はありません。
配列に要素を入れるときに自分で数を数えておいて、その後はそれを使うケースが多いと思いますが、
要素数を知る必要があるときは、サイズを調べる sizeof演算子を使って求めることができます。
配列の「サイズ」と「要素数」は違うので、まずそこを混同しないようにしましょう。
【 sizeof演算子の形式 】
sizeof (型名) 指定した型名のバイトサイズを求める(サイズは環境に依存します)
sizeof 変数名 指定した変数のバイトサイズを求める。変数では()を省ける。
下のような配列があるとすると
int score[] = { 88, 80, 92, 67, 78 };
ouble weight[] = { 56.7, 78.3, 60.2 };
配列の要素数は、「配列のサイズ / ひとつの要素のサイズ」の式で求めることができます。
printf( "scoreの要素数 %d\n", sizeof score/sizeof(int) );
printf( "weightの要素数 %d\n", sizeof weight/sizeof(double) );
scoreの要素数は 5、weightの要素数は 3 と分かります。 下のように、define することもできます。
#define NSCORE ((sizeof score)/(sizeof(int)))
#define NWEIGHT ((sizeof weight)/(sizeof weight[0]))
2つめの define のように、「ひとつの要素のサイズ」は「配列の先頭要素のサイズ」と書くことができます。
------------------------------------------------------------------------------------------------------------------------
★流用できるソース
------------------------------------------------------------------------------------------------------------------------
Public BoolInt startsWith
(
char *pre,
char *str
)
{
size_t lenpre = strlen(pre),
lenstr = strlen(str);
return lenstr < lenpre ? FALSE : strncmp(pre, str, lenpre) == 0;
}
=====================================================================*/
★業務に流用できるソース:
=====================================================================*/
******************INIファイルパスを取得する方法***************:
優先順位は以下のようになります。
「ポインタ:sprintfとstrcpy」
■mdlSystem_expandCfgVar
環境変数を取得できます。
TM_EXEの値は、セッションを起動する度に変わります。
Public char *IniFileCheck
(
char *fileName,
int tmdirFlg
)
{
char s1[MAXFILELENGTH];
char s2[MAXFILELENGTH];
char s3[MAXFILELENGTH];
char iniFile[MAXFILELENGTH];
//'1.今だけ適用 [$(TEMP)\Projects\$(TM_EXE)\$(TM_PROJECTNAME)\]
strcpy( s1, mdlSystem_expandCfgVar("$(TEMP)") );
strcpy( s2, mdlSystem_expandCfgVar("$(TM_EXE)") );
strcpy( s3, mdlSystem_expandCfgVar("$(TM_PROJECTNAME)") );
sprintf( iniFile, "%s\\Projects\\%s\\%s\\%s", s1, s2, s3, fileName );
//'2.設定コマンド実行後は[ProjectFolder]から読む
//'$(TM_PROJECT)\\****.ini
if ( mdlFile_find(s2, iniFile, NULL, NULL) != SUCCESS )
{
strcpy( s3, mdlSystem_expandCfgVar("$(TM_PROJECT)") );
sprintf( iniFile, "%s%s", s3, fileName );
}
//'3.設定コマンド実行前は[MasterFolder]から読む
if ( mdlFile_find(s2, iniFile, NULL, NULL) != SUCCESS )
{
if ( tmdirFlg )
{
//'$(TM_DIR)\\param\\config\****.ini
strcpy( s3,mdlSystem_expandCfgVar("$(TM_DIR)") );
sprintf( iniFile, "%s\\param\\config\\%s", s3, fileName );
}else
{
//'$(TM_APP)\\****.ini
strcpy( s3, mdlSystem_expandCfgVar("$(TM_APP)") );
sprintf( iniFile, "%s\\%s", s3, fileName );
}
}
if ( mdlFile_find(s2, iniFile, NULL, NULL) == SUCCESS )
{
DEBUGPRINTF("[%s]のPath is = {%s}\n", fileName,iniFile);
return iniFile;
}
return NULL;
}
******************INI内容を取得する方法***************:
GetIniFile
GetIniFileAll
GetIniFileValue
以上の方法検索して使って見ましょう。
******************StringListの使い方法***************:
StringList *m = NULL;
m = GetIniFileAll();
以下の方法で取得できる。
listNumber = mdlStringList_size( m );⇒リストサイズを取得できる。
以下のよにLOOPする。値を取得できる。iは0からです。
if ( SUCCESS == mdlStringList_getMember(&mBox, NULL, m, i) )
C言語で
char *s;
char s[256];
以上のSの区別が何ですか?
答え:
簡単な説明:http://qiita.com/jonichonpa/items/b38b760162a1f778b612
深い説明:http://www9.plala.or.jp/sgwr-t/c/sec10-2.html
②=====================================
今回開発の機能範囲:Isomの共通です。⇒Libです。
業務で問題ないですが、
C言語のメソッドの使い方とC言語のコーディング上の注意点がよくわかりませんでしたので、
たくさん疑問点が出ていたん。
問題点をまとめて、以下にメモしています。
------------------------------------------------------------------------------------------------------------------------
★第一:
------------------------------------------------------------------------------------------------------------------------
変数を使う時、不明なデータを書き込まないように、初期化したほうがいいです。
以下の関数を利用してください。
#include
void * memset( void *str , int chr , size_t len );
■戻り値:strの先頭アドレスを返す。
■説明:
strの先頭から文字chrをlen数分、コピーしてstrの先頭アドレスを返す。
一般的にstrをchrで埋める場合に使用する。
コピー後、末尾にNULLを自動的に設定しない。
■例文:
#include
main() {
char str[] = "ABCDE";
char * adr;
printf( "str=%s\n" , str );/* ABCEF */
memset(( void * )str , ( int )'\0'
, sizeof( str ));
/* strでprintfする */
printf( "str[0]=%c\n" , str[0] );/* NULL */
printf( "str[1]=%c\n" , str[1] );/* NULL */
printf( "str[2]=%c\n" , str[2] );/* NULL */
printf( "str[3]=%c\n" , str[3] );/* NULL */
printf( "str[4]=%c\n\n" , str[4] );/* NULL */
adr = ( char * )memset(( void * )str , ( int )'a'
, sizeof( str ));
/* strでprintfする */
printf( "str[0]=%c\n" , str[0] );/* a */
printf( "str[1]=%c\n" , str[1] );/* a */
printf( "str[2]=%c\n" , str[2] );/* a */
printf( "str[3]=%c\n" , str[3] );/* a */
printf( "str[4]=%c\n\n" , str[4] );/* a */
/* adrでprintfする */
printf( "adr[0]=%c\n" , adr[0] );/* a */
printf( "adr[1]=%c\n" , adr[1] );/* a */
printf( "adr[2]=%c\n" , adr[2] );/* a */
printf( "adr[3]=%c\n" , adr[3] );/* a */
printf( "adr[4]=%c\n" , adr[4] );/* a */
}
■自分の開発ソース:
char underSize[256], borderSize[256], intSize[256];
memset( intSize, 0, sizeof( intSize ));
memset( underSize, 0, sizeof( underSize ));
memset( borderSize, 0, sizeof( borderSize ));
------------------------------------------------------------------------------------------------------------------------
★第二:
------------------------------------------------------------------------------------------------------------------------
char underSize[256], borderSize[256], intSize[256];
sprintf( keyunder, "STRAIGHT_UNDER_SIZE%d", i );
strncpy( intSize, size, strlen(size) - 1 );
以上のメソッドの第一引数は「keyunder」
char keyunder[256]⇒○です。
char *keyunder⇒×です。
配列とポインタの区別を参照してください。
------------------------------------------------------------------------------------------------------------------------
★第三:
------------------------------------------------------------------------------------------------------------------------
strlen
sizeof
区別について:
※※文字列長と配列サイズの使い分け※※
【strlenの形式】
strlen(char *s) ⇒文字列sの長さを調べて返す。
⇒文字列の終端'\0'は長さに含まれない。
⇒漢字などの全角文字の場合、ひと文字で2と数えられる。
例文:
char s1 = "test";
char s2 = "テスト";
文字列長と配列サイズを調べるには:
printf( "%d\n", strlen( s1 ) );
printf( "%d\n", strlen( s2 ) );
printf( "%d\n", sizeof s1 );
printf( "%d\n", sizeof s2 );
実行すると、strlenの結果はs1が4、s2が6、sizeofはs1が5、s2が7となります。
【sizeofの形式】
C言語には、配列要素の数を調べる機能の標準関数はありません。
配列に要素を入れるときに自分で数を数えておいて、その後はそれを使うケースが多いと思いますが、
要素数を知る必要があるときは、サイズを調べる sizeof演算子を使って求めることができます。
配列の「サイズ」と「要素数」は違うので、まずそこを混同しないようにしましょう。
【 sizeof演算子の形式 】
sizeof (型名) 指定した型名のバイトサイズを求める(サイズは環境に依存します)
sizeof 変数名 指定した変数のバイトサイズを求める。変数では()を省ける。
下のような配列があるとすると
int score[] = { 88, 80, 92, 67, 78 };
ouble weight[] = { 56.7, 78.3, 60.2 };
配列の要素数は、「配列のサイズ / ひとつの要素のサイズ」の式で求めることができます。
printf( "scoreの要素数 %d\n", sizeof score/sizeof(int) );
printf( "weightの要素数 %d\n", sizeof weight/sizeof(double) );
scoreの要素数は 5、weightの要素数は 3 と分かります。 下のように、define することもできます。
#define NSCORE ((sizeof score)/(sizeof(int)))
#define NWEIGHT ((sizeof weight)/(sizeof weight[0]))
2つめの define のように、「ひとつの要素のサイズ」は「配列の先頭要素のサイズ」と書くことができます。
------------------------------------------------------------------------------------------------------------------------
★流用できるソース
------------------------------------------------------------------------------------------------------------------------
Public BoolInt startsWith
(
char *pre,
char *str
)
{
size_t lenpre = strlen(pre),
lenstr = strlen(str);
return lenstr < lenpre ? FALSE : strncmp(pre, str, lenpre) == 0;
}
=====================================================================*/
★業務に流用できるソース:
=====================================================================*/
******************INIファイルパスを取得する方法***************:
優先順位は以下のようになります。
「ポインタ:sprintfとstrcpy」
■mdlSystem_expandCfgVar
環境変数を取得できます。
TM_EXEの値は、セッションを起動する度に変わります。
Public char *IniFileCheck
(
char *fileName,
int tmdirFlg
)
{
char s1[MAXFILELENGTH];
char s2[MAXFILELENGTH];
char s3[MAXFILELENGTH];
char iniFile[MAXFILELENGTH];
//'1.今だけ適用 [$(TEMP)\Projects\$(TM_EXE)\$(TM_PROJECTNAME)\]
strcpy( s1, mdlSystem_expandCfgVar("$(TEMP)") );
strcpy( s2, mdlSystem_expandCfgVar("$(TM_EXE)") );
strcpy( s3, mdlSystem_expandCfgVar("$(TM_PROJECTNAME)") );
sprintf( iniFile, "%s\\Projects\\%s\\%s\\%s", s1, s2, s3, fileName );
//'2.設定コマンド実行後は[ProjectFolder]から読む
//'$(TM_PROJECT)\\****.ini
if ( mdlFile_find(s2, iniFile, NULL, NULL) != SUCCESS )
{
strcpy( s3, mdlSystem_expandCfgVar("$(TM_PROJECT)") );
sprintf( iniFile, "%s%s", s3, fileName );
}
//'3.設定コマンド実行前は[MasterFolder]から読む
if ( mdlFile_find(s2, iniFile, NULL, NULL) != SUCCESS )
{
if ( tmdirFlg )
{
//'$(TM_DIR)\\param\\config\****.ini
strcpy( s3,mdlSystem_expandCfgVar("$(TM_DIR)") );
sprintf( iniFile, "%s\\param\\config\\%s", s3, fileName );
}else
{
//'$(TM_APP)\\****.ini
strcpy( s3, mdlSystem_expandCfgVar("$(TM_APP)") );
sprintf( iniFile, "%s\\%s", s3, fileName );
}
}
if ( mdlFile_find(s2, iniFile, NULL, NULL) == SUCCESS )
{
DEBUGPRINTF("[%s]のPath is = {%s}\n", fileName,iniFile);
return iniFile;
}
return NULL;
}
******************INI内容を取得する方法***************:
GetIniFile
GetIniFileAll
GetIniFileValue
以上の方法検索して使って見ましょう。
******************StringListの使い方法***************:
StringList *m = NULL;
m = GetIniFileAll();
以下の方法で取得できる。
listNumber = mdlStringList_size( m );⇒リストサイズを取得できる。
以下のよにLOOPする。値を取得できる。iは0からです。
if ( SUCCESS == mdlStringList_getMember(&mBox, NULL, m, i) )
订阅:
博文 (Atom)







