!![[ハイレゾ表示時でのテーブルにおける、行の高さについて|BBS-雑談掲示板/29]] - 風間 (2007年07月21日 12時26分55秒) すいません、表題の件について質問させてください。 先日よりCodeWarrior環境でPalmの開発の勉強をはじめました。 只今サンプル・コードと睨めっこをしながら悪銭苦闘をしています。 それで表題の件でつまづいてしまいました...。 フォントをhrSmallFontで設定、 TblSetRowHeightで高さを指定し、 各行をHRWinDraw〜で描画させると、 一応画面上はハイレゾフォントで表示されます。 ところが、実際に選択行をハイライト表示させると、 カーソルの高さが...多分通常のフォントの高さで表示されてしまいます。 つまり、各行はhrSmallFontで表示されているのですが、 ハイライトとなる行の高さがhrSmallFontより高くなってしまうので、 他の行にかぶさってしまいます。 これをきちんと表示されるには何か別の設定が必要なのでしょうか? 解決のヒントになるようなものがありましたら、 教えていただけませんでしょうか、 よろしお願いします。   !!コメント *風間さん、始めまして。まず、HR 系を使っていますが、CLIE 前提と言うことでいいのでしょうか? Sony の SDK には詳しくありませんが、おそらくはテーブル自体が選択行を再描画するところをデバイス任せにしてしまっているのでは、と思いました。TblSetCustomDrawProcedure 関数は使っていますか? こいつは TableDrawItemFuncType で定義される関数ポインタを登録するもので、customTableItem に指定されたカラムの再描画が必要なときにこの関数ポインタをコールバックしてきます。Table.h をざっと眺めた限り、コールバックを要求する API は2〜3個しかないため、他に方法はなさそうです。つまり、全体で hrSmallFont を使いたいのであれば、全カラムを customTableItem 扱いにしなければならない、ということになるかもしれません。長々と書きましたが、それほど自信を持って書いているわけではないので、ハズしていたらごめんなさい。 - 陰郎 (2007年07月21日 15時05分53秒) *陰郎さんレス、ありがとうございます。 おっしゃる通りにCLIE 前提で考えてます。 ご指摘の通りにTblSetCustomDrawProcedure 関数を使用してます。 始めにTblSetItemStyle、TblSetItemInt等でテーブルを作成し、TblSetCustomDrawProcedureでテーブルを描画しています。 カラムは2個しかないのですが、一応どちらもcustomTableItemの指定にしてあります。 すいません、まだ全然詳しいことを理解できていないのですが、「全カラムを customTableItem 扱いにしなければならない」というのは、それとは別のことでしょうか? 選択行を再描画する時に何か指定が必要ってことなんでしょうか? う〜ん、難しいなぁ。。。 - 風間 (2007年07月22日 02時24分12秒) *あれ? なん re-にならないんだ?記入の仕方間違えましたか? - 風間 (2007年07月22日 02時27分42秒) *あー、既に TblSetCustomDrawProcedure 関数は使っていますか。2カラムあって、両方とも customTableItem 指定なんですね。「各行をHRWinDraw〜で描画」しているとのことですが、これは TblSetCustomDrawProcedure で登録したコールバック関数の中でもやっているんですよね? 何が言いたいかというと、選択やスクロールといったタイミングで発生する再描画でもそのコールバック関数が呼ばれるはずだったと記憶しているからです。テーブルコントロールはPalmのUIで一番ややこしいので、慣れるまでは大変ですよね(かくいう陰郎もまだまだ慣れてませんが)。可能ならば関連するコードを抜粋でもいいので載せてもらえると話が早いかもしれません。 - 陰郎 (2007年07月22日 03時09分41秒) *テーブルが一番ややこしいのですか? ありゃりゃ。 すいません初めてPC系のコードに触るので、右も左も分からないんですよ。 で、私が使っているサンプルというのはこちらのサイトの「小さなフォントの描画方法」で紹介されている某リーダーのソースです。 HRWinDrawCharsともう一つ別の描画方法を試してみましたが、結果は同じでした。 もしご教授いだだけるのなら、どの辺りのソースを抜粋すればよろしいですか?  - 風間 (2007年07月22日 07時31分29秒) *そうですね。陰郎としてはテーブルが一番ややこしいと思ってます。ガジェットもややこしいですが。で、もしコードを提示していただけるなら、テーブルの初期化部分とコールバック関数で実際に文字を描画しているあたりでしょうか。陰郎はSDKスタイルは苦手ですし、「教授」できるほどテーブルに習熟してもいません。なので、一緒に考えましょうというスタンスでやらせてくださいね。 - 陰郎 (2007年07月22日 11時34分42秒) *すいません、ありがとうございます。私の方では万策尽きた感じなので、試せることがあればなんでもやってみたいのでよろしくお願いします。ではまず全体の流れです。 - 風間 (2007年07月22日 13時35分45秒) TablePtr tableP; WordrowsInTable; RectangleType rect; tableP = FrmGetObjectPtr (frm, FrmGetObjectIndex (frm, mainDocumentTable)); FntSetFont( MainFormFont); HRFntSetFont( hrRefNum, MainFormFont); FrmGetObjectBounds( frm, FrmGetObjectIndex (frm, mainDocumentTable) , &rect); TableRows = rect.extent.y / FntCharHeight(); rowsInTable = TableRows; MainViewLoadTable (frm, TopVisibleRecord);//ここでテーブルを初期化してます // Set the callback routine that will draw the records. TblSetCustomDrawProcedure (tableP, 0, MainViewDrawRecordName); TblSetCustomDrawProcedure (tableP, 1, MainViewDrawRecordSize); // Set the column usable so that it draws and accepts user input. TblSetColumnUsable (tableP, 0, true); TblSetColumnUsable (tableP, 1, true); MainViewUpdateScrollers (); FrmShowObject( frm ,FrmGetObjectIndex( frm, mainDocumentTable)); FrmDrawForm(frm); prefs.currentView= MainForm; *次にテーブルの初期化です - 風間 (2007年07月22日 13時40分06秒) static void MainViewLoadTable (FormPtr frm, UInt recordNum) { Word row; Word lastRecordNum; Word numRows; TablePtr tableP; tableP = FrmGetObjectPtr (frm, FrmGetObjectIndex (frm, mainDocumentTable)); // For each row in the table, store the record number in the // table item that will display the record. numRows = TblGetNumberOfRows (tableP); //numRows = TableRows; FntSetFont( MainFormFont );//行の高さを指定するため? HRFntSetFont( hrRefNum, MainFormFont); for (row = 0; row < numRows; row++, recordNum++) { if (( row < ((prefs.storage_mode==STORAGE_INTERNAL)?TotalDocuments:numMSFiles)) && ( row < TableRows) ) { TblSetItemStyle (tableP, row, 0, customTableItem); TblSetItemStyle (tableP, row, 1, customTableItem); //TblSetItemStyle (tableP, row, 0, textTableItem); //TblSetItemStyle (tableP, row, 1, textTableItem); TblSetItemInt (tableP, row, 0, row); TblSetItemInt (tableP, row, 1, row); TblSetRowUsable (tableP, row, true); TblSetRowHeight ( tableP, row , hrRefNum*2); TblSetRowSelectable ( tableP, -1 , true); lastRecordNum = row; } else { TblSetRowUsable (tableP, row, false); } TblMarkRowInvalid (tableP, row); } } *次は実際にテーブルを描画させます - 風間 (2007年07月22日 13時42分26秒) static void MainViewDrawRecordName(VoidPtr tableP, Int16 row, Int16 column, RectanglePtr bounds) { UInt docNum = 0; docNum = TblGetItemInt (tableP, row, column) + TopVisibleRecord; if ( prefs.storage_mode == STORAGE_INTERNAL) MainViewDrawRecordInBounds(doc_infos[ docNum]->name , bounds); else MainViewDrawRecordInBounds( ( MSFileListP + docNum)->file_name , bounds); } *で、以下を呼び出しています - 風間 (2007年07月22日 13時44分34秒) static void MainViewDrawRecordInBounds( CharPtr doc, RectanglePtr bounds) { short textLen,width; Boolean fits; FontID currFont; int x,y; char ch; x = bounds->topLeft.x + 1; y = bounds->topLeft.y; //テーブル描画のフォント指定 FntSetFont ( MainFormFont); HRFntSetFont( hrRefNum, MainFormFont); // Determine the length of text that will fit within the bounds. width = bounds->extent.x - (FntCharWidth(ch)+4) - 4; textLen = StrLen(doc); FntCharsInWidth(doc, &width, &textLen, &fits); if ( fits){ HRWinDrawChars(hrRefNum, doc, textLen, x, y*2 ); } else {//ファイル名が長い時の対応 width = bounds->extent.x - (FntCharWidth(ch)+4) - 4- FntCharsWidth("...",3);; textLen = StrLen(doc); FntCharsInWidth(doc, &width, &textLen, &fits); HRWinDrawChars(hrRefNum, doc, textLen, x, y*2 ); HRWinDrawChars(hrRefNum,"..." , 3 , x + width , y*2 );//ハイレゾ・フォントで描画 } } *と、こんな風になってます。一応これでハイレゾ表示は出来ているのですが、選択行をハイライト表示させるとその行だけが高さがおかしくなってしまいます。ハード上ではハイレゾということを認識できてないからなんでしょうか?すいませんが、よろしくおねがいします。 - 風間 (2007年07月22日 13時46分56秒) *えぇと、まず勝手ながらコメント欄に載せていただいたコード部分を整形しました(【改行】ってなってた部分ですね)。で、コードの内容ですが...ちょっと待ってくださいね。まとまった時間を見つけてやりますんで。(汗 - 陰郎 (2007年07月22日 16時24分31秒) *念のために確認しようと思って自分のアプリでテーブルを使っている部分をデバッグしてみたのですが、テーブルの描画後に特定の行を選択状態にしても、件のコールバック関数は呼ばれませんでした。風間さんのコードで言えば、MainViewDrawRecordInBounds が呼ばれない、ということです。ということは単純に描画済みの領域を Invert しているだけ? ...すみません、ちょっと調べてみますね。 - 陰郎 (2007年07月22日 16時53分25秒) *すみません、やはり SDK を直で使うコトに慣れていないので、認識が甘かったようです。Palm OS API リファレンスに当たってみたところ、TableDrawItemFuncType のコールバック関数は、TblDrawTable または TblRedrawTable 呼び出し時にコールされるということで、単にテーブル上の行の選択状態が変化しただけでは呼ばれないようです。では、なぜ選択した行が通常フォントの高さで描画されるのか...? もうちょっとコードを読ませてください。 - 陰郎 (2007年07月22日 17時09分30秒) *と、いまさら気付いたのですが、冒頭の質問文の中で、「選択行をハイライト表示させると、カーソルの高さが」と書かれていますね。カーソル? ということは、ひょっとして in place でセルの内容を編集しようとしています? もしそうだとして、(CLIE のスモールフォントに詳しくないので自信ないのですが、)そもそも small/tiny フォントでの文字入力ってできるんでしたっけ? ココまで書いたことがハズしていないのであれば、問題の切り分けのために「選択状態に入っても編集はしない」みたいなことは試せますか? - 陰郎 (2007年07月22日 17時15分39秒) *すいません、説明の仕方が悪いようです。決して編集しようとはしていません。テキスト・リーダーにしようと思ってます。ですからディレクトリ内にあるファイルの一覧をテーブル内に表示し、閲覧したいファイルをジョグ・ダイアルを使って選択したいわけです。このときにジョグをアップ、ダウンさせると各行がハイライト表示になるのですが、このハイライトになる高さがおかしくなってしまうのです。ですから編集モードにはしていないつもりです。それとも編集状態になってしまっているのか。少なくとも画面からは入力はできません。 - 風間 (2007年07月22日 18時15分06秒) *いろいろチェックしていただいてありがとうございます。ご指摘の通りにジョグのアップダウンだけでは再描画のルーチンは通らないようです。それともジョグのアップダウンするルーチン内に何か行の高さにかかわる再描画を実行されているのか? - 風間 (2007年07月22日 18時33分39秒) *TblSelectItem(GetObjectPtr (mainDocumentTable),choice - TopVisibleRecord,0);というのを見つけました。どうやらこの関数で選択した行をハイライトさせているようです。ちなみに、この行の前に//TblSetRowHeight ( GetObjectPtr (mainDocumentTable), choice - TopVisibleRecord, hrRefNum*2);という一文を入れてみたのですが、効果はないです。TblSelectItemに対して行の高さの指定を何とかする方法を探せればいいのでしょうか。 - 風間 (2007年07月22日 20時59分17秒) *えと、ひとまず確認です。上記の TblSelectItem 関数を使用しているのは vchrJogDown イベントなどのハンドリング中ですよね? で、この選択状態の設定と同時に行の高さが変わりますか? また、行の高さが変わった時点で、それまで small ( あるいは tiny?)フォントで表示されていたテキストはどうなります? 標準フォントで再描画されますか? それとも字は小さなままで、行の高さだけが変わりますか? これまでの経緯を見る限り、おそらく後者だろうと予想していますが... - 陰郎 (2007年07月22日 22時17分35秒) *おっしゃる通りに字の大きさは変わりません。行の高さも変わりません。ハイライトされる高さが変わります。実際に行の高さを指定しているTblSetRowHeight ( tableP, row , hrRefNum*2);のをTblSetRowHeight ( tableP, row , 6);とわざと低く指定してみると実際の行の高さも、フォントの大きさも変わらず、単純にハイライトされる部分の高さのみ通常フォントサイズの高さでハイライトされてしまいます。6と指定すると2行が同時にハイライトされます。ちなみに15に指定してもハイライトされる高さはやはり通常フォントサイズの高さです。この辺りの設定を変えてもハイライトされる高さは変わりませんね。なんか根本的に間違ってるのか?  - 風間 (2007年07月23日 00時24分24秒) *選択行をハイライトさせるのに、今はTblSetRowSelectableを使ってるんですが、もしかしてHRWinDrawInvertedChars関数を使って自前で処理をさせれば可能かもしれませんね。ちょっとチャレンジしてみます。 - 風間 (2007年07月23日 11時50分35秒) *記憶があいまいな上に憶測で書いてしまうのが申し訳ないのですが、テーブルって行ごとに高さを変えられたような気がします。なので、変な話ですが TblSelectItem 関数を呼び出す直前に対象の行の高さを設定しなおしてやったりしてもダメでしょうか? それでもダメなら、たしかに丸ごと自前でやらざるを得ないかもしれませんね...うーん、あまりお力になれず、申し訳ないです。 - 陰郎 (2007年07月23日 22時18分00秒) *HRWinDrawInvertedChars関数でうまく行きました。これだけで1週間位ずっと悩んでいたので気分がホッとしました(^^; TblSelectItem 関数の前で行の高さを指定しても反応してくれませんね。通常の関数ではハイレゾのことは全く認識してくれないみたいです。とりあえずテーブルの描画についての多くは自前でやるように作り直してみます。今回は沢山の時間を私のために割いていただいてアドバイスをいただきまいしてありがとうございます。一人で考えていると迷路に迷いこんでしまって抜け出せなくなっていたのですが、陰郎様にいろいろな角度で考えるチャンスをいただけたので凄く助かりました。ほんとうにありがとうございます。また壁に突き当たったらアドバイスをお願いするかもしれませんが、よろしくお願いします(^^; - 風間 (2007年07月24日 10時01分09秒) *礼には及ばないです(大して役に立ってませんし)。もし良かったら、風間さんが答えられるような質問を見つけたときに力になってあげてください。それにしても Sony SDK の HR 系は厄介そうですね。HR 系ではないのですが、TH55 のワイドディスプレイに手を出そうかな...と考えていたもののちょっと気が引けてしまいました。(笑 - 陰郎 (2007年07月24日 21時35分34秒) *今さらかもしれませんが、私がArisaというアプリで同じような苦労をしましたので、参考に。TblSetItemStyle (tableP, row, 0, customTableItem);と設定されていますが、マニュアルをご覧になればお分かりになられるように、customTableItemでは、11ピクセルの高さに固定されます。tallCustomTableItemを設定すれば、TblSetRowHeightで設定されたサイズに従って描画されるはずです。 - 大野 一樹 (2007年07月25日 00時18分25秒) *ちなみに、tallCustomTableItemは、OS4以上だけで使えます。 - 大野 一樹 (2007年07月25日 00時20分35秒) *♪大野様 出来ました〜! tallCustomTableItemを指定したところ設定した高さで描画されました。ありがとうございます。いや、昨夜もう一度APIを読み直していたらcustomTableItemの項に「The height of the item is fixed at 11 pixels」というのを発見したので、こりゃやっぱり自前関数か...と溜息が出てたところです。でも、今朝見たら大野様のアドバイスがあり、早速試したところ上手く行きました。ありがとうございます。♪陰郎様 私で答えられることなんて今は皆無ですが、もっと勉強して何かお役に立てるようになりたいと思います。今回はいろいろをお付き合いしていただきまして本当に感謝してるんですよ。一緒にHR系のどツボにはまりましょう(^^; というわけで、一応今回の私がハマッた行高の解決方法をまとめておきます。【問題】テーブルでhrSmallFontを指定した場合、行高が11ピクセルに固定されているので、不自然な表示になってしう。【解決】これを防ぐために、TblSetItemStyleのtypeにtallCustomTableItemを指定すること。そうするとTblSetRowHeightで指定した行の高さで表示できるようになる。以上、しかしAPIの日本語訳ってどっかにないんですかね? - 風間 (2007年07月25日 10時41分00秒) *私の情報が参考になったようで、私としてもほっとしています。あまりにも色々やり取りされているので、全部見ていないもので。でもAPIの日本語欲しいですよね。 - 大野 一樹 (2007年07月25日 12時33分31秒) *反応が遅くなりました。大野さん、ご指摘ありがとうございます。tallCustomTableItem というのがあるんですね。知りませんでした。ちなみに、山田達司さん訳の 「Palm OS 4 バイブル」には tallCustomTableItem が載っていなかったので気付いたのですが、多分 tallCustomTableItem は Palm OS 4 以上で、かつ 4.0 New Feature Set がないと使えないのだろうと思います。きっとこれ、ほとんど neary equal なんでしょうけどね。 - 陰郎 (2007年07月29日 13時16分46秒) {{comment}}