[Delphi:91125] ClientDataSetとDBGrid

1,865 views
Skip to first unread message

松本 英俊

unread,
Feb 23, 2009, 8:12:34 PM2/23/09
to Del...@ml.users.gr.jp
松本です
お世話になっています

フォームに
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

松本 英俊

unread,
Feb 23, 2009, 9:08:42 PM2/23/09
to Del...@ml.users.gr.jp
松本です
再度確認すると
やはり
同じエラーがでました
対処の方法はどうすれば良いでしょうか
要は、DBComboBox1の変化で全行を変更あいたいのです

Masaki Umemura

unread,
Feb 23, 2009, 9:35:50 PM2/23/09
to Del...@ml.users.gr.jp
こんにちは、梅村です。
あてずっぽうなんで外してたらごめんなさい。

松本 英俊さん:


> 全ての行を変更するため、下記のようにしました
> 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;

これを一括更新前に入れればいいかも...
___________________________________________________
(株)イマオコーポレーション 梅村 正喜

Murayama,Kouji,Character Prod,SOJ

unread,
Feb 23, 2009, 10:00:44 PM2/23/09
to Del...@ml.users.gr.jp
こんにちわ。村山と申します。MLに投稿するのは10年ぶりくらいでしょうか(^^;

DBGrid は関係ないですよね?
フォームのコンボボックスの値を全てのレコードに反映させたいということでしょうか?

コンボボックスを DBComboBox ではなく ComboBox とするのがよろしいかと。
DBComboBox を使って Edit モードになっていない データを編集しようとしているから怒られていると思います。

DBComboBox(単一のレコード値を表示・編集)のイベントで全レコード処理はよろしくないと思いますよ。

目的が違ってたらごめんなさい。

村山

松本 英俊

unread,
Feb 23, 2009, 11:37:04 PM2/23/09
to Del...@ml.users.gr.jp
松本です
皆様ありがとうございます

>フォームのコンボボックスの値を全てのレコードに反映させたいということでしょうか?
その通りです

>コンボボックスを DBComboBox ではなく ComboBox とするのがよろしいかと。
>DBComboBox を使って Edit モードになっていない データを編集しようとしているから怒られていると思います。

>DBComboBox(単一のレコード値を表示・編集)のイベントで全レコード処理はよろしくないと思いますよ。
分かりました
ComboBox にします。
ただ、カーソルが移動したときに、ComboBoxのテキストにをデータセットの値を表示するのが面倒ですが、

with DBGrid1.DataSource.DataSet do
begin
if State in [dsEdit, dsInsert] then
Post;
end;

いろいろ試しましたが、エラーがでます


太田寛

unread,
Feb 24, 2009, 12:11:28 AM2/24/09
to Del...@ml.users.gr.jp
HOtaです。

Append; Edit;した後は、Postするのが普通だと思います。
ソースを見せていただいたところ、これが入っていませんが、他にそういう処理
をしているのでしょうか?


> Append;
> FieldByName('f1').AsString:=char(65+n);
> FieldByName('f2').AsString:=char(65+n)+char(65+n);

> end;

松本 英俊

unread,
Feb 24, 2009, 1:13:50 AM2/24/09
to Del...@ml.users.gr.jp

松本 英俊

unread,
Feb 24, 2009, 1:23:40 AM2/24/09
to Del...@ml.users.gr.jp
松本です
すみませんいきなり送信しました

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

中村拓男

unread,
Mar 6, 2009, 3:39:54 AM3/6/09
to Del...@ml.users.gr.jp
中村@ブレーンです。

亀レスですが、基本をおさえれば簡単だと思います。

1) TDBComboBox でフィールド値を変更すると、TDBComboBox はカレントレコードを編集モードにし、
フィールド値を変更します。TDBComboBoxからフォーカスが外れると Post が行われます。
この時、データセットは編集状態である必要があります。
  #普通のTDBComboBoxの使い方ならこれで問題ないはずです。

2) TClientDataSet の Edit メソッドはカレントレコードを編集状態にします。
3) TClientDataSet の Next は暗黙に Post を呼び出し、編集結果をデータセットに反映し、
モードをデフォルトのブラウズモードに戻します。

以上から、TComboBox の OnChange の中でデータセットの Next を呼ぶと
フォーカスが外れた時の Post が出来なくなって例外がおきる事になります。

この動きから判るように、TDBComboBoxはカレントレコードの特定のフィールドを編集するための
コントロールで、それ以外の用途に使うときは注意が必要です。

松本 英俊 さんは書きました:

----------
東京都 日野市 中村拓男

matumoto

unread,
Mar 5, 2009, 6:57:55 AM3/5/09
to Del...@ml.users.gr.jp
松本です
ありがとうございます
何となく解ったような気になりました。
年甲斐(62歳)もなくいろいろと挑戦してます
よろしくお願いします
Reply all
Reply to author
Forward
0 new messages