StringGrid上のセルをクリックして、その行の各項目を対応するTEDITコンポ-ネントに表示するには?

解決


Delphi初心者  2010-08-07 03:13:44  No: 38939

今、Delphiで初歩的な練習プログラムを組んでいます
基礎的な、登録・更新・削除・検索の練習です(DBとしてACCESSを利用)

まず現状ですが、登録内容をFORM上のStringGridに展開しています

ここで、StringGrid上に展開されている複数レコ-ドに対し、マウスで
クリックしたセルの行(レコ-ド特定)について、同じフォ−ム上にある
別のコンポ−ネント(TEDIT等)に項目(各セルごとにばらして)
単位で表示させようとしています・・・

そこで質問です

この時、ソ-ス/イベント指定はどのようにすればいいのでしょうか?
そもそも、StringGridのOnSelectCellイベントを使おうとしているので
すが、そこからして正しい判断なのかで悩んでます
OnMouseUp?  OnDblClick?・・・

相当初歩的な質問ですが、ご教授下さい


Delphi大好き  2010-08-07 07:10:12  No: 38940

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;


HOta  2010-08-07 07:59:33  No: 38941

ACCESS->dbGO->Datasorce->dbGridとします。
あとは、同じです。


小豚丸  2010-08-08 03:14:35  No: 38942

DBGridを使用した方が便利だと思います。
DBGridのOnClickイベントに、
Edit1.Text := Table1.FieldbyName(Column.FieldName).AsString;
で取れると思う。

もうひとつですが、DBGrid, DBEdit を使用すれば、プログラム書かずに
多分やりたいことが実現できると思います。


Delphi初心者  2010-08-09 21:01:18  No: 38943

皆さん御回答ありがとうございます、やはり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つの問題の解決をはかるべきなのでしょうか?)

宜しく御願い致します


小豚丸  2010-08-09 23:29:22  No: 38944

DBGridの表示順を変えるには、TableのIndexFieldNames か IndexName
を設定すればできます。元々のAccessのテーブル側に二次インデックス
を作成する必要がある。

StringGridに表示する場合、データ件数が多い場合はどうしても時間が
かかってしまい、DBGridの方が断然に効率いいです。


Delphi大好き  2010-08-10 04:03:15  No: 38945

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;


Delphi大好き  2010-08-10 04:14:31  No: 38946

追記です。

i1 := 1; i2 := 1;

i1 := 1;

です。
すいません、ミスです。
i2は宣言してませんでした。


小豚丸  2010-08-10 09:39:23  No: 38947

ちょっと書き方それぞれですが、

table1.DisableControls; //もし、DB系のコンポーネントを使用している場合、コンポーネントへの反映を一時的に止める。これをやるとスピード的に
かなり向上する。

try
  Table1.First; //複雑なTable関連がある場合、Activeだけでは必ず一件目に指していると限らない、最初の一件目から最後まで処理する場合、Firstに
することを習慣にしたほうがいい。

  While Not Table1.Eof do begin

    //StringGridに入れる処理....

    Table1.Next;
  end;
 

finally
  table1.EnableControls;//コンポーネントの反映を回復
end;

ご参考まで。


HOta  2010-08-10 18:35:58  No: 38948

TADOTableを使うより、TADOQueryを使ってSQL文で抽出すれば、汎用的になります。Orderを指定したり、表示項目を指定するのも簡単です。

TDBGridを使う場合は、表示順はTDataset側で指定します。表示項目は、右ボタンで出てくるカラムエディターで指定できます。表示項目のタイトルも指定できます。


Delphi初心者  2010-08-11 01:23:54  No: 38949

皆さん、ありがとうございます

まずは昨日、DBGridをフォ-ムに埋め込んで、CellClickイベントで
テストしてみました
⇒コレはいい感じでした
  見栄を張って、DateTimePickerを日付欄に使用したのでDATE欄に
  文字情報の日付を入れるのに苦戦してますが、後は表示項目の
  指定は教えてもらったので、表示順の改良を試せば先が見えると
  思ってます

もう一つ、StringGridのSelectCellイベントも今日・明日で試して
みます

検索の表示結果の練習もStringGridで行おうとしてまして、ご指摘
にもありましたが、TADOQueryを使ってSQL中にOrder句の指定を入
れてみたところ、こちらはStringGrid上で綺麗に昇順・降順に従い
表示ができました・・・SELECT句を使用すれば、絞り検索もStringGrid
上で表示できそうです

・・・ですが、「StringGridに表示する場合、データ件数が多い場合はど
うしても時間がかかってしまい、DBGridの方が断然に効率いいです」
とのご指摘もあり、テストレベルと実践/現実の間には色々と問題があ
りそうでため息もついてます

今回は練習なのでパフォ-マンスは重視しなくてもいいのですが、実用
性を求めるときには設計のハ−ドルは高くなりそうですね

先ずはStringGrid版も先に進めてみます


あすパパ  2010-08-11 13:42:07  No: 38950

Accessのリストのようなイメージをお持ちでしたら、少し癖がありますがDBCtrlGridというのもあります。
これに、DBEditや、DBTextを並べれていけば、結構こったUIを作り込むことも可能です。

ご参考まで。


Delphi初心者  2010-08-12 21:19:54  No: 38951

おかげさまで、DBGridでもStringGridのどちらでも目的が果たせました
ありがとうございました

練習プログラムによる、検索・登録・更新・削除の基本構成の勉強です
ので、最後に頂いた「DBCtrlGrid」コンポ-ネントについても明日から
挑戦してみます

ありがとうございました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加