一个关于DBGrid的问题,请大家帮助(本来是300,结果选错了变100,问题解决另开帖加200) (100分)

  • 主题发起人 IamWLJ888
  • 开始时间
有几个大富翁提到用DBCtrlGrid,可是具体怎么用呢?DELPHI自带DEMO看过,不知所云。
 
dbctrlgrid由一组panel组成,用户只需要在左上角的一个panel中规划出一条纪录的样式,
其它纪录系统会自动复制。所以你可以在第一个panel上画得任意漂亮。
需要设置的属性:datasource、colcount、panelheight、panelwidth等属性;
然后在第一个panel上放dbedit等控件连接数据,其它的你可以试验一下就行了。
我第一次用dbctrlgrid时大约试验了十五分钟,然后就可以搞定了,相信你也能。
 
dbctrlgrid不如dbgrid直观。。
而且。。我的方法解决问题的直接答案
 
to zblue: 能否将您的方法说得详细一点呢?
to 枪手哈特: 您说的我试了,还是不错的。不过看样子TDBCTRLGRID是PANEL的集合,占资源比
DBGRID会更多些吧,另外,没有DBGRID那么灵活,比如:鼠标操作就不够方便,3D鼠的滚轮就不
能使用;当前的记录的位置怎么取得呢,等等。
不过对于单纯的显示数据还是达到要求。

我想还是通过对DBGrid或其他类DBGrid控件的扩展进行解决会更好点。

大家继续啊,月底如无更好方法就结帖。
 
呵呵,我今天专门做了测试,达到你说的要求,现在把我做的描述一下。
三个AdoTable,一个AdoConnection,两个DataSource,两个DBGrid,
(昨天我说的主要是没经过实践,所以有一些小情况没考虑到,思路是一样的)
测试连接的数据库是Access,里面建了三个表,分别对应与ADOTable1,ADOTable2,
ADOTable3,2和3是空记录的(如果你想采用这种做法,你可以用两个临时表
来代替,我为了尽快实现功能,没继续复杂下去)。
现在说重点,昨天没实践的时候说是在BeforeScroll事件里写代码,
这是不行的,要在AfterScroll事件里写才行。另外,一个问题,
因为DbGrid1向下(当然指最后一笔)移动时,DbGrid2第一笔自动去掉,
这会导致死循环,所以要加两个Boolean变量,当光标进入DbGrid1的时候
IsTable2 := True;另一个同理。我还是把代码贴出来给你参考吧。
---------------------只列主要部分,免得太长了-------------
procedure FormCreate(Sender: TObject);
procedure ADOTable3AfterScroll(DataSet: TDataSet);
procedure ADOTable2AfterScroll(DataSet: TDataSet);
procedure FormDestroy(Sender: TObject);
procedure DBGrid1Enter(Sender: TObject);
procedure DBGrid1Exit(Sender: TObject);
procedure DBGrid2Enter(Sender: TObject);
procedure DBGrid2Exit(Sender: TObject);
private
IsTable2, IsTable3: Boolean;
end;
-----------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOTable1.First;
while not ADOTable1.Eof then
begin
if ADOTable1.RecNo <= (ADOTable1.RecordCount div 2) then
ADOTable2.AppendRecord([ADOTable1.FieldByName('').AsString,
ADOTable1.FieldByName('').AsString])//看你有多少字段
else
ADOTable3.AppendRecord([ADOTable1.FieldByName('').AsString,
ADOTable1.FieldByName('').AsString]);
ADOTable1.Next;
end;
end;
procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
IsTable2 := True;
IsTable3 := False;
end;

procedure TForm1.DBGrid1Exit(Sender: TObject);
begin
IsTable2 := False;
end;

procedure TForm1.DBGrid2Enter(Sender: TObject);
begin
IsTable2 := False;
IsTable3 := True;
end;

procedure TForm1.DBGrid2Exit(Sender: TObject);
begin
IsTable2 := False;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ADOTable2.First;
while not ADOTable2.Eof do
ADOTable2.Delete;
if not ADOTable2.IsEmpty then
ADOTable2.Delete;
ADOTable3.First;
while not ADOTable3.Eof do
ADOTable3.Delete;
if not ADOTable3.IsEmpty then
ADOTable3.Delete;
end;
procedure TForm1.ADOTable3AfterScroll(DataSet: TDataSet);
begin
if IsTable3 then
if ADOTable3.Bof then
begin
ADOTable2.Last;
ADOTable3.InsertRecord([ADOTable2.FieldByName('').AsString,
ADOTable2.FieldByName('').AsString]);
ADOTable2.Delete;
end;
end;

procedure TForm1.ADOTable2AfterScroll(DataSet: TDataSet);
begin
if IsTable2 then
if ADOTable2.Eof then
begin
ADOTable3.First;
ADOTable2.InsertRecord([ADOTable3.FieldByName('').AsString,
ADOTable3.FieldByName('').AsString]);
ADOTable3.Delete;
end;
end;
//以上代码经过我的测试了,你先测一下吧,还有什么不满意的地方(如想建临时表
去做,那自己弄,hoho~~~~~~~)可以再探讨的嘛~~
 
TO Dragon_Sky: 首先谢谢您。我的要求您可能了解有点误,我指的是当表1指定的记录在DBGrid1
中的位置变动时,表2显示的记录也相应变动,同理表2变动时,表1也变动。
不过您的回答提示了我一点,似乎可考虑将要显示的记录作分段处理,然后利用您的方法进行,
虽然要建两个临时表,复杂了点,不过我还是去试试看。
 
