Home Home Company Information Email 英語

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;
        }
    }
}