StringGridのセル操作の覚書

Borland C++BuilderのStringGridを使ってセルの中身をセンターリングしたり
背景色を変える方法

void __fastcall TForm::strGridDrawCell(
TObject *Sender, int ACol, int ARow, TRect &Rect,
TGridDrawState State)
{
TStringGrid *grid = dynamic_cast(Sender);
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

VistaCookieが取得できない現象が発生!!!

色々と調べたがCookieは、クライアント(Vista)には正しく出力されている…。
なぜ、Cookieを送信しない…。

細かい事は、仕事の関係上あんまり書けないが、Vistaの初期設定のままではCookieがサーバに送信されないのだ。

で、IEの設定を色々といじったが効果なし。

#あるパターンの時は、サーバにCookieを送信する。
#この現象のせいで、VistaCookie取得が上手くいったと思い込んでいた…。

結論から言えばCookieの取得はできた。UACをはずすと、Cookie取得は可能になったのだ。

あと、UACを外さないパターンとしては、IEの[ツール]→[インターネットオプション]の[セキュリティ]の[信頼済みサイト]の設定にて信頼済みのWEBサイトとして登録し、「保護モードを有効にする」のチェックを外す。
これで、UACのチェックを外さなくとも一応はCookieの取得が可能になる。

C++Builder6に、悩まされた…。

初のBuilder6を使うのだが、Builder6ってバグが多いって聞くけど大丈夫かな〜

とりあえず、既存システムのプロジェクトを起動…お〜ちゃんとプロジェクト読めるやん。

Builder6ってバグ多いって聞いてたけど大丈夫そうやん。
(この程度で安心してたのが間違い…)

さっ、オプション変更せな[プロジェクト]→[オプション]
「アドレスXXXXXXXXでアドレスXXXXXXXXに対する書き込み違反がおきました。」

なにー

くそ、もう一回じゃ…同じやん(-_-;)

再インストールしてやる…。

で、あんなこんなで丸々一日なやんだのだがOSのDEPデータ実行防止)を解除することで解決しました!!!

マイコンピュータ→プロパティ→詳細設定→パフォーマンスの設定→データ実行防止ラジオボタンを「重要なWindowsのプログラムおよびサービスについてのみ有効にする」にセットして再起動。

慣れない作業

今日は、プロジェクトに使用する端末のLan線作り…。
白(橙)橙、白(緑)、緑、白(青)、青、白(茶)、茶の順に線を平らに並べてコネクタに注す。
この、繰り返しで4本作り終えたところでお昼休み。

この時、すでに指先には異変が…。

そう、SEである私がする慣れない仕事の為に、指先には…水ぶくれが出来ていたのでる。

…なんて、貧弱な体なのか…(-_-;)。

普段、キーボードしか触っていないとこんな貧弱な指先になるのかと痛感。

でも、指先を鍛える方法ってなにがあるんだ…。

てか、指先の皮を厚くしたいとは思わないが…。
指先の皮を厚くするのって、私の知っている限り映画に出てくる拳法家ぐらいだろう。