非MainForm的FormCreate事件问题(50分)

  • 主题发起人 brook_qin
  • 开始时间
B

brook_qin

Unregistered / Unconfirmed
GUEST, unregistred user!
最近写了一个小东西,碰到这个问题一直解决不了,请帮一下忙(Delphi初学者)

我在非MainForm放入一个ListView,在FormCreate事件中对ListView1加入一些Item,总是报错,通过ListView1.Items.Count读出的也是0,即时我预先加入一些数据,请问如何解决?难道FormCteate事件发生时ListView1还没有被Create?
 
你做的是MDI风格的程序吗?
一般的,在窗口的OnCreate事件中可以给ListView赋值,估计问题出在其他地方。可以具体描述一下或者把代码贴出来看看。
 
在fromcreate时ListView可能还没有create
把代码放到FormShow或FormActivate中试试
 
不是MDI风格的,初学Delphi也不知道用什么词来形容,这个副窗体使用来设置程序的,就像About窗口一样,通过ShowModal来显示

这是FormCreate里的代码:
if FileExists(rssPath) then
begin
rssList := TStringList.Create;
rssList.LoadFromFile(rssPath);

for I:=0 to rssList.Count-1 do
DeleteItem(I, ListView1);

for I:=0 to rssList.Count-1 do
begin
if rssList.Strings <> '' then
CreateItem(rssList.Strings, ListView1);
end;

rssList.Free;
end;

To WoDing:
FormShow或FormActivate岂不是没显示一次都要执行一遍?这个还好解决,但是有一个线程执行时必须读他的内容,在没有FormShow或FormActivate之前还是会出问题
 
DeleteItem和CreateItem的内容?
 
不关这两个函数的事吧
AListView.AddItem(ACaption, nil);
AListView.Items.Delete(AIndex);
 
for I:=0 to rssList.Count-1 do
这句改为 for I := rssList.Count - 1 downto 0 do
DeleteItem(I, ListView1);

 
还是不行啊,问题好像就出在这里,注释掉Delete这一段后就不报错了
 
FormCreate执行时ShowMessage(IntToStr(ListView1.Items.Count));得到的结果是0。
ListView1里是有东西的...
 
---------------------------
Debugger Exception Notification
---------------------------
Project RssReader.exe raised exception class EAccessViolation with message 'Access violation at address 0044A75B in module 'Reader.exe'. Read of address 00000028'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
这是报错信息
 
ListView1.Clear;
 
是的,FormCteate事件发生时ListView1还没有被Create
 
问题根本就不是出在如何清空ListView,而是在FormCreate事件中无法操作ListView1
看这里:
rssList := TStringList.Create;
ShowMessage(IntToStr(ListView1.Items.Count))
//永远是0!!
for I:=0 to ListView1.Items.Count-1 do
begin
if ListView1.Items.Item.Caption <> '' then
rssList.Add(ListView1.Items.Item.Caption);
end;

rssList.SaveToFile(FrmMain.rssPath);
rssList.Free;

ListView1是有Item的,但是保存的文件却什么也没有
 
To:hardware007
有解决的办法吗?难道要在FormCreate里动态添加ListView才能解决?
 
根本就不是listview的问题的。我试过了,创建的窗体,OnCreate里面完全可以对ListView进行操作。
 
经过测试的代码:
procedure TForm1.FormCreate(Sender: TObject);
var
rssList:TStringList;
I:Integer;
lvi:TListItem;
begin
if FileExists('d:/temp.txt') then
begin
rssList := TStringList.Create;
rssList.LoadFromFile('d:/temp.txt');

ListView1.Clear;

for I:=0 to rssList.Count-1 do
begin
if rssList.Strings <> '' then
begin
lvi := ListView1.Items.Add;
lvi.Caption := rssList.Strings;
end;
end;

rssList.Free;
end;
end;
 
同意miaofeng
brook_qin:
删除不能这样用
for I:=0 to rssList.Count-1 do
DeleteItem(I, ListView1);
因为rssList.Count随之改变 i将出界
你可以倒过来删
for i :=rssList.Count-1 downto 0 do
DeleteItem(I, ListView1);
 
删除方法是笔误,谢谢各位。

解决方法找到,把ListView1的ShowColumnHeader设为True,ok,可以用了

真是晕啊,怎么还有这种事,算不算Bug!!??
 
多人接受答案了。
 
顶部