关于Access Violation问题,急需解决,望高手指点!!!!!

顽皮小子 2006-06-06 04:49:36
功能:
我从数据库中取得一组数据,然后插入ListView中,同时调用ListView_NewsAdvancedCustomDrawItem事件对ListView中的各条记录进行字体大小、颜色的修改。

问题:
我在运行程序进行以上操作时会不定期出现以下错误:
Project HRR.exe raised exception class EAccessViolation with message 'Access violation at address 004c72cf.Read of address 00c1c00'.Process stopped.Use Step or Run to continue.


望高手解决!

代码如下:
void __fastcall TForm_MainForm::ListView_NewsAdvancedCustomDrawItem(
TCustomListView *Sender, TListItem *Item, TCustomDrawState State,
TCustomDrawStage Stage, bool &DefaultDraw)
{
if (Item == NULL) return;

if (aa == 0) //未读:字体:加粗;
{
Sender->Canvas->Font->Style = TFontStyles()<< fsBold;
if (bb == 1) //重要:字体:红色;
{
Sender->Canvas->Font->Color = clRed;
cc = false;
}
else Sender->Canvas->Font->Color = clBlack; //普通:字体:黑色;
if (cc == true) Item->ImageIndex = 0;
else Item->ImageIndex = 2;
}
else //已读:字体:正常;
{
Sender->Canvas->Font->Style = TFontStyles();
if (bb == 1) //重要:字体:红色;
{
Sender->Canvas->Font->Color = clRed;
cc = false;
}
else Sender->Canvas->Font->Color = clBlack; //普通:字体:黑色;
if (cc == true) Item->ImageIndex = 1;
else Item->ImageIndex = 2;
}
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
for (ASQLQuery->First(); !ASQLQuery->Eof; ASQLQuery->Next())
{
TListItem *tempitem = new TListItem(ListView_News->Items);
tempitem->SubItems->Add(数据1);
tempitem->SubItems->Add(数据2);
tempitem->SubItems->Add(数据3);
tempitem->Data = 数据4;
ListView_News->Items->AddItem(tempitem);
}
}
...全文
1257 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
顽皮小子 2006-06-22
  • 打赏
  • 举报
回复
怎么没有人回答了呀,急呀,郁闷呀!
顽皮小子 2006-06-19
  • 打赏
  • 举报
回复
非常感谢你的关注,你说的DataIsOk是什么意思呀,还有就是“使用SQLite的C++封裝”可以详细说明一下吗

现在有一个问题是title不可能为空,全部都有数据
AnsiString __fastcall TForm_MainForm::Func_RFormatString(AnsiString unformatstring)
{
AnsiString formatstring = unformatstring;
formatstring = StringReplace(formatstring,"/////","'",TReplaceFlags()<<rfReplaceAll);
formatstring = StringReplace(formatstring,"&","&",TReplaceFlags()<<rfReplaceAll);
formatstring = StringReplace(formatstring,""","\"",TReplaceFlags()<<rfReplaceAll);
return formatstring;
}
顽皮小子 2006-06-19
  • 打赏
  • 举报
回复
希望继续关注
顽皮小子 2006-06-16
  • 打赏
  • 举报
回复
这个函数就是向listview中插入数据的函数,希望大家指点!
void __fastcall TForm_MainForm::Func_QueryNews(TTreeNode *querynode)
{
GData selectednodedata = GData(querynode->Data); //选择节点的DATA值
ListView_News->Items->Clear();
AnsiString querydatastring = "SELECT * FROM News WHERE ParentID = " + IntToStr(selectednodedata->ID) + " ORDER BY Title";

TASQLite3DB *ASQLDB = new TASQLite3DB(NULL); //创建数据库连接
//配置数据库连接信息
ASQLDB->DefaultDir = progresspathdefaultdir; //默认数据库所在路径
ASQLDB->DefaultExt = progresspathpostfix; //默认数据库后缀
ASQLDB->Database = progresspathdatabase; //默认数据库名称
ASQLDB->DriverDLL = progresspathlib; //默认dll
ASQLDB->Connected = true; //打开链接

TASQLite3Query *ASQLQuery = new TASQLite3Query(ASQLDB); //创建操作数据库控件
ASQLQuery->Connection = ASQLDB; //数据库链接

ASQLQuery->Close();
ASQLQuery->SQL->Clear();
ASQLQuery->SQL->Add(querydatastring);
ASQLQuery->Open();

for (ASQLQuery->First(); !ASQLQuery->Eof; ASQLQuery->Next())
{
int id = ASQLQuery->FieldByName("ID")->AsInteger;
AnsiString title = Func_RFormatString(ASQLQuery->FieldByName("Title")->AsString);
AnsiString link = Func_RFormatString(ASQLQuery->FieldByName("Link")->AsString);
AnsiString description = Func_RFormatString(ASQLQuery->FieldByName("Description")->AsString);
AnsiString pubdate = Func_RFormatString(ASQLQuery->FieldByName("PubDate")->AsString);
AnsiString author = Func_RFormatString(ASQLQuery->FieldByName("Author")->AsString);
int ifread = ASQLQuery->FieldByName("IFRead")->AsInteger;
int ifimportant = ASQLQuery->FieldByName("IFImportant")->AsInteger;

TListItem *tempitem = new TListItem(ListView_News->Items);
tempitem->SubItems->Add(title);
tempitem->SubItems->Add(pubdate);
tempitem->SubItems->Add(author);
//新闻项赋DATA值
NData selectednewsdata = new TNewsData; //选择新闻项的DATA值
selectednewsdata->ChannelID = selectednodedata->ID; //频道ID
selectednewsdata->ChannelName = selectednodedata->Name; //频道名称
selectednewsdata->NewsID = id;
selectednewsdata->NewsTitle = title;
selectednewsdata->NewsLink = link;
selectednewsdata->NewsDescript = description;
selectednewsdata->NewsPubDate = pubdate;
selectednewsdata->NewsAuthor = author;
selectednewsdata->IFRead = ifread;
selectednewsdata->IFImportant = ifimportant;
tempitem->Data = selectednewsdata;
ListView_News->Items->AddItem(tempitem);
}
delete ASQLQuery; //释放控件
delete ASQLDB; //释放控件
}
勉励前行 2006-06-16
  • 打赏
  • 举报
回复
沒用過Sqlite 3. , 檢查Func_RFormatString中有否對字段內容為空時進行處理

TASQLite3Query 也沒用過,不知道穩定性如何。
你可試著改改:
AnsiString title ;
if(!ASQLQuery->FieldByName("Title")->IsNull )
title = Func_RFormatString(ASQLQuery->FieldByName("Title")->AsString);

提醒一下,你是在ListView_NewsAdvancedCustomDrawItem事件中用到這些數據,得要注意檢查一下邏輯,即事件發生時,可能你並沒有初始化數據。DrawItem事件可是隨時可能發生的。
加上一句:if( DataIsOk == false ) return ;

看了下 SQLite 中文社區,如果你不用到dataset特性,不如使用SQLite的C++封裝,速度與可靠性均有保障。看了下Sqlite支持的數據類型,好象表中字符串的長度沒有被限制,如果是那樣,字符串長度你應該要限制,最好指定Field->Size ,
顽皮小子 2006-06-16
  • 打赏
  • 举报
回复
To:PPower(月亮光光,照地堂)
非常感谢你的帮助,可是我调试了这么长时间现在确实是发现一个奇怪的问题。

AnsiString title = Func_RFormatString(ASQLQuery->FieldByName("Title")->AsString);
AnsiString description = Func_RFormatString(ASQLQuery->FieldByName("Description")->AsString);

问题就出现在这2句代码上,现在我把数据库中的Title和Description字段中的内容长度限制在一个范围内(比如我只放2个汉字),然后再运行程序就一切OK。可是如果我不限制,运行的时候就会出现不定期出错的问题。  
数据库用的是Sqlite 3.
勉励前行 2006-06-16
  • 打赏
  • 举报
回复
需要加強檢查的地方:
1、
if(querynode == NULL) //檢查一下該值,不過從運行出錯提示看,應該不是這裡引起的
return ;
GData selectednodedata = GData(querynode->Data); //选择节点的DATA值
if(selectednodedata == NULL) //檢查返回值
throw Exception("Error Data of TreeNode "); //用異常,可以方便地將異常輸出到文件去
//在GData函數中檢查querynode->Data的合法性,一般作邊界檢查
#ifdef _DEBUG
assert(querynode->Data >= vector.begin() && querynode->Data < vector.end())
#endif

2、tempitem->Data = selectednewsdata;
賦值的地方不會出錯,但在使用tempitem->Data的地方同上加強檢查。

對於這種指針異常行為,只能采取排查的方法一一驗證,當然如果你找到你代碼中的邏輯錯誤就可以很好解決了。最後提醒一下:要懷疑編譯器或操作系統,也得要找出證據才懷疑。因為往往錯誤是因為自己的代碼錯了。

多加上這些測試代碼,你就可以從異常提示中知道產生錯誤的大概范圍,從而更快解決問題。
顽皮小子 2006-06-15
  • 打赏
  • 举报
回复
大家帮忙呀!
勉励前行 2006-06-15
  • 打赏
  • 举报
回复
'Access violation at address 004c72cf.Read of address 00c1c00'这类错误,一般为越界错误或使用了 .野指针,

一 使用未经初始化的指针.
可试着这样检查代码: 找出所有变量,看看哪个没有被初始化.,确保变量使用前被初始化.一般初始化为0 , 修改后然后再运行程序测试,如果程序出现 : at address 00000000.Read of address 00000ef ,(地址值在0x0000 - 0xffff 间)这说明使用了未经初始化的指针.这样就可找出是哪个变量被不适当地使用了.
二, 使用过期了的指针.
如果实例已经被析构,但还继续使用该内存就会出错.这类错误一般仅在被释放的内存被分配出去时才弹出AV地址错误提示, 检查这类错误要对使用指针的每一个事件进行检查.
你检查一下:
tempitem->Data = 数据4; //这里的数据
还有:是使用MDI窗口的化,注意一下在模式切换时 ListView 可能会重构其Items,如果你有做指针做链接,就得小心了.



单凭这些代码,帮不到你.只能泛泛而谈.
顽皮小子 2006-06-14
  • 打赏
  • 举报
回复
现在的问题是相同的代码有时出错,有时不出错,很没规律
顽皮小子 2006-06-12
  • 打赏
  • 举报
回复
非常感谢大家的支持,可是到目前为止问题还是没有解决,真是奇怪了,太郁闷了。
zyyoung 2006-06-12
  • 打赏
  • 举报
回复
代码跟踪调试以下,看出错在什么位置
顽皮小子 2006-06-09
  • 打赏
  • 举报
回复
实在是郁闷呀,有没有可能是CB6本身的问题呀
rainfall19831109 2006-06-09
  • 打赏
  • 举报
回复
大家都看过说是没什么问题的了
你都说试过逐步逐步检查试过都试不出问题
那可能就是代码是没问题的咯。。。

再看看是不是其他地方不对咯。。。例如IDE出问题了,OS出问题了等等。。。
顽皮小子 2006-06-09
  • 打赏
  • 举报
回复
怎么没有人回答了呀
stevenjscn 2006-06-09
  • 打赏
  • 举报
回复
可能出在添加ITEM上,
13661023811 2006-06-08
  • 打赏
  • 举报
回复
用EurekaLog吧,它解决这样的问题最拿手了,这是个专门的查错的,还不用写代码
顽皮小子 2006-06-08
  • 打赏
  • 举报
回复
TO:szcyx(翔翱长空)
这个我已经去掉试过了,错误仍然存在。实在是搞不清楚那里还会有问题呀。郁闷呀!!!
szcyx 2006-06-08
  • 打赏
  • 举报
回复
先把事件ListView_NewsAdvancedCustomDrawItem去掉,看还会不会出错。主要要找出是哪块代码出的问题。
顽皮小子 2006-06-08
  • 打赏
  • 举报
回复
TO:jone7319(舍我其谁)
ImageIndex是没有问题的。

我现在的问题是有时不会出现错误,有时就会出现错误,不定期出现没有什么规律,希望大家给指点一下。

已经两天了,怎么???????
加载更多回复(14)

13,825

社区成员

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

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