全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1165
推到 Plurk!
推到 Facebook!

TStringList 移除物件錯誤

尚未結案
GiGi
一般會員


發表:17
回覆:21
積分:7
註冊:2002-10-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-06 10:22:29 IP:220.134.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-06 11:27:06 IP:210.243.xxx.xxx 未訂閱
Dear GiGi:    試著改
if Count >= 1 then
  dec(Count);
試試 發表人 - jimmy_wei 於 2005/07/06 11:28:49
GiGi
一般會員


發表:17
回覆:21
積分:7
註冊:2002-10-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-06 17:51:24 IP:220.134.xxx.xxx 未訂閱
Dear jimmy_wei 感謝回應,但是我問題不是那個BUTTON的事件,而是所產生的PANEL中LABEL 的CLICK 事件裡的 Tmp.Objects[Tmp.IndexOf(TLabel(sender).Parent.Name)].Destroy; 此執行緒有時候會產生錯誤,有時候卻不會 感謝您的回應 再請幫忙指教 ~~~
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-06 20:04:57 IP:202.39.xxx.xxx 未訂閱
真的哩! 小弟試了一下, 的確會發生 AV 的錯誤 但也找不出是什麼錯誤?  --
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-07 09:53:03 IP:222.248.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-07 10:19:04 IP:61.222.xxx.xxx 未訂閱
改 如下: procedure TForm1.LabelClick(Sender: TObject); begin Tmp.Objects[Tmp.IndexOf(TLabel(sender).Parent.Name)].Free; Abort; end; 自己都把自己刪掉,當然Click事件再遞回時會發生錯誤。 加一個 Abort; 就好了。 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-07 16:18:34 IP:222.248.xxx.xxx 未訂閱
引言: 改 如下: procedure TForm1.LabelClick(Sender: TObject); begin Tmp.Objects[Tmp.IndexOf(TLabel(sender).Parent.Name)].Free; Abort; end; 自己都把自己刪掉,當然Click事件再遞回時會發生錯誤。 加一個 Abort; 就好了。 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
回答正確哦
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
系統時間:2024-05-20 2:31:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!