TStringList 移除物件錯誤 |
尚未結案
|
GiGi
一般會員 發表:17 回覆:21 積分:7 註冊:2002-10-19 發送簡訊給我 |
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls; type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
procedure LabelClick(Sender: TObject);
{ Private declarations }
public
Tmp:TStringList;
Count:integer;
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject);
begin
Tmp:=TStringList.Create;
Tmp.Sorted:=true;
Count:=0;
end; procedure TForm1.Button1Click(Sender: TObject);
var Tmplabel:TLabel;
TmpPanel:TPanel;
begin
Inc(Count);
TmpPanel:=TPanel.Create(self);
With TmpPanel do
begin
Top:= 50*Count;
Left:= 50*Count;
Height:=30;
parent:=self;
visible:=true;
Name:='A' IntToStr(Count);
Caption:='';
end;
TmpLabel:=TLabel.Create(TmpPanel);
with TmpLabel do
begin
Top:= 10;
Left:= 10;
Height:=10;
parent:=TmpPanel;
caption:=Name;
visible:=true;
OnClick:=LabelClick;
Name:='B' IntToStr(Count);
end;
Tmp.AddObject('A' IntToStr(Count),TmpPanel); end; procedure TForm1.Button2Click(Sender: TObject);
begin
dec(Count);
Tmp.Objects[Count].Destroy;
end; procedure TForm1.LabelClick(Sender: TObject);
begin
Tmp.Objects[Tmp.IndexOf(TLabel(sender).Parent.Name)].Destroy;
end; end. 以上程式是當使用者按了 add button 時候,會產生一個panel,panel 裡面有一個label,此label的onclick 指向TForm1.LabelClick
事件會執行,物件銷毀的動作,可是執行時,有時會產生錯誤,有時不會,錯誤訊息為 AV(Access Violation),小弟不知錯誤發生原因
煩請線上各位先進解惑 謝謝
|
jimmy_wei
高階會員 發表:9 回覆:176 積分:147 註冊:2003-08-28 發送簡訊給我 |
|
GiGi
一般會員 發表:17 回覆:21 積分:7 註冊:2002-10-19 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
引言: Dear jimmy_wei 感謝回應,但是我問題不是那個BUTTON的事件,而是所產生的PANEL中LABEL 的CLICK 事件裡的 Tmp.Objects[Tmp.IndexOf(TLabel(sender).Parent.Name)].Destroy; 此執行緒有時候會產生錯誤,有時候卻不會 感謝您的回應 再請幫忙指教 ~~~ procedure TTSForm1.FormCreate(Sender: TObject); begin Tmp := TStringList.Create; // Tmp.Sorted := true; Count := 0; end; procedure TTSForm1.Button1Click(Sender: TObject); var Tmplabel: TLabel; TmpPanel: TPanel; begin Inc(Count); TmpPanel := TPanel.Create(Application); with TmpPanel do begin parent := TSForm1; Top := 50 * Count; Left := 50 * Count; Height := 30; visible := true; Name := 'A' IntToStr(Count); Caption := ''; end; TmpLabel := TLabel.Create(Application); with TmpLabel do begin parent := TmpPanel; Top := 10; Left := 10; Height := 10; caption := Name; visible := true; OnClick := LabelClick; Name := 'B' IntToStr(Count); end; Tmp.AddObject('A' IntToStr(Count), TmpPanel); end; procedure TTSForm1.Button2Click(Sender: TObject); begin if Count = 0 then exit; dec(Count); Tmp.Objects[Count].Free; Tmp.Delete(Count); end; procedure TTSForm1.LabelClick(Sender: TObject); var i: integer; begin i := Tmp.IndexOf(TLabel(sender).Parent.Name); Tmp.Objects[i].Free; Tmp.Delete(i); //上面代碼都是可以正確執行的,但在退出這個過程時 //會提示出錯,我想是不是由於對應的這個OnClick事件 //已經在Tmp.Objects[i].Free;中給Free掉了的原故? end; end.發表人 - h@visli 於 2005/07/07 10:00:30
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
引言: 改 如下: procedure TForm1.LabelClick(Sender: TObject); begin Tmp.Objects[Tmp.IndexOf(TLabel(sender).Parent.Name)].Free; Abort; end; 自己都把自己刪掉,當然Click事件再遞回時會發生錯誤。 加一個 Abort; 就好了。 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~回答正確哦
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |