关于两个窗体调用的问题,我用一个窗体的按钮操作另一个窗体的ADOQuery1为什么总抱地址错误?

lurel 2004-06-07 03:37:04
我在一个窗体中加入了一个ADOQuery1,然后open(),在另一个窗体中加入一个按钮来控制ado指针记录的移动使ADOQuery1->Next(),为什么运行程序后,点击这个按钮,就抱内存地址错误?怎么回事,请大侠们解决!!
...全文
179 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zszzm 2004-06-12
  • 打赏
  • 举报
回复
静态建立试试,应该可以的
free1949 2004-06-11
  • 打赏
  • 举报
回复
或者,你可以看看错误是不是和detailfrm的DB控件有关,即先删除DB控件,然后执行djcxfrm->ADOQuery1->next()试试。
Behard 2004-06-11
  • 打赏
  • 举报
回复
detailfrm 用来干什么?

还有在 ADOQuery1->Next(); 前,请先判断 ADOQuery1->Bof 与 ADOQuery1->Eof;
Behard 2004-06-11
  • 打赏
  • 举报
回复
void __fastcall Tdjcxfrm::FormCreate(TObject *Sender)
{
detailfrm = new Tdetailfrm(this);

}
//---------------------------------------------------------------------------
void __fastcall Tdjcxfrm::DBGridEh1DblClick(TObject *Sender)
{
detailfrm->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall Tdjcxfrm::Button1Click(TObject *Sender)
{
ADOQuery1->Next();
}

???
我怎么没有看明白你的程序架构?
weill 2004-06-10
  • 打赏
  • 举报
回复
不好意思,本人好菜,这儿有点儿看不懂:

ADOQuery1->Parameters->Items[1]->Value=FormatDateTime("yyyy-mm-dd",DateTimePicker2->DateTime);
ADOQuery1->Open();

嘻……本人一般都使用标准的SQL语句去操作ADOQuery,楼主的这个代码让偶有点儿发晕。
weill 2004-06-10
  • 打赏
  • 举报
回复
应该不会出错,因为本人这一阵子正好在写一个SQL的数据库管理的程序,我的程序中没少用这种操作。

至于楼主的程序如果会出错,那么,存在以下几种可能。

1、ADOQuery1所在窗体没有被构建。
2、ADOQuery1不处在活动中。

另,楼主的代码中,ADOQuery1似乎是用于持行一个带参数的存储过程。
对于持行存储过程的ADOQuery1是否能使用Next,本人没试,建议你在单窗体中试试。如果在单窗体中能做到,在多窗体中应该也没问题。如果在单窗体中都不能,那么,就是ADOQuery1或是你的存储过程上的问题了(包知不应该这样用)。
yesry 2004-06-10
  • 打赏
  • 举报
回复
代码还是不完整。
lurel 2004-06-08
  • 打赏
  • 举报
回复
强烈建议大家回复以前自己试一下,不要说大家都知道的.
lurel 2004-06-08
  • 打赏
  • 举报
回复
在form2中放入按钮,然后click时间中写djcxfrm->ADOQuery1->next();在编译后,点击这个按钮就会抱错,在这里detail窗体中的个DB控件是显示djcxfrm当前记录值的,但就是不能使djcxfrm->ADOQuery1->next();一运行就会抱内存地址出错.
lurel 2004-06-08
  • 打赏
  • 举报
回复
我的确已经构建了,请看原码

Form1:djcx

//---------------------------------------------------------------------------

#ifndef djcx_cH
#define djcx_cH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "DBGridEh.hpp"
#include <ADODB.hpp>
#include <Buttons.hpp>
#include <ComCtrls.hpp>
#include <DB.hpp>
#include <ExtCtrls.hpp>
#include <Grids.hpp>
#include "detail_c.h"
//---------------------------------------------------------------------------
class Tdjcxfrm : public TForm
{
__published: // IDE-managed Components
TPanel *Panel1;
TLabel *Label1;
TShape *Shape1;
TDateTimePicker *DateTimePicker1;
TDateTimePicker *DateTimePicker2;
TBitBtn *BitBtn1;
TADOQuery *ADOQuery1;
TBCDField *ADOQuery1BD_ID;
TStringField *ADOQuery1KM_ID;
TStringField *ADOQuery1KM;
TStringField *ADOQuery1FBDWDM;
TStringField *ADOQuery1FBDW;
TStringField *ADOQuery1SBDWDM;
TStringField *ADOQuery1SBDW;
TStringField *ADOQuery1BZH_ID;
TStringField *ADOQuery1BZH;
TBCDField *ADOQuery1JE;
TStringField *ADOQuery1DX;
TStringField *ADOQuery1ZY;
TStringField *ADOQuery1LRR;
TStringField *ADOQuery1ZFBZ;
TDateTimeField *ADOQuery1RQ;
TDataSource *DataSource1;
TDBGridEh *DBGridEh1;
void __fastcall BitBtn1Click(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall DBGridEh1DblClick(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);

private: // User declarations
Tdetailfrm *detailfrm; //在这里声明detail
public: // User declarations
__fastcall Tdjcxfrm(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE Tdjcxfrm *djcxfrm;
//---------------------------------------------------------------------------
#endif









//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "djcx_c.h"
#include "dm.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "DBGridEh"
#pragma resource "*.dfm"
Tdjcxfrm *djcxfrm;
//---------------------------------------------------------------------------
__fastcall Tdjcxfrm::Tdjcxfrm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall Tdjcxfrm::BitBtn1Click(TObject *Sender)
{
ADOQuery1->Close();
ADOQuery1->Parameters->Items[0]->Value=FormatDateTime("yyyy-mm-dd",DateTimePicker1->DateTime);
ADOQuery1->Parameters->Items[1]->Value=FormatDateTime("yyyy-mm-dd",DateTimePicker2->DateTime);
ADOQuery1->Open();
}
//---------------------------------------------------------------------------
void __fastcall Tdjcxfrm::FormCreate(TObject *Sender)
{
detailfrm = new Tdetailfrm(this);

}
//---------------------------------------------------------------------------
void __fastcall Tdjcxfrm::DBGridEh1DblClick(TObject *Sender)
{
detailfrm->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall Tdjcxfrm::Button1Click(TObject *Sender)
{
ADOQuery1->Next();
}
//---------------------------------------------------------------------------








Form2:detail


//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "detail_c.h"
#include "djcx_c.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tdetailfrm *detailfrm;
//---------------------------------------------------------------------------
__fastcall Tdetailfrm::Tdetailfrm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
guanshangming 2004-06-07
  • 打赏
  • 举报
回复
你需要确定包含ADOQuery的窗口是否已经构建了实例,如果你调用该窗口时该窗口并没有构建,就会发生以上情况。

建议建立一个DataModule来包含所有的Table,Query和DataSource组件。然后,在所有窗口构建之前先构建DataModule模块。
robbyzi 2004-06-07
  • 打赏
  • 举报
回复
Form1->ADOQuery1->Next();
Form1上的记录集指针将向后移

也许你的Form2也拉了一个ADOQuery的控件,而你现在想对Form1的ADOQuery进行操作,
但实际上却操作了Form2的,因此内存出错。。(猜测而已,呵)
jevin8011 2004-06-07
  • 打赏
  • 举报
回复
同意xjjxing的答案

例如有两个窗口 Form1和Form2

在 Unit1.cpp 中加入一行 #include "Unit2.h"
在 Unit2.cpp 中加入一行 #include "Unit1.h"

cn1->Connected=false;
String strPath;
strPath="D:\\work\\tools";
cn1->ConnectionString="FILE NAME="+strPath+"\\test.udl";
Qry1->Close();
Qry1->SQL->Clear();
Qry1->SQL->Add("select * from JulianDateTest");
Qry1->Open();
Form2->ShowModal();

当Form2 显示时,如果 Form2 窗体上有一个按钮:在按钮事件中加入

Form1->Qry1->Next();

Form1上的记录集指针将向后移
xjjxing 2004-06-07
  • 打赏
  • 举报
回复
Form2->ADOQery1->Next();

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