あなたの映画力を試せる!POPLETA映画検定(無料) >>

Borland C++Builderを使用しています。
ListViewにカラムを設定し,データをそれぞれ表示させたい
のですが,やり方がわかりません。
ViewStyleはvsReportです。
何かサンプルプログラムを紹介したいただけませんか?
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

遅くなりました。

#2の修正です。すみません

//宣言
TListItem *pItem;
//行のループ
for(int nRow = 0; nRow < 10; nRow++)
{
//列のループ
for(int nCol = 0; nCol < 5; nCol++)
}
//行の追加
pItem = ListView1->Items->Add();
//列のデータの追加
pItem->Caption = "キャプション";
///////////ここを修正
pItem->SubItems->Add("サブアイテム");
}
}

です。
    • good
    • 0

ListViewにカラムの追加をする方法はいくつかありますが、ListViewのコントロール上で右クリックをし、カラムの編集で新規に追加、あるいは削除を行うことが出来ます。


プログラム上でカラムの追加を行いたいときは、

//宣言
TListColumn *pNewColum = ListView1->Columns->Add();
//カラムのテキスト
pNewColum ->Caption = "カラム";
//カラムの幅
pNewColum ->Width = 200;
の様にしてカラムの追加を行います。

さらに、データの追加は、
プロパティのItemsで設定するかプログラムで追加するには

//宣言
TListItem *pItem;
//行のループ
for(int nRow = 0; nRow < 10; nRow++)
{
//列のループ
for(int nCol = 0; nCol < 5; nCol++)
}
//行の追加
pItem = ListView1->Items->Add();
//列のデータの追加
pItem->Caption = "キャプション";
pItem->SubItems->Strings[nCol] = "サブアイテム";
}
}
データ追加の部分がちょっとうろ覚えなのですが、こんな感じで出来たはずです。
キャプションというのはListViewの見た目では一列目のところです。そこから後の列をサブアイテムと言います。Stringsの[]の中の数字をループで回して変化をさせれば次の列に追加していけます。
さらにその外でループすれば行を追加できるようになっています。
行数の指定は?と思われるかも知れませんが、一行(プログラムでは 0 ですが)目から順々に行の追加をしていくことがこれで出来ます。
ソース部分は確認をして、また、ご連絡をしたいと思います。
一緒に頑張りましょうね!
    • good
    • 0

デザイナで、カラムの設定をしておく


データソースを1行ずつ処理する
 TListItemを生成する
 データソースの1カラムずつ処理する
  TListItem.Itemに列データを追加する
 TListView.Itemsに、ListViewItemを追加する


ヘルプを見れば「例」が出ている 
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC++ Builderで文字列をバイトにする方法

C++ Builderでプログラミングをやっているのですが、

String memo1 = "あいうえお";


という文字列を

unsigned char test_bin[1000];

バイトで宣言した配列に



test_bin[0] = memo1の1バイト目;
test_bin[0] = memo1の2バイト目;
test_bin[0] = memo1の3バイト目;
test_bin[0] = memo1の4バイト目;
test_bin[0] = memo1の5バイト目;


このように、文字列データのバイト数値を数値変数に代入させることはできますでしょうか?


どうぞ、ご教授の程よろしくお願い致します。

Aベストアンサー

No1です
>このようにコピーした時には文字コードは考慮されないのでしょうか?
何か勘違いされてるような気がしますが文字コードはコピー元の文字で考慮すべき問題です
少なくても strcpy 関数にて文字コードが変化することはありません

元々格納されていた文字列がユニコードなのであればユニコードの文字コードがコピーされ
SJISであればSJISの文字コードがそのままコピーされます

QListViewにて行追加

Visual C# 2005初心者です。
ListViewを使用して、データを表示するのに、

listView1.Items.Add("1111111", 3);
listView1.Items.Add("2222222", 3);
listView1.Items.Add("3333333", 3);

