關於傳位址呼叫副程式的問題 |
答題得分者是:jow
|
danielx2000
一般會員 發表:29 回覆:33 積分:22 註冊:2002-09-02 發送簡訊給我 |
請問各位
我在試副程式改以 傳位址呼叫的作法 可是在Add1,Add2,Add3 內放Listbox VCL 元件的話, 就會發生存取非法記憶體的錯誤, 我知道大概是stack 的問題 請問要如何改 [code delphi] unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TProc = procedure ; TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } procedure Add1(); procedure Add2(); procedure Add3(); procedure QueueAdd(p: Pointer ); public { Public declarations } end; var Form1: TForm1; str1: string; implementation {$R *.dfm} procedure TForm1.Add1; begin ListBox1.Items.Add('Add1'); //程式會死在這裡 end; procedure TForm1.Add2; begin ListBox1.Items.Add('Add2'); //程式會死在這裡 end; procedure TForm1.Add3; begin ListBox1.Items.Add('Add3'); //程式會死在這裡 end; procedure TForm1.Button1Click(Sender: TObject); begin QueueAdd( addr( TForm1.Add1 ) ); end; procedure TForm1.Button2Click(Sender: TObject); begin QueueAdd( addr( TForm1.Add2 ) ); end; procedure TForm1.Button3Click(Sender: TObject); begin QueueAdd( addr( TForm1.Add3 ) ); end; procedure TForm1.QueueAdd(p: Pointer); var Proc: TProc; begin Proc := p; //傳位址呼叫 proc; end; procedure TForm1.FormCreate(Sender: TObject); begin Listbox1.Items.Add('Start...'); end; end. [/code] |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
QueueAdd( addr( TForm1.Add2 ) ); ----> QueueAdd( addr( Form1.Add2 ) ); or QueueAdd( addr(Self.Add2 ) ); or
===================引 用 danielx2000 文 章=================== 請問各位 我在試副程式改以 傳位址呼叫的作法 可是在Add1,Add2,Add3 內放Listbox VCL 元件的話, 就會發生存取非法記憶體的錯誤, 我知道大概是stack 的問題 請問要如何改 [code delphi] unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TProc = procedure ; TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } procedure Add1(); procedure Add2(); procedure Add3(); procedure QueueAdd(p: Pointer ); public { Public declarations } end; var Form1: TForm1; str1: string; implementation {$R *.dfm} procedure TForm1.Add1; begin ListBox1.Items.Add('Add1'); //程式會死在這裡 end; procedure TForm1.Add2; begin ListBox1.Items.Add('Add2'); //程式會死在這裡 end; procedure TForm1.Add3; begin ListBox1.Items.Add('Add3'); //程式會死在這裡 end; procedure TForm1.Button1Click(Sender: TObject); begin QueueAdd( addr( TForm1.Add1 ) ); end; procedure TForm1.Button2Click(Sender: TObject); begin QueueAdd( addr( TForm1.Add2 ) ); end; procedure TForm1.Button3Click(Sender: TObject); begin QueueAdd( addr( TForm1.Add3 ) ); end; procedure TForm1.QueueAdd(p: Pointer); var Proc: TProc; begin Proc := p; //傳位址呼叫 proc; end; procedure TForm1.FormCreate(Sender: TObject); begin Listbox1.Items.Add('Start...'); end; end. [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |