StringGridのセル操作の覚書
Borland C++BuilderのStringGridを使ってセルの中身をセンターリングしたり
背景色を変える方法
void __fastcall TForm::strGridDrawCell(
TObject *Sender, int ACol, int ARow, TRect &Rect,
TGridDrawState State)
{
TStringGrid *grid = dynamic_cast
unsigned int position = DT_VCENTER|DT_CENTER|DT_SINGLELINE;
//グリッドのカーソルを消す
if ( grid->Focused() != true ) {
//セルの背景色を変更する
if ( ACol == 0 || ARow == 0 ) {
grid->Canvas->Brush->Color = clBtnFace ;
} else {
grid->Canvas->Brush->Color = grid->Color;
}
//背景色で塗りつぶす
grid->Canvas->FillRect( Rect );
//セルの中の文字列を再度、Canvasに描画する。
//フォントカラーを書き直す
grid->Canvas->Font->Color=grid->Font->Color;
//文字を書き直す
if (ACol == 0 && ARow > 0) position = DT_VCENTER|DT_LEFT|DT_SINGLELINE;
DrawText( grid->Canvas->Handle, grid->Cells[ACol][ARow].c_str(),
- 1, &Rect, position);
}
}
今更、fread()
モード|動作 |ファイルがあるとき |ファイルがないとき
"r" |読み出し専用 |正常 |エラー(NULL返却)
"w" |書き込み専用 |サイズを 0 にする(上書き)|新規作成
"a" |追加書き込み専用 |最後に追加する |新規作成
"r+" |読み込みと書き込み |正常 |エラー(NULL返却)
"w+" |書き込みと読み込み |サイズを 0 にする(上書き)|新規作成
"a+" |読み込みと追加書き込み|最後に追加する |新規作成
※ "r"、"w"、"a" はそれぞれ「読み」、「書き」、「追加」の専用モードです。
つまり、"r"モードで fopen したファイルに書き込み動作を行うことは出来ません。
"r+" と "w+" は一見同じ「読み書き」可能に見えますが、先に来るモードが主となる
ため、ファイルの有無で動作が異なります。
また、"a+" の書き込みは「追加書き込み」しか出来ません。
バイナリモード|動作
(省略時) |テキストモード
出力時 : 改行文字 '\n'(0x0a) |
⇒ '\r' / '\n'(0x0d / 0x0a)に変換 |
入力時 : '\r' / '\n'(0x0d / 0x0a) |
⇒ 改行文字 '\n'(0x0a)に変換 |
0x1a を EOF(ファイルエンドとする) |
"b" |バイナリモード("wb"、"rb" のように指定)
上記の変換を行わない |
0x1a を EOF扱いしない |
※ MicroSoft系の OS では、テキストファイルの改行は '\r'(0x0d:復帰)と
'\n'(0x0a:改行)の2つの コードで表されます。
そのため、テキストモードで改行コード '\n' をファイルに書き込もうとすると、
'\r' '\n' の2文字に変換して書き込みます。
逆に読み込みでファイルに '\r' '\n' の改行コードがあれば '\n' の 1文字に変換します。
また、テキストファイル終端の 0x1a を EOF(ファイルエンド)として扱います。(2002.04.08修正)
しかし、バイナリファイルには「0x1a」、「0x0d」、「0x0a」はデータとして存在する可能性があり、
それをテキストモードのように変換されては困ってしまいます。
そのため、MicroSoft系のC言語ではテキストモードとバイナリモードを区別します。
なお、UNIX系のC言語ではこれらの区別は不要です。
fread() 使用時の注意
fread() 関数を使用してファイルを読み出すときに、普通に開いたストリームを使用すると CRLF が LF に変換されるので注意が必要です。
厳密には、変換されるのは fopen() 時にテキストモードで開いた場合で、バイナリ指定("rb" など)を指定した場合は、CRLF が変換されることなく読み取ることが出来ます。
Windows のテキストファイルでは、CRLF が改行の基本なので、テキストファイルだからといってテキストモードで開いてはいけなそうです --;
/
#include
#include
typedef struct base {
unsigned int ui;
long double ld;
} BASE;
typedef BASE *pBASE;
unsigned int rows = 3, columns = 5;
void de_allocate(pBASE*);
int main(void) {
pBASE *matrix;
unsigned int i, j;
/* ステップ 1: 行を設定 */
matrix = (pBASE *) calloc( rows, sizeof(BASE *));
/* ステップ 2: 列を設定 */
for (i = 0; i < rows; ++i)
matrix[i] = (BASE *) calloc( columns, sizeof(BASE));
for (i = 0; i < rows; i++)
for (j = 0; j < columns; j++)
matrix[i][j].ld = i + j; /* 初期化*/
for (i = 0; i < rows; ++i) {
printf("\n\n");
for (j = 0; j < columns; ++j)
printf("%5.2Lf", matrix[i][j].ld);
}
de_allocate(matrix);
return 0;
}
void de_allocate(pBASE *x) {
int i;
for (i = 0; i < rows; i++) /* ステップ 1: 列を削除 */
free(x[i]);
free(x); /* ステップ 2: 行を削除 */
}
構造体配列の動的確保
/*
構造体の動的配列の確保
VistaでCookie
色々と調べたがCookieは、クライアント(Vista)には正しく出力されている…。
なぜ、Cookieを送信しない…。
細かい事は、仕事の関係上あんまり書けないが、Vistaの初期設定のままではCookieがサーバに送信されないのだ。
で、IEの設定を色々といじったが効果なし。
#
#あるパターンの時は、サーバにCookieを送信する。
#この現象のせいで、VistaでCookie取得が上手くいったと思い込んでいた…。
#
結論から言えばCookieの取得はできた。UACをはずすと、Cookie取得は可能になったのだ。
あと、UACを外さないパターンとしては、IEの[ツール]→[インターネットオプション]の[セキュリティ]の[信頼済みサイト]の設定にて信頼済みのWEBサイトとして登録し、「保護モードを有効にする」のチェックを外す。
これで、UACのチェックを外さなくとも一応はCookieの取得が可能になる。
C++Builder6に、悩まされた…。
初のBuilder6を使うのだが、Builder6ってバグが多いって聞くけど大丈夫かな〜
とりあえず、既存システムのプロジェクトを起動…お〜ちゃんとプロジェクト読めるやん。
Builder6ってバグ多いって聞いてたけど大丈夫そうやん。
(この程度で安心してたのが間違い…)
さっ、オプション変更せな[プロジェクト]→[オプション]
「アドレスXXXXXXXXでアドレスXXXXXXXXに対する書き込み違反がおきました。」
なにー
くそ、もう一回じゃ…同じやん(-_-;)
再インストールしてやる…。
で、あんなこんなで丸々一日なやんだのだがOSのDEP(データ実行防止)を解除することで解決しました!!!
マイコンピュータ→プロパティ→詳細設定→パフォーマンスの設定→データ実行防止ラジオボタンを「重要なWindowsのプログラムおよびサービスについてのみ有効にする」にセットして再起動。
慣れない作業
今日は、プロジェクトに使用する端末のLan線作り…。
白(橙)橙、白(緑)、緑、白(青)、青、白(茶)、茶の順に線を平らに並べてコネクタに注す。
この、繰り返しで4本作り終えたところでお昼休み。
この時、すでに指先には異変が…。
そう、SEである私がする慣れない仕事の為に、指先には…水ぶくれが出来ていたのでる。
…なんて、貧弱な体なのか…(-_-;)。
普段、キーボードしか触っていないとこんな貧弱な指先になるのかと痛感。
でも、指先を鍛える方法ってなにがあるんだ…。
てか、指先の皮を厚くしたいとは思わないが…。
指先の皮を厚くするのって、私の知っている限り映画に出てくる拳法家ぐらいだろう。