と書くと、列が追加されます。
行を追加するには、どうすればよいのでしょうか?

どうか、教えてください。

Aベストアンサー

listViewのViewプロパティをDetailsに設定した上で、Items.Add()メソッドを呼び出せば行方向にアイテムが追加されます。ただしそのままではアイテムが表示されないので、listView.Columns.Add()メソッドで列ヘッダにコレクションを追加します。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Qラジオボタンのグループ化

VC6.0の
ラジオボタンのグループ化についてですが
例えばIDC_RADIO1~IDC_RADIO6まで作ったとして
IDC_RADIO1と
IDC_RADIO4のグループにチェックをいれると
IDC_RADIO1~3と4~6が
それぞれグループになったのですが
1、2、6と3、4、5をグループにしたいときは
どうすればよいのでしょうか?

あるサイトによるとグループボックスでラジオボタンで囲むと
囲んだ部分がグループになると記述されてたのですが
それについてもうまくいかなかったのですが、教えて頂けないでしょうか?

Aベストアンサー

[レイアウト]-[タブオーダー]でタブ順を
IDC_RADIO1,2,6,3,4,5 の順で設定します。
ラジオボタンのプロパティで IDC_RADIO1 と IDC_RADIO3
の[グループ]をチェックします。またIDC_RADIO5 の後の
コントロール(何でも良い)の[グループ]もチェック
します。

>グループボックスでラジオボタン
マジっすか。

Q”wchar_t*型は渡せない”というエラー

現在、ifjpeg.spiのDLLファイルで画像データを表示させるプログラムを作成中です。
このプログラムで、

if( IsSupported(OpenDialog->FileName.c_str(),theFile) != 0 )


このプログラムでビルドを行うと次のようなエラーが出ます。

[BCC32 エラー] Unit1.cpp(106): E2034 'wchar_t *' 型は 'char *' 型に変換できない
[BCC32 エラー] Unit1.cpp(106): E2340 1 番目のパラメータは char * 型として定義されているので wchar_t * 型は渡せない


”IsSupported”は

ProcIsSupported IsSupported =
(ProcIsSupported)GetProcAddress(hSPI, "IsSupported");

このように宣言していて、


typedef int __stdcall (*ProcIsSupported)(LPSTR,DWORD);


このようなプログラムなのですが、解決方法を教えて頂けませんでしょうか?

現在、ifjpeg.spiのDLLファイルで画像データを表示させるプログラムを作成中です。
このプログラムで、

if( IsSupported(OpenDialog->FileName.c_str(),theFile) != 0 )


このプログラムでビルドを行うと次のようなエラーが出ます。

[BCC32 エラー] Unit1.cpp(106): E2034 'wchar_t *' 型は 'char *' 型に変換できない
[BCC32 エラー] Unit1.cpp(106): E2340 1 番目のパラメータは char * 型として定義されているので wchar_t * 型は渡せない


”IsSupported”は

