DL6Pro,Xp、DBはInterBaseを利用、IBDataSetを利用しています
Tag等を利用して固有の名前を付けたMsakEdit,CheckBox,LabeledEditを動的に作成し、各項目に入力後、データを更新するため、以下のコードを作成しました。
試行錯誤の結果、以下のコードで、最終的には期待どうりの結果は得られたのですが、何故、DBに書き込む前にMaskEdit LabeledEditコンポーネントのTextの値を以下のように変換する必要があるのか理解できません。
S1,S2の値をTmaskEdit(Find・・・・)で直接置き換えるとアドレス違反のエラーが発生します。
よろしくお願いします。
procedure TFrmIndSchedule.Button3Click(Sender: TObject);
var I : Integer ;
S,S1,S2 : String;
const ItemName = 'Item'; //LabeledEdit共通部の名称
const DonDayName = 'DonDay' ; //MaskEdit共通部の名称
Const DonCheckSche = 'CBDon'; //CheckBox共通部の名称
begin
for I := 0 to ItemNum -1 do //ItemNumは動的に作成したコンポーネントの数
begin
case TCheckBox(FindComponent(DonCheckSche + IntToStr(I))).state of
cbUnchecked :
S := '0';
cbChecked :
S := '1';
end;
S1 := TLabeledEdit(FindComponent(ItemName + IntToStr(I))).Text;
S2 := TMaskEdit(FindComponent(DonDayName + IntToStr(I))).Text;
with DMAnshin.IBDSetScheduleMas do
begin
Locate('DoId',HSLDoId.Strings[I],[loCaseInsensitive]);
Edit;
FieldByName('DonDay').AsString := S1; //この部分へ上のコードTLabeledEdit(FindComponent(ItemName + IntToStr(I))).Textを直接記入するとエラーとなる。TLabeledEditも同様
FieldByName('CheckedDay').AsString := S2;
FieldByName('DonCheck').AsString := S;
Post;
end;
end;
if Application.MessageBox('変更を保存しますか?','変更登録確認',MB_OKCANCEL,) = MB_OK then
DMAnshin.IBDBKanri.ApplyUpdates([DMAnshin.IBDSetScheduleMas]);
end;
for I := 0 to ItemNum -1 do //ItemNumは動的に作成したコンポーネントの数
begin
case TCheckBox(FindComponent(DonCheckSche + IntToStr(I))).state of
cbUnchecked :
S := '0';
cbChecked :
S := '1';
end;
>> S1 := TLabeledEdit(FindComponent(ItemName + IntToStr(I))).Text;
>> S2 := TMaskEdit(FindComponent(DonDayName + IntToStr(I))).Text;
この二つが for I := 0 to ItemNum -1 do の外に出ているため、
IntToStr(I)が取得できていないと思われます。
したがって、TMaskEdit('DonDay')を探してしまい、コントロールがないと怒られているのではないでしょうか
あいや勘違い失礼しました(汗)
with 文の中でFindComponentメソッドを叩いているからデバッガは
DMAnshin.IBDSetScheduleMas.FindComponent(〜)を実行していることになります。
TFrmIndSchedule.FindComponent(Self.FindComponentでもいいかな?)と記述すれば大丈夫だと思います。
to-yaさん りっきぃさんありがとうございました
りっきぃさんのご助言どうりのようです。
有難うございました
ツイート | ![]() |