フォームに
ClientDataSet1
DataSource1
DBGrid1
DBComboBox1
Button1
を配置しています
ClientDataSet1は、新規作成からf1とf2を作成してます
Button1でデータを追加しています
procedure TForm1.Button1Click(Sender: TObject);
var
n:Integer;
begin
for n:=0 to 9 do begin
with ClientDataSet1 do begin
Append;
FieldByName('f1').AsString:=char(65+n);
FieldByName('f2').AsString:=char(65+n)+char(65+n);
end;
end;
end;
全ての行を変更するため、下記のようにしました
procedure TForm1.DBComboBox1Change(Sender: TObject);
var
testData:string;
begin
testData:=DBComboBox1.Text;
with ClientDataSet1 do begin
First;
while not Eof do begin
Edit;
FieldByName('f1').AsString:=testData;
Next;
// Edit; ................①
end;
end;
end;
そこで①が無いと、DBGrid1上でクリックすると
挿入モード又は編集モードではありませんと
エラー表示されます
①を追加するとエラー表示は出なくなります
この①の意味は何なのでしょうか
また、こんな書き方でいいでしょうか
よろしくお願いします
delphi2007
winXp sp3
松本 英俊さん:
> 全ての行を変更するため、下記のようにしました
> procedure TForm1.DBComboBox1Change(Sender: TObject);
> var
> testData:string;
> begin
> testData:=DBComboBox1.Text;
> with ClientDataSet1 do begin
> First;
> while not Eof do begin
> Edit;
> FieldByName('f1').AsString:=testData;
> Next;
> // Edit; ................(1)
> end;
> end;
> end;
>
> そこで(1)が無いと、DBGrid1上でクリックすると
> 挿入モード又は編集モードではありませんと
> エラー表示されます
一括更新の前にどれかのレコードが編集中だとこうなる
気がします。
DBGrid はリアルタイムに変更を適用する訳ではなく、
例えば別の行に移ったタイミングで適用します。
一括更新されると編集中ではなくなるんですが
編集中と誤認識し、それを適用しようとしてエラーになる、
という感じでしょうか。
私は所々で下記のように明示的に変更を適用します。
(鬱陶しいので何とかならないかと思ってます)
with DBGrid1.DataSource.DataSet do
begin
if State in [dsEdit, dsInsert] then
Post;
end;
これを一括更新前に入れればいいかも...
___________________________________________________
(株)イマオコーポレーション 梅村 正喜
DBGrid は関係ないですよね?
フォームのコンボボックスの値を全てのレコードに反映させたいということでしょうか?
コンボボックスを DBComboBox ではなく ComboBox とするのがよろしいかと。
DBComboBox を使って Edit モードになっていない データを編集しようとしているから怒られていると思います。
DBComboBox(単一のレコード値を表示・編集)のイベントで全レコード処理はよろしくないと思いますよ。
目的が違ってたらごめんなさい。
村山
>フォームのコンボボックスの値を全てのレコードに反映させたいということでしょうか?
その通りです
>コンボボックスを DBComboBox ではなく ComboBox とするのがよろしいかと。
>DBComboBox を使って Edit モードになっていない データを編集しようとしているから怒られていると思います。
>DBComboBox(単一のレコード値を表示・編集)のイベントで全レコード処理はよろしくないと思いますよ。
分かりました
ComboBox にします。
ただ、カーソルが移動したときに、ComboBoxのテキストにをデータセットの値を表示するのが面倒ですが、
with DBGrid1.DataSource.DataSet do
begin
if State in [dsEdit, dsInsert] then
Post;
end;
いろいろ試しましたが、エラーがでます
Append; Edit;した後は、Postするのが普通だと思います。
ソースを見せていただいたところ、これが入っていませんが、他にそういう処理
をしているのでしょうか?
> Append;
> FieldByName('f1').AsString:=char(65+n);
> FieldByName('f2').AsString:=char(65+n)+char(65+n);
> end;
ClientDataSet1 は単独で使っています
データベスに接続していません
ClientDataSet1 に直接テキストファイルを読み込んでいます
StringList - Gridで同じことをしていましたが
ClientDataSet1 -DataSource - DBGridにすると便利な使い方が出来るのでは?
と考えた次第です
procedure TForm1.Button1Click(Sender: TObject);
var
n:Integer;
begin
for n:=0 to 9 do begin
with ClientDataSet1 do begin
Append;
FieldByName('f1').AsString:=char(65+n);
FieldByName('f2').AsString:=char(65+n)+char(65+n);
Post;...................................挿入
end;
end;
end;
変わりません........意味わかりません
procedure TForm1.DBComboBox1Change(Sender: TObject);
var
testData:string;
begin
testData:=DBComboBox1.Text;
with ClientDataSet1 do begin
First;
while not ClientDataSet1.Eof do begin
亀レスですが、基本をおさえれば簡単だと思います。
1) TDBComboBox でフィールド値を変更すると、TDBComboBox はカレントレコードを編集モードにし、
フィールド値を変更します。TDBComboBoxからフォーカスが外れると Post が行われます。
この時、データセットは編集状態である必要があります。
#普通のTDBComboBoxの使い方ならこれで問題ないはずです。
2) TClientDataSet の Edit メソッドはカレントレコードを編集状態にします。
3) TClientDataSet の Next は暗黙に Post を呼び出し、編集結果をデータセットに反映し、
モードをデフォルトのブラウズモードに戻します。
以上から、TComboBox の OnChange の中でデータセットの Next を呼ぶと
フォーカスが外れた時の Post が出来なくなって例外がおきる事になります。
この動きから判るように、TDBComboBoxはカレントレコードの特定のフィールドを編集するための
コントロールで、それ以外の用途に使うときは注意が必要です。
松本 英俊 さんは書きました:
----------
東京都 日野市 中村拓男