線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2160
推到 Plurk!
推到 Facebook!

關於傳位址呼叫副程式的問題

答題得分者是:jow
danielx2000
一般會員


發表:29
回覆:33
積分:22
註冊:2002-09-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-03 16:35:43 IP:125.229.xxx.xxx 未訂閱
請問各位
我在試副程式改以 傳位址呼叫的作法
可是在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-03 18:17:49 IP:123.193.xxx.xxx 未訂閱
procedure TForm1.QueueAdd(p: TProc);
begin
if Assigned(p) then p;
end;
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-04 08:29:24 IP:59.120.xxx.xxx 訂閱

QueueAdd( addr( TForm1.Add2 ) ); ----> QueueAdd( addr( Form1.Add2 ) );

or QueueAdd( addr(Self.Add2 ) );

or


  1. TForm1 = class(TForm)
  2. .....
  3. .....
  4. private
  5. { Private declarations }
  6. .....
  7. class procedure Add2();



===================引 用 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]
系統時間:2024-04-26 20:21:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!