いつもお世話になっております。
計算結果をラベルエディットに記入しているのですが、結果がプラス、
マイナスどちらの場合も文字色は黒(clWindowText)になっています。
マイナスの場合に文字色を赤(clRed)にする場合は、そのラベルエ
ディットの文字色を赤にするコードを書かなくてはなりませんでしょうか。
該当するラベルエディットが現在は5個位なのでまだいいのですが、将来的
に増えるので何か良い知恵があったらと思い質問しました。
決まった順番ならForが使えそうなのですが、そうではなく焦っています。
ご存知でしたらご指導下さい。宜しくお願い申し上げます。
配列に入れておけばよいかと思います。
FormCreateあたりで、
LabelEditArray[0] := OneEdit;
LabelEditArray[1] := TwoEdit;
LabelEditArray[2] := ThreeEdit;
LabelEditArray[3] := FourEdit;
...
もちろん、LabelEditArrayは、
LabelEditArray: array[0..3] of TLabelEdit;
などとしておいて。
イベントが同じであれば、(Sender As TLabelEdit)をチェックしてやればOKです。
値によって色を変えたいということなのでTLabeledEditのOnChangeを...
procedure TForm1.LabeledEdit1Change(Sender: TObject);
var
n : Integer;
c : TColor;
ALabelEdit : TLabeledEdit;
begin
ALabelEdit := Sender As TLabeledEdit;
n := StrToIntDef(ALabelEdit.Text,0);
if n < 0 then
c := clRed // マイナスであれば赤
else
c := clWindowText; // O以上であれば標準のテキストカラー
ALabelEdit.Font.Color := c;
end;
とすれば良いと思います。
TLabeledEditが複数あるということなので残りTLabeledEditのOnChangeも同じプロシージャに設定(この場合、オブジェクトインスペクタのコンボで"LabeledEdit1Change"を選択)します。
後は、にしのさんのレス通り配列で管理すれば良いと思います。
にしのさん、masayanさん、こんばんは。
どうもありがとうございます。
計算結果に小数点が含まれているものもあるので、masayanさんのコード
を若干下記のように変更して試してみました。
>n : Integer;
n : Single;
>n := StrToIntDef(ALabelEdit.Text,0);
n := StrToFloatDef(ALabelEdit.Text,0);
残りのTLabeledEditもLabeledEdit1Changeを選択して実行したら見事に
黒と赤に変化しました。
これで普通に動いているかのように見えるのですが、にしのさんに教え
ていただいた「配列の管理」はどのような働きをするのでしょうか?
LabelEditArray[0]から[3]が同じグループである。という感じにヘルプ
を見て解釈した次第なのですが、
>OneEdit;
Oneが何なのかが理解できない状況です。今後も「配列の管理」が重要に
なる予感がするので、しっかり理解したいと思っております。
お手数ですがご指導いただけますでしょうか。
オブジェクト変数は、そのオブジェクトがメモリ上のどこにあるかを示す番号(アドレス)です。
よって、配列に入れたときには、ただの変数を入れるのと同じように扱うことができます。
OneEditは、ふつうのTEditedLabelですね。
わたしは継承コンポーネントにして、数値を赤く表示(ほかに、数値以外の入力を規制する処理など入れるといいかもしれませんね)する機能をつけるといいと思いますけど…。
やっぱりたった一つだけの機能追加に、そこまでするのは、面倒でしょうか?
たかみちえさんのおっしゃるように、たくさん使う場合は、継承コンポーネントが一番だと思います。ただ、同じコンポーネントの場合、イベントを一つ書いて、あとのコンポーネントのイベントを、同じイベントに設定すれば、配列にしなくても可能ですね。
コンポーネント(オブジェクト)の配列は、例えば...
type
TForm1 = class(TForm)
:
private
{ Private 宣言 }
FLblEdits : Array [0..4] of TLabeledEdit;
public
{ Public 宣言 }
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// 各ラベルエディットを配列に設定
FLblEdit[0] := LabeledEdit1;
FLblEdit[1] := LabeledEdit2;
FLblEdit[2] := LabeledEdit3;
FLblEdit[3] := LabeledEdit4;
FLblEdit[4] := LabeledEdit5;
end;
// ラベルエディットのTextを一括設定する処理
begin
:
For i := 0 to 4 do
begin
FLblEdit[i].Text := Format("%f",[Data[i]]);
end;
:
end;
のようにForループでコンポーネントを一括設定する場合などに使うと便利です。
皆様、ご親切にありがとうございます。
いろいろチェックをかけながらやっていたので遅くなりすみません。
だんだん分かってきました。配列の管理をすることにより、1つ1つの
コンポーネントをいじらなくても1つのプロシージャを変更することで
全てが変更(管理)できると言うことなのですね。
masayanさんに書いていただいたコードをもとにコンパイルをかけながら
下記までたどりつきました。
private
{ Private 宣言 }
FLblEdits: Array[0..4] of TLabeledEdit;
:
procedure TForm3.FormCreate(Sender: TObject);
begin
FLblEdits[0] := LabeledEdit1;
FLblEdits[1] := LabeledEdit2;
FLblEdits[2] := LabeledEdit3;
FLblEdits[3] := LabeledEdit4;
FLblEdits[4] := LabeledEdit5;
end;
var
i:integer;
FLblEdits,Data:string;
begin
For i := 0 to 4 do
begin
FLblEdits[i].Text:= Format('%f',[Data[i]]);//(1124)
end;
end;
ここまでできたのですがどうしても下記のコンパイルエラーが出ます。
>[エラー] Unit3.pas(1124): '.' が必要な場所に ';' があります
その時カーソルが'.'の右側で点滅しております。
何が原因となっているのでしょうか。
申し遅れました。環境は6のパーソナルです。
お手数ですがお付き合いいただけますでしょうか。
宜しくお願い申し上げます。
度々すみません。上記は解決したものでした。
begin
For i := 0 to 4 do
begin
FLblEdits[i].Text:= Format('%f',[Data[i]]);//(1118)
end;
//end;←これを消しました。
上記の状態でコンパイルした時のエラーが下記のメッセージです。
>[エラー] Unit3.pas(1118): レコード、オブジェクトまたはクラスの
>いずれかが必要です
申し訳ありません。指導いただきたいのはこの原因です。
お手数ですが宜しくお願い申し上げます。
var
i:integer;
FLblEdits,Data:string;
で
FLblEdits をここで変数宣言してはいけないのでは?
ゆきおさん、ごめんなさい。
記載したソースは、要点抜粋(しかも、机上コーディング)でした。
以下が完全なソースです。
※.たぶん大丈夫と思いますがDelphi7ですので注意してください。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
const
MAX_EDITS = 5; // ラベルエディットの数
// ラベルエディットを追加したときはここを変えればOK
type
TEditTextValues = Array [0..MAX_EDITS - 1] of Single;
TForm1 = class(TForm)
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
LabeledEdit3: TLabeledEdit;
LabeledEdit4: TLabeledEdit;
LabeledEdit5: TLabeledEdit;
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
FLblEdits : Array [0..MAX_EDITS - 1] of TLabeledEdit;
procedure SetAllEditText(Data : TEditTextValues);
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ Private : 全ラベルテキストのTextを一括設定 }
procedure TForm1.SetAllEditText(Data : TEditTextValues);
var
i : Integer;
begin
for i := 0 to MAX_EDITS - 1 do
begin
FLblEdits[i].Text := Format('%f',[Data[i]]);
end;
end;
{ EVENT : Form OnCreate }
procedure TForm1.FormCreate(Sender: TObject);
var
Values : TEditTextValues;
begin
FlblEdits[0] := LabeledEdit1;
FlblEdits[1] := LabeledEdit2;
FlblEdits[2] := LabeledEdit3;
FlblEdits[3] := LabeledEdit4;
FlblEdits[4] := LabeledEdit5;
Values[0] := 1;
Values[1] := 2;
Values[2] := 3;
Values[3] := 4;
Values[4] := 5;
SetAllEditText(Values);
end;
end.
masayanさん、ありがとうございます。
書いていただいたソースで動きました。フォームを表示した時に
ラベルエディットの1〜5に1.00〜5.00と表示されましたので
>SetAllEditText(Values);
が働いての事だと思い、
> Values[0] := 1;
:
> Values[4] := 5;
を消して(//で)再度表示すると出なくなりました。
この後計算した結果がラベルエディットに表示された時にマイナス
の文字(数字)が黒のままなので、
>FLblEdits[i].Text := Format('%f',[Data[i]]);
を調べてみたのですが、'%f'は固定少数..負の....旨がヘルプ
に書いてありました。以前に書いていただいたソースにあったClRedの
代わりを意味しているものと調べもせずに解釈しておりました。
もしかして以前書いていただいた赤と黒を切り替えるソースも使うの
でしょうか?
だけど完全なソースとして書いていただいたものだし、何か私が勘違い
もしくは説明不足な所があるのでしょうか。
申し訳ございません。宜しくお願い申し上げます。
このソースには、文字の色を変える部分はありません。色を変える部分は追加して書かなければ変わりません。Foematの前ぐらいに足せば良いでしょう。
ゆきおさん、度々すいません。
文字の色を変える処理を入れてなかったですね。(忘れていました。)
前のレス通りTLabeledEditのOnChangeに色を変える処理を追加してください。
SetAllEditText関数(メソッド)ですが、これがコンポーネントの配列を利用した処理です。(パラメータで指定した配列値をTLabeledEditのTextに一括設定。)
サンプルではとりあえずFormのOnCreateでSetAllEditText関数を呼び出していますので実行と同時にTLabeledEditに値が表示されたと思います。
必要に応じて呼び出す場所を変えるか、必要なければSetAllEditText関数自体を消しても構いません。(あくまでサンプルですの目的のアプリケーションに応じて自分で判断してくださいね。)
ちなみにFormat関数は、数値や文字を書式化して文字列に変換する関数です。(C言語のsprintf関数とほぼ同じ)
例えば...
s := Format('%10.2f',[n]);
実数 n を小数部2桁、小数点を含め10文字の文字列に変換し、文字列変数 s に格納します。
実数であれば、FormatFloat関数というのもあります。
ヘルプなどを参考にいろいろ試して見てください。
masayanさん、ありがとうございます。
文字色はOnChangeに追加しました。配列の件よく分かりました。
やっと解決できました。
masayanさんをはじめ、たくさんの方に教えていただき感謝します。
長々とお付き合いいただき本当にありがとうございました。
ツイート | ![]() |