ProcIsSupported IsSupported =
(ProcIsSupport...続きを読む

Aベストアンサー

質問するには、もう少し情報があった方がいいでしょう。
既にある回答の情報から、C++ Builder のようですが、2009 or 2007 以降、ダイアログにある文字データの型が AnsiString から、UnicodeString に替わりました。
このため、c_str() をとっても、char * ではなく、wchar_t* が帰ってきます。

で、横着をするのなら、UnicodeString が AnsiString にキャスト可能であることを使って、

if( IsSupported(OpenDialog->FileName.c_str(),theFile) != 0 )

を、

if( IsSupported(static_cast<AnsiString>(OpenDialog->FileName).c_str(),theFile) != 0 )

と、一度 AnsiString にしてから、.c_str() をとると、char * が帰ってきます。

QListViewのサブアイテムの文字色

C# .NET のListViewのItem(行)毎の背景や文字色を変えることはできますが、SubItem毎の設定をすることはできるのでしょうか?
SubItemのBackColorやForeColorプロパティーを変更してもも見た目には変化がありません。
よろしくお願いします。

Aベストアンサー

リベンジ。
listViewItem1.UseItemStyleForSubItems = false;
これ追加する。
その後、サブアイテムの色変えればok

Qリストビューで選択行の背景を変える

お世話になります。リストビューの選択行の背景色を変えたいと思い、カスタムドローを用い以下のようにしましたが、選択していない所も赤になってしまいます。

if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {
 // 選択行の背景色を変更
 if (lplvcd->nmcd.uItemState & CDIS_SELECTED) {
  lplvcd->clrTextBk = RGB(255, 0, 0);
  lplvcd->nmcd.uItemState &= ~CDIS_SELECTED;
 } else {
  lplvcd->clrTextBk = RGB(255, 255, 255);
 }
 return CDRF_NOTIFYSUBITEMDRAW;
}

デバッグモードで見ると、else以降の分は解釈されていないようです。
リストビューは

g_hList = CreateWindowEx(0 , WC_LISTVIEW , 0 ,
WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS,
1 , 1 , width , lv_height , g_hMain , (HMENU)1 ,
g_hInst , NULL);

dwStyle = ListView_GetExtendedListViewStyle(g_hList);
dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES;
ListView_SetExtendedListViewStyle(g_hList, dwStyle);

ListView_SetBkColor(g_hList, RGB(240,240,240));

のようにしています。宜しくお願いします

お世話になります。リストビューの選択行の背景色を変えたいと思い、カスタムドローを用い以下のようにしましたが、選択していない所も赤になってしまいます。

if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {
 // 選択行の背景色を変更
 if (lplvcd->nmcd.uItemState & CDIS_SELECTED) {
  lplvcd->clrTextBk = RGB(255, 0, 0);
  lplvcd->nmcd.uItemState &= ~CDIS_SELECTED;
 } else {
  lplvcd->clrTextBk = RGB(255, 255, 255);
 }
 return CDRF_NOTIFYSUBITEMDRAW;
}

デバ...続きを読む

Aベストアンサー

★『CDIS_FOCUS』定数を付けてみて下さい。
・つまり
>if ( lplvcd->nmcd.uItemState & CDIS_SELECTED ){
 ↑
 ここの部分を
 int check = (CDIS_SELECTED | CDIS_FOCUS);
 
 if ( (lplvcd->nmcd.uItemState & check) == check ){
 とします。
・リストビューやツリービューでは選択された場所を CDIS_SELECTED と CDIS_FOCUS 定数の
 両方のビットが立っているときです。CDIS_SELECTED 定数だけでは判定するのに不十分です。
 他にも LVNI_SELECTED、LVNI_FOCUSED 定数も同じ考えで2つ指定してから判定します。
・以上。

QGetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・

お世話になっています。

iniファイルを読込み、各変数に代入するC言語のDLLを作成したいのです。
このサイトの投稿や、MSDNなどにも載っていたのですが、
少し理解に苦しみます。

現在まで、理解した点がwindows.hのインクルードを
記述するところ辺りです。
iniファイルは下記のようなレイアウトです。

---<mst.ini>----------------------------
[user]
name=username
ID=userid
[pc]
pcname=FMV
----------------------------------------

#include<windows.h>は記述することまでは
分かりましたが、以下から進みません。。。

GetPrivateProfileString("")

初心者で申し訳ありませんが、お助け願います。

Aベストアンサー

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
                sizeof(strBuf),   // 上記のエリアのサイズ
                "mst.ini" );     // iniファイル名

解説:
iniファイル名をフルパスで指定しないとWindowsのディレクトリにあるものと判断されます。
Win9xなら「c:\windows」、WinNT系なら「c:\WinNT」。

[user]セクションのnameキーがないときは、デフォルト値で指定した値が設定させます。

復帰値「dwLen」は実際に設定した値(文字列)の長さが返されます。

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
             ...続きを読む

QC++Builderで別Formから呼び出したFormを終了させるには

C++Builderで別Formから呼び出したFormを終了させるには
わかりにくくてすいませんが

Form1から Form2を呼び出し
そのForm2からForm1を終了させたいのですが
もちろんForm2も終了されてもかまいません
又はアプリケーションごと
すべて終了させてもかまいません

よろしくお願いいたします

Aベストアンサー

>Form1から Show()でForm2を立ち上げて
>そのForm2からClose()で
>Form1ごと閉じたかったのですが閉じれなかったので
>もちろん
>Form1 = new TForm1(this);
>Form1->Close();
>はしたのですが やり方がおかしかったのでしょうか?

 インスタンスとクラスの関係を理解しましょう。
Form2のインスタンス中でそんなことやったら、Form1の今表示されているウインドウ(に関連するメモリ)は宙に浮き、新しいウインドウが作られ、それを閉じる、というようなことをやっています。

 Form2にForm1を参照させて、Form1->Close();だけで閉じませんでした?
#「終了」は、Closeで良かったかいな??

Qアプリケーション終了時例外エラー(アクセス違反)の調査方法について

大変困っています。

アプリケーションが終了するときに「アクセス違反」がワトソン博士によって取得されています。
当方アプリケーションなどに弱く、解決策の想像が付きません。どなたかご教授お願いいたします。

<解決策例>
・どういったスキルを持った人にどの様な調査を進めさせれば良いのか。。。
・以前同様な事があり原因は○○だった
・恐らく○○だろう
 など、お願いいたします。

<ユーザ報告>
処理終了し、画面が消えたところでワトソン博士のメッセージが表示された

<ログ抜粋>
例外番号c0000005(アクセス違反)

ファンクション:RtlDestroyHeap
~略~
フォールト → 77f6d672 8908 mov [eax],ecx ds:09000001=00000000

<備考>
開発環境:MSVC6.0
動作環境:Windows NT4.0 SP6a
発生頻度:2回/年
使用頻度:2~3回/(平日)

以上、よろしくお願いします。

Aベストアンサー

発生頻度が年2回というのはなかなか厳しい条件ですね。

さて・・・

「私であれば、次の手順で調査を行います。」という書き始めで延々とデバッグ方法を書いていたのですが、書き終わってからちょっとGoogleで検索したら、ひょっとするとちょうど質問者さんのトラブルと同じかもしれない現象がMicrosoftのKBにありました。

場所はここです: http://support.microsoft.com/kb/168006/ja

要点をかいつまんで書くと、MSVCRT/MFCのDLLのバージョン不整合でエラーが発生することがある、という内容です。KB自体は特定のアプリケーションについて書かれていますが、記述されている現象と原因の関係から考えるに、他のアプリケーションでも同様の現象が発生すると思われます。

さてさて。

せっかく書いた文章を捨てるのがもったいないので(貧乏性)、邪魔かもしれませんが下に続けることにします。もし上のKBの内容がそれらしいようであれば、読み飛ばしてください。

========

私であれば、次の手順で調査を行います。

1. MAPファイル、CODファイル作成

「ワトソン博士のログを取得した際に実行していたEXEファイル」をビルドした際、一緒にMAPファイルやCODファイル(リスティングファイル)を作成していれば、そのファイルを用意しておきます。

もし作成していない場合は、「ワトソン博士のログを取得したEXEファイル」と、バイナリレベルで全く同じEXEファイル(バイト単位で比較すると、ファイルに埋め込まれたタイムスタンプ・チェックサム以外は一致する)が作成可能かどうか調べます。(ビルドに必要なソースファイルやビルドオプションに変更を加えていなければ作成可能です。)

作成可能であれば、コンパイルオプションに「リスティングファイルタイプ:マシン語コードとソースを含む」、リンクオプションに「MAPファイル作成」を追加してEXEを再作成してください。これで、「ワトソン博士のログを取得した際に実行していたEXEファイル」に対応するMAPファイルとCODファイルが得られます。

2. エラー発生行を特定

ワトソン博士のログがどれだけ取れているかにもよりますが、スタックダンプが含まれていればたいていエラー発生行を特定できます。

まず「フォールト->」が含まれる逆アセンブルリストを探します。次に、その下にある「スタックバックトレース」を探します。

スタックバックトレースを上から下に順にたどっていくと、そのうち「ReturnAd」(リターンアドレス)がアプリケーションのアドレス範囲(VC++6の標準オプション設定を変更していなければ0x00400000~)に入るところが出てきます。見つかったら、そのアドレスの直前にあるcall命令が例外を発生させたAPIを直接呼び出している場所です。

さて、仮にリターンアドレスが0x00401234だったとします。そうしたら、次はMAPファイルを見てこのアドレスがどの関数に属しているか探します。ちょうど0x00401234というアドレスは見つからないでしょうけれども、これに近いアドレスは見つかるはずです。そのアドレスに対応する関数名もMAPファイルにあります。

次はその関数名をCODファイルから探します。見つかったら、MAPファイルにあるアドレスがCODファイルにあるマシン語コードの先頭アドレスになるので、そこからリターンアドレス0x00401234に対応するはずの場所まで順番にアドレスを辿っていきます。関数の先頭アドレスが0x00401200であれば、0x34バイト先を探すわけです。

そうすると、その探した場所にある命令の直前の命令がcall命令になっているはずです。CODファイルには、その場所のC++ソースでの行番号とソース文もコメントとして入っているはずなので、あとは対応するソースをよーく見てエラーの見当をつけてください。

アセンブラの知識があれば、そこでcallを使った(他の関数を呼び出した)ときの引数の内容もある程度分かります。(ポインタ渡しだと、そのポインタの先の内容までは分かりませんが。)

3. 置き換え用EXEファイルと対応するMAPファイル作成

これ以降は将来への備えです。

コンパイルオプションでデバッグ情報を「プログラムデータベースを使用」、リスティングファイルタイプを「マシン語コードとソースを含む」、リンクオプションで「MAPファイルを作成する」、デバッグ情報「他の種類」を追加してビルドし、出来たEXEファイルを本番用として使用します。同時に作成されるMAPファイル、CODファイル、PDBファイルは保管しておきます。

MAPファイル、CODファイルの使い方は上記2.のとおりです。PDBファイルは、もし完全なクラッシュダンプが取得できればWinDbgを使って事後ソースレベルデバッグが可能になりデバッグ作業が非常に楽になるので、念のため取っておきます。

4. ワトソン博士のオプション変更

drwtsn32.exeを起動し、「クラッシュダンプファイルの作成」をチェックします。(デフォルトは、チェックが入っています。)

クラッシュダンプファイルとEXEとPDBがあればWinDbgで事後ソースレベルデバッグができます。(いわゆるポストモーテムデバッグです。UNIX系でコアダンプしたコアをデバッガで読み込んでデバッグするのと同じ種類のものです。)


普段何とも思わずに行っていることでも、文章にすると長いですね・・・

えーと、「どういうスキルを持った人に調査させればいいか」については、上記の内容を読んで『なるほど!』と言える人でしょうか。

参考URL:http://support.microsoft.com/kb/168006/ja

発生頻度が年2回というのはなかなか厳しい条件ですね。

さて・・・

「私であれば、次の手順で調査を行います。」という書き始めで延々とデバッグ方法を書いていたのですが、書き終わってからちょっとGoogleで検索したら、ひょっとするとちょうど質問者さんのトラブルと同じかもしれない現象がMicrosoftのKBにありました。

場所はここです: http://support.microsoft.com/kb/168006/ja

要点をかいつまんで書くと、MSVCRT/MFCのDLLのバージョン不整合でエラーが発生することがある、という内容です。KB...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

価格.com 格安SIM 料金比較