今、Delphiで初歩的な練習プログラムを組んでいます
基礎的な、登録・更新・削除・検索の練習です(DBとしてACCESSを利用)
まず現状ですが、登録内容をFORM上のStringGridに展開しています
ここで、StringGrid上に展開されている複数レコ-ドに対し、マウスで
クリックしたセルの行(レコ-ド特定)について、同じフォ−ム上にある
別のコンポ−ネント(TEDIT等)に項目(各セルごとにばらして)
単位で表示させようとしています・・・
そこで質問です
この時、ソ-ス/イベント指定はどのようにすればいいのでしょうか?
そもそも、StringGridのOnSelectCellイベントを使おうとしているので
すが、そこからして正しい判断なのかで悩んでます
OnMouseUp? OnDblClick?・・・
相当初歩的な質問ですが、ご教授下さい
MSアクセスを使った事がないので、アクセスの設定は解りませんが・・・
テーブルを設定して、DBGridを配置します。
エディタを必要分(この例の場合4つ)配置します。
以下を入力します。
'フィールド名'のところにエディタに表示させたいフィールド名を入力します。
Tableをアクティブにします。
ストレンジグリッドをクリックすると、
エディタに選択されている行の各レコードが表示されます。
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
edit1.Text := table1.FieldByName('フィールド名1').AsString;
edit2.Text := table1.FieldByName('フィールド名2').AsString;
edit3.Text := table1.FieldByName('フィールド名3').AsString;
edit4.Text := table1.FieldByName('フィールド名4').AsString;
end;
ACCESS->dbGO->Datasorce->dbGridとします。
あとは、同じです。
DBGridを使用した方が便利だと思います。
DBGridのOnClickイベントに、
Edit1.Text := Table1.FieldbyName(Column.FieldName).AsString;
で取れると思う。
もうひとつですが、DBGrid, DBEdit を使用すれば、プログラム書かずに
多分やりたいことが実現できると思います。
皆さん御回答ありがとうございます、やはりDBGridの使用が一般的なんですね
又、DBGrid使用の場合にはOnClickイベントが正しいのですね、色々と参考に
なりました
※※※※※※※※※※※※
実は今回DBGridを選ばなかった理由に次の2つがありました
1:実は、DBGridを使用してみたら、何故か一覧表示で順番が、ACESS上の
デ−タ登録順(=主KEY番号)とは不同なんです
(主key番号で1⇒2⇒3⇒4ではなく、3⇒4⇒1⇒2と表示・・・何順なんだろう?)
※デ-タの作成順は主keyの番号順です
2:DBGrid上には表示したくない項目(例:ACCESSの主keyの番号)まで、
とにかくDB上の全部項目が表示されてしまう
※※※※※※※※※※※※
これが嫌で、StringGridに対し、SQLの中でOrder By句で昇順に並べて呼出、
表示したい項目だけ、各Cellにセットしてしていました・・・
・・・Delphiでも、やはりこういった事はDBGridで組むのが一般的で、応用が利くものなのでしょうか?
(DBGridに対して、2つの問題の解決をはかるべきなのでしょうか?)
宜しく御願い致します
DBGridの表示順を変えるには、TableのIndexFieldNames か IndexName
を設定すればできます。元々のAccessのテーブル側に二次インデックス
を作成する必要がある。
StringGridに表示する場合、データ件数が多い場合はどうしても時間が
かかってしまい、DBGridの方が断然に効率いいです。
StringGridはカスタマイズ出来て便利ですが、
慣れないとコード書くのが大変です。
自分はこれに大分苦しめられました。
データの挿入や削除でつじつまが合わなくなって、
テーブルとStringGridの内容が違ってしまったり。
小豚丸さんの言うとおりDBGridを使った方が凄く楽で早いと思います。
取り敢えずStringGridを使った場合のサンプルを書いてみました。
参考になれば幸いです。
procedure TForm1.Button1Click(Sender: TObject);
var
i1:integer;
s1:string;
begin
table1.DatabaseName := 'DBDEMOS';
table1.TableName := 'animals.dbf';
table1.Active := true;
StringGrid1.RowCount := 2;
i1 := 1; i2 := 1;
while 1 = 1 do begin
StringGrid1.Cells[1,i1] := table1.fieldbyname('name').asstring;
StringGrid1.Cells[2,i1] := table1.fieldbyname('size').asstring;
StringGrid1.Cells[3,i1] := table1.fieldbyname('weight').asstring;
StringGrid1.Cells[4,i1] := table1.fieldbyname('area').asstring;
i1 := i1 + 1;
s1 := table1.FieldByName('name').asstring;
table1.Next;
if table1.FieldByName('name').asstring = s1 then
exit;
StringGrid1.RowCount := StringGrid1.RowCount + 1;
end;
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
edit1.Text := StringGrid1.Cells[1,arow];
edit2.Text := StringGrid1.Cells[2,arow];
edit3.Text := StringGrid1.Cells[3,arow];
edit4.Text := StringGrid1.Cells[4,arow];
end;
追記です。
i1 := 1; i2 := 1;
↓
i1 := 1;
です。
すいません、ミスです。
i2は宣言してませんでした。
ちょっと書き方それぞれですが、
table1.DisableControls; //もし、DB系のコンポーネントを使用している場合、コンポーネントへの反映を一時的に止める。これをやるとスピード的に
かなり向上する。
try
Table1.First; //複雑なTable関連がある場合、Activeだけでは必ず一件目に指していると限らない、最初の一件目から最後まで処理する場合、Firstに
することを習慣にしたほうがいい。
While Not Table1.Eof do begin
//StringGridに入れる処理....
Table1.Next;
end;
finally
table1.EnableControls;//コンポーネントの反映を回復
end;
ご参考まで。
TADOTableを使うより、TADOQueryを使ってSQL文で抽出すれば、汎用的になります。Orderを指定したり、表示項目を指定するのも簡単です。
TDBGridを使う場合は、表示順はTDataset側で指定します。表示項目は、右ボタンで出てくるカラムエディターで指定できます。表示項目のタイトルも指定できます。
皆さん、ありがとうございます
まずは昨日、DBGridをフォ-ムに埋め込んで、CellClickイベントで
テストしてみました
⇒コレはいい感じでした
見栄を張って、DateTimePickerを日付欄に使用したのでDATE欄に
文字情報の日付を入れるのに苦戦してますが、後は表示項目の
指定は教えてもらったので、表示順の改良を試せば先が見えると
思ってます
もう一つ、StringGridのSelectCellイベントも今日・明日で試して
みます
検索の表示結果の練習もStringGridで行おうとしてまして、ご指摘
にもありましたが、TADOQueryを使ってSQL中にOrder句の指定を入
れてみたところ、こちらはStringGrid上で綺麗に昇順・降順に従い
表示ができました・・・SELECT句を使用すれば、絞り検索もStringGrid
上で表示できそうです
・・・ですが、「StringGridに表示する場合、データ件数が多い場合はど
うしても時間がかかってしまい、DBGridの方が断然に効率いいです」
とのご指摘もあり、テストレベルと実践/現実の間には色々と問題があ
りそうでため息もついてます
今回は練習なのでパフォ-マンスは重視しなくてもいいのですが、実用
性を求めるときには設計のハ−ドルは高くなりそうですね
先ずはStringGrid版も先に進めてみます
Accessのリストのようなイメージをお持ちでしたら、少し癖がありますがDBCtrlGridというのもあります。
これに、DBEditや、DBTextを並べれていけば、結構こったUIを作り込むことも可能です。
ご参考まで。
おかげさまで、DBGridでもStringGridのどちらでも目的が果たせました
ありがとうございました
練習プログラムによる、検索・登録・更新・削除の基本構成の勉強です
ので、最後に頂いた「DBCtrlGrid」コンポ-ネントについても明日から
挑戦してみます
ありがとうございました
ツイート | ![]() |