呵呵,我这样的做法是表1在DBGrid1的最后一条记录往下移的时候,表2在DBGrid2
的第一条记录删掉并显示在表1的DBGrid1中,而表2的DBGrid最前面一条往上移的时候
表1的DBGrid1最后一条删掉并到表2中,因为你的第一篇文章中没有说明
是指定的记录,所以我没考虑按指定记录移动,不过你可以把指定记录
的前后分成两个表,那也就只是在FormCreate的时候这条语句
if ADOTable1.RecNo <= (ADOTable1.RecordCount div 2) then稍微改一下就可以了。
(当然,在FormCreate的时候把ADOTable1按某个字段排序下效果会更好)
 
各位,我对Dragon_Sky的代码作了一些改动,想必基本达到要求了。由于时间有限,还未对代码作
调试,请大家如有兴趣可以调试一下。

虽然用到两个临时表复杂点,不过有胜于无嘛,呵呵。

现公布如下:
请注意,我的DBGrid用的是TDBGridEh;

procedure FormCreate(Sender: TObject);
procedure ADOTable3AfterScroll(DataSet: TDataSet);
procedure ADOTable2AfterScroll(DataSet: TDataSet);
procedure FormDestroy(Sender: TObject);
procedure DBGrid1Enter(Sender: TObject);
procedure DBGrid1Exit(Sender: TObject);
procedure DBGrid2Enter(Sender: TObject);
procedure DBGrid2Exit(Sender: TObject);
private
IsTable2, IsTable3: Boolean;
FirstRecNo, LastRecNo: Integer;
end;
-----------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
var
MyRecNo: Integer;
begin
ADOTable1.First;
MyRecNo := 1;
FirstRecNo := 1;
LastRecNo := DbGrid1.DataRowCount + DbGrid2.DataRowCount + 1;
while MyRecNo<LastRecNo then
begin
if ADOTable1.RecNo <= DbGird1.DataRowCount then
ADOTable2.AppendRecord([ADOTable1.FieldByName('').AsString,
ADOTable1.FieldByName('').AsString])//看你有多少字段
else
ADOTable3.AppendRecord([ADOTable1.FieldByName('').AsString,
ADOTable1.FieldByName('').AsString]);
ADOTable1.Next;
end;
end;

procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
IsTable2 := True;
IsTable3 := False;
end;

procedure TForm1.DBGrid1Exit(Sender: TObject);
begin
IsTable2 := False;
end;

procedure TForm1.DBGrid2Enter(Sender: TObject);
begin
IsTable2 := False;
IsTable3 := True;
end;

procedure TForm1.DBGrid2Exit(Sender: TObject);
begin
IsTable2 := False;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ADOTable2.First;
while not ADOTable2.Eof do
ADOTable2.Delete;
if not ADOTable2.IsEmpty then
ADOTable2.Delete;
ADOTable3.First;
while not ADOTable3.Eof do
ADOTable3.Delete;
if not ADOTable3.IsEmpty then
ADOTable3.Delete;
end;

procedure TForm1.ADOTable3AfterScroll(DataSet: TDataSet);
begin
if IsTable3 then
begin
if ADOTable3.Bof then
begin
ADOTable2.Last;
ADOTable3.InsertRecord([ADOTable2.FieldByName('').AsString,
ADOTable2.FieldByName('').AsString]);
ADOTable2.Delete;
DbGrid1.Sefocus;
end;
if (ADOTable3.Eof) and (ADOTable1.Eof=False) then
begin
ADOTable2.First;
ADOTable2.Delete;
ADOTable3.First;
ADOTable2.AppendRecord([ADOTable3.FieldByName('').AsString,
ADOTable3.FieldByName('').AsString]);
LastRecNo := LastRecNo + 1;
ADOTable1.RecNo := LastRecNo;
ADOTable3.AppendRecord([ADOTable1.FieldByName('').AsString,
ADOTable1.FieldByName('').AsString]);
ADOTable3.Last;
DbGrid2.Sefocus;
FirstRecNo := FirstRecNo + 1;
end;
end;
end;

procedure TForm1.ADOTable2AfterScroll(DataSet: TDataSet);
begin
if IsTable2 then
begin
if ADOTable2.Eof then
begin
ADOTable3.First;
ADOTable2.InsertRecord([ADOTable3.FieldByName('').AsString,
ADOTable3.FieldByName('').AsString]);
ADOTable3.Delete;
DbGrid2.Setfocus;
end;
if (ADOTable2.Bof) and (ADOTable1.RecNo>0) then
begin
FirstRecNo := FirstRecNo - 1;
ADOTable1.RecNo := FirstRecNo;
ADOTable2.InsertRecord([ADOTable1.FieldByName('').AsString,
ADOTable1.FieldByName('').AsString]);
ADOTable2.Last;
ADOTable3.InsertRecord([ADOTable2.FieldByName('').AsString,
ADOTable2.FieldByName('').AsString]);
ADOTable2.Delete;
ADOTable3.Last;
ADOTable3.Delete;
LastRecNo := LastRecNo - 1;
DbGrid1.Sefocus;
ADOTable2.First;
end;
end;
end;
 
多人接受答案了。
 
大家如有更好的方法可到http://www.delphibbs.com/delphibbs/dispq.asp?lid=1537930继续讨论。
另外请Dragon_Sky也到上面地址的新帖领分。
 
顶部