XRT/table FAQ
XRT/table 全体
ウィジェットのトランスレ-ションをセットしたり書き換えたりすることができません。
テ-ブルの clip children にもトランスレ-ションがセットされているか確認してください。詳細は、マニュアルの78ペ-ジを参照してください。 セル内のウィジェットにトランスレ-ションをセットする場合は、テ-ブルではなく必ずそのウィジェットにトランスレ-ションをセットしてください。 CreateWidgetCallback によって作成されるウィジェットにトランスレ-ションをセットする場合は、コ-ルバックが BEGIN ではなくXRTTBL_REASON_CREATE_WIDGET_END で呼び出された時に、セットしてください。 ウィジェットが作成される前にセットすると、テ-ブルは指定されたものではなく、デフォルトのトランスレ-ションをインスト-ルしてしまいます。
テ-ブルに行/列を追加しても、表示されません。
新しい行/列に値が指定されていず、XmNxrtTblPixel[Height|Width]Contextが XRTTBL_VARIABLE にセットされていると、それらの行や列が作成された時は、表示されません。
どのようにしたら、行が指定した高さのままになりますか。セルが空の時、デフォルトの高さに戻ってしまいます。
XmNxrtTblMinFlexible[Width|Height]とXmNxrtTblPixel[Width|Height]Context(XRTTBL_FLEXIBLE にセット)を使用します。 この設定では、ウィンドウがリサイズされた時テ-ブルは大きくなりますが、セルの最小サイズを固定することができます。
XmNxrtTblResizeCellCallback を使用しても、リサイズをコントロ-ルすることができます。 このコ-ルバックの call_data は、ウィジェットの現在と新しいサイズの情報を持ちます。 新しいサイズの値を希望する値と置き換えたり、'doit'フラグをfalseにセットしてリサイズされないようにすることができます。
リソ-スがアップデ-トした時に、テ-ブルがちらつかないようにできますか?
アップデ-ト時には、XmNxrtTblRepaintをXRTTBL_REPAINT_OFFにし、終了後、XRTTBL_REPAIN_ONにします。
テ-ブルの一番左上の角には、どのようにしてラベルを指定できますか?
context(XRTTBL_LABEL, XRTTBL_LABEL)を使用してください。
XRTウィジェットでは色名で色を指定できますが、他のウィジェットではそれができないのはどうしてですか?
XRTは、色名のストリングをpixel値に変換します。下記の関数を使用すれば、色名で色を指定できます。
Pixel GetNamedColor(Widget widget, String colorname) { Display *display; Colormap cmap; XColor alloc_color, exact_color; display = XtDisplay(widget); XtVaGetValues(widget, XtNcolormap, &cmap, NULL); if (XAllocNamedColor(display, cmap, colorname, &alloc_color, &exact_color)) return alloc_color.pixel; else fprintf(stderr,"Can't allocate color!\n"); }
次の設定は、スクロ-ルバ-の色をセットします。スライダは赤、下の部分は緑になります。
XtVaSetValues(scrollbar_id, XmNtroughColor, GetNamedColor(toplevel, "green"), XmNbackground, GetNamedColor(toplevel, "red"), NULL);
一つのテ-ブルから他のテ-ブルにトラバ-スする時、二番目のテ-ブルのEnterCellコ-ルバックが開始されないのはどうしてですか?
二番目のテ-ブルのトラバ-スされるセルのcontextがトラバ-ス可能になっていますか。 下記を参照して、セルをトラバ-ス可能にセットしてください。
XtVaSetValues(table, XmNxrtTblContext, XrtTblSetContext(XRTTBL_ALLCELLS, XRTTBL_ALLCELLS), XmNxrtTblTraversableContext, True, NULL);
スクロ-ルバ-の色は変更できますか。
XtAppInitialize()を呼び出す時、fallbackリソ-スを使用して、アプリケ-ション全体の背景色をセットすることができます。 次の例では、スクロ-ルバ-(例では'Your_app')をグレ-にセットしています。
static char *fallback[] = { "Your_app*.background: grey85", NULL}; ... toplevel = XtAppInitialize(&app_context, "Your_app", NULL, 0, &argc, argv, fallback, NULL, 0);
または、XtVaGetValuesでウィジェットIDを取得し、そのウィジェットの値をセットします。 この方法は、プログラムで任意の時に色を変更することができ、縦と横のスクロ-ルバ-を別々の色に指定できます。
Widget scrollbar_id; Pixel trough_col, slider_col; ... XtVaGetValues(table, XmNxrtTblHorizontalScrollBar, &scrollbar_id, NULL);
その後、通常のMotif XmScrollBarウィジェットとして値をセットします。
XtVaSetValues(scrollbar_id, XmNtroughColor, trough_col, XmNbackground, slider_col, NULL);
XtVaSetValues()で、複数のcontextを使用できません。
XtVaCreateManagedWidgetまたはXtVaSetValuesでは、一度のコ-ルに一つのcontextしかセットできません。 追加のXtVaSetValuesコ-ルで、必要なcontextをセットしてください。
テ-ブルに最も簡単にデ-タを渡す方法。
XrtTblReadAscii()でテキストファイルからデ-タを読み込みます。デ-タが区切り付きのテキストファイルになっていない場合や、XrtTblCellValues構造体を作成したくない場合は、XrtTblAddRows()を使用してください。 この関数では、空のテ-ブルに追加する行の値として、ストリング値の配列を作成するだけで、テ-ブルにデ-タを渡すことができます。 XrtTblReadAscii()のソ-スが'$XRTHOME/src/table/util/'にありますので、参考にしてください。
テ-ブルのデ-タは検索したり、並べ替えたりすることができますか?
'spreadsheet'デモでは、この二つを実行することができます。 但し、検索機能はかなり複雑ですので、もっと簡単な例としては、$XRTHOME/src/table/examples/list.cを参照してください。 ('make list'と入力してコンパイルする必要があります。) この例での検索は、ストリングの最初のインスタンスだけを探します。 ソ-ト(並べ替え)機能は、どちらのデモも列ラベルをクリックして実行できます。 テ-ブルは、一つの列に基づいたソ-トしかできません。
独自の変換プログラムをインスト-ルするには?
変換プログラムが、該当するクラスのXtClassInitialize()を呼び出した後に、セットされているか確認してください。
大きなテ-ブル(2000x2000)の端の方が欠けてしまいます。
この問題が一部のユ-ザ様から報告されていますが、vuewm(ウィンドウ・マネ-ジャ)の古いバ-ジョンに関係するようです。 最新のウィンドウ・マネ-ジャでアプリケ-ションを実行してみてください。 XRT/tableは、20億行、20億列まで処理できる能力を持っています。
validateコ-ルバックはラベルには使用できませんか?
selection policy(選択の決まり)をXRTTBL_SELECT_MULTIRANGEにセットしてください。
セル内のウィジェット
クロ-ン化されたウィジェットのリソ-スは変更できませんか?
クロ-ン化されたウィジェットのリソ-スは、ウィジェットの作成時にXmNxrtTblWidgetLocationまたはXmNxrtTableWidgetContextによって指定されます。 従って、作成された後は変更できません。 (この点は、以前のXRT/tableとは異なります。)
Option Menuはクロ-ン化できませんか?
MotifのOption Menuは、他のMotifウィジェットのようにクロ-ン化したり、再利用したりすることはできません。
下記は、幾つかの代案です。
Option Menuを必要に応じて作成、破棄し、独自に管理します。 (XmNxrtTblCreateWidgetCallback、DisplayWidgetCallback、WidgetSetValueCallback等が使用できます。) この方法は、複雑ですが、アプリケ-ションのニ-ズに合わせることができます。
または、XRT/fieldのComboBoxを使用します。このウィジェットは、OptionMenuと 似ていますが、XRT/tableによって効率的に管理することができます。
セルの選択
既に選択されているセルを選択解除せずに、新しくセルを選択する方法。
Ctrl-Btn1Downで選択を追加できます。詳細は、マニュアルの195ペ-ジを参照してください。
テ-ブルで選択を行うことができません。
Selection Policy(選択の決まり)を正しくセットしてください。 詳細は、マニュアルの89ペ-ジを参照してください。
選択が行われる度に、Selectコ-ルバックが3回呼び出されてしまいます。
Selectコ-ルバックは、3個のreason(SELECT_BEGIN、SELECT_END、SELECT_EXTEND)で呼び出されます。 コ-ルバックのreasonを調べてください。このコ-ルバックは、マニュアルの91ペ-ジに解説されています。
ドラッグ&ドロップ
テ-ブルがドロップ先にならないようにするには?
XmNxrtTblImportTargetsをNULLにセットしてください。
テ-ブルがドラッグ元にならないようにするには?
また、clip childrenのトランスレ-ションもセットし、これらもドラッグ元にならないようにしてください。 下記をリソ-スファイルに追加することもできます。
*XtXrtTable.XtXrtTableClipChildren.translations: #override \n\ Shift <Btn2Down>: NoAction() \n\ Ctrl <Btn2Down>: NoAction() \n\ <Btn2Down>: NoAction()
ウィジェットをテ-ブルのセル範囲に登録しようとすると、 " Can't register widget as a drop site more than once " というメッセ-ジが表示されます。
マニュアルの95ペ-ジには、その方法の一部が掲載されています。 また、clip childrenのトランスレ-ションもセットし、これらもドラッグ元にならないようにしてください。 下記をリソ-スファイルに追加することもできます。
テ-ブルがドラッグ元にならないようにするには?
下記をリソ-スファイルに追加することもできます。
ImportingConversionProcedure( Widget table, String target, /* Name of target type */ XrtTblContext *context, /* Region of operation */ String *processed, /* list of targets already processed */ Boolean insert, /* insert data if possible */ XtPointer data, /* pointer to data to import */ unsigned long data_len /* length of data to import */ )
カレント・セル
テキスト・ウィジェットを永久に隠すことはできますか?
XmNxrtTblTraversableContextをFalseにセットしてください。
特定なセルをカレントセルにする方法はありますか?
XrtTblTraverseToCell()を使用してください。詳細は付録Bを参照してください。
他のセルにトラバ-スする代りに、Enterキ-でValidateCellコ-ルバックを開始させたいのですが...
entryウィジェットに、独自のトランスレ-ションをセットする必要があります。
Widget XmTextWidgetID; static char trans[] = "<key>Return: CommitEdit(False)"; ... XtVaGetValues(table, XmNxrtTblText, &XmTextWidgetID, NULL); XtOverrideTranslations(XmTextWidgetID, XtParseTranslationTable(trans));
セルまたはラベル内にテキストを配置する方法は?
テキストの縦と横方向の位置は、XmNxrtAlignmentContextリソ-スによってコントロ-ルできます。
XtVaSetValues(TableWidget, XmNxrtTblContext, XrtTblSetContext(XRTTBL_LABEL,XRTTBL_ALL), XmNxrtTblAlignmentContext, XmALIGNMENT_CENTER, NULL);
セルにトラバ-スした時、どうしてテキストはいつも左上の角に配置されてしまうのですか?
デフォルトで、XmTextウィジェット内で編集が行われています。 XmTextウィジェットでは、テキストの位置を指定することはできず、いつもデフォルト位置(左上角)に表示されます。
XRT/tableのパフォ-マンス
大きなデ-タや多くのcontextをセットしているアプリケ-ションでは、スピ-ドが遅くなることがあります。 多くのXtVaSetValuesを使用してcontextをセットするより、独自にseriesをプログラミングしてださい。 また、背景の色がそれぞれ異なるセル等、かなりカスタマイズしてあるテ-ブルでもパフォ-マンスが落ちます。 この場合、contextをプログラミングによって管理してください。
大きいデ-タ(1000x1000以上)の場合、XmNxrtTblCellValueCallbackとXmNxrtTblXmStringSetMode(XRTTBL_SET_STRINGにセット)を使用してください。 20億行20億列のテ-ブルまで扱えるようになります。
印刷について
XrtTblDrawPS()を使用すると、セグメンテ-ション・フォルトが起きます。
doubleのパラメ-タはポインタとして渡して下さい。
テ-ブルでつながっていない範囲は、どのように印刷しますか?
XRT/tableには、XrtTblVaDrawPS()、XrtTblWriteAscii()、XrtTblWriteSylk()という印刷ル-チンがあります。 これらのル-チンには、"range"というパラメ-タが あり、印刷する範囲を指定することができます。 XrtTblWriteAscii()のソ-スコ-ドが$XRTHOME/src/table/util/routines.cにありますので、これを応用して、複数の範囲を印刷するようにすることができます。 他の二つのル-チンは、オブジェクトコ-ドしか提供されていませんので、一つの範囲しか印刷できません。
XrtTblVaDrawPS()で印刷する時、生成された .psファイルが、定義されていない /HeaderFont または /FooterFont を参照しています。
XRT/tableには、XrtTblVaDrawPS()、XrtTblWriteAscii()、XrtTblWriteSylk()という印刷ル-チンがあります。 これらのル-チンには、"range"というパラメ-タが あり、印刷する範囲を指定することができます。 回避法としては、XRTTBL_PS_HEADERとXRTTBL_PS_FOOTERを""(空のストリング)としてセットし、XmNxrtTblPrintCallbackで、有効なheader/footerを渡してください。
ラベル等のウィジェットは、どうして表示されても印刷されないのですか?
XrtTblVaDrawPS()は、XRT/tableの管理されている子ウィジェットだけを印刷します。 XmNxrtTblLocationの値を調べて下さい。このリソ-スのデフォルト値はXRTTBL_LOCATION_NONEで、これは印刷されません。
サンプルと例
スパン(統合)されたセル
次の例のSelectCallbackでは、スパンされたセルのどの部分をクリックしても、そのセルが選択できるようにしています。 デフォルトでは、カ-ソルが、スパンされた範囲の左上のセルにある時だけ選択可能です。(他の部分をクリックしても選択されません。) ここでは、callback構造体でどのように選択されたセルを変更するか示しています。
void cellCB(Widget w, XtPointer clientD, XrtTblSelectCallbackStruct *callD) { XrtTblRange range; if (callD->reason == XRTTBL_REASON_SELECT_BEGIN || callD->reason == XRTTBL_REASON_SELECT_EXTEND) { if (XrtTblGetSpanByRowCol(w, callD->row, callD->column, &range)) { callD->row = range.start_row; callD->column = range.start_column; } } }