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

BCB to delphi 語法轉換問題

答題得分者是:careychen
showrain
一般會員


發表:2
回覆:6
積分:1
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-08-09 01:40:06 IP:218.162.xxx.xxx 訂閱
我是 Delphi 的新手,之前都是用 BCB。 最近有一個專案客戶要求要用 Delphi 來開發!!
請問ㄧ下!! 底下這行程式如何在 Delphi 上面實現!!
TChatForum *p=new TChatForum(FindWindow("ChatForum",NULL))
roviury
一般會員


發表:3
回覆:49
積分:15
註冊:2008-08-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-08-28 14:09:36 IP:203.186.xxx.xxx 訂閱
我不知道什麼是TCHATFORUM


[code delphi]
var p:TChatForum;
begin
p:=TChatForum.Create(); //new TChatForum(); 可能你不需要這行
p:=TChatForum(FindWindow("ChatForum",NULL));
end;
[/code]
你要這個嗎??
編輯記錄
roviury 重新編輯於 2008-08-28 14:10:13, 註解 錯字‧
roviury 重新編輯於 2008-08-28 14:34:23, 註解 無‧
roviury 重新編輯於 2008-08-28 14:35:58, 註解 無‧
showrain
一般會員


發表:2
回覆:6
積分:1
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-08-29 02:40:56 IP:218.170.xxx.xxx 訂閱
不好意思,我重新說明一下我的問題
我的程式有兩個 Form 定義如下

Form1 為 Main 也就是 Auto Create forms
Form2 為 Available forms (就是程式進後需自行 Create 的方式建立,並且在程式中是利用 showmodal 的方式顯示)

因為在 Form1 的程式成員中有定義一個 資料結構 MyRec (屬性為 MyRecord 請看程式碼中的定義),
而我要在 Form2 程式執行後 存取 Form1.MyRec.id 這一個資料成員
以往在 bcb 我只要利用以下方式直接存取 TForm1 的相關函式或資料成員
TForm1 *p=new TForm1 (FindWindow("Form1",NULL));
但是在delphi 中卻會引發記憶體存取違規的錯誤



第一個 Form1

[code delphi]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;


type
MyRecord=record
id:integer;
name:String;
end;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
MyRec:MyRecord;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
p:TForm2;
begin
p:=TForm2.Create(owner);
p.ShowModal;
p.Destroy;
end;
end.

[/code]
第二個 Form2

[code delphi]
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
var
p:TForm1;
begin
p:=TForm1(FindWindow('Form1',nil));
p.MyRec.id:=99; {<-- 在這裡就會出現存取違規}
p.Label1.Caption:='999999999999999999999';
end;

end.


[/code]
編輯記錄
showrain 重新編輯於 2008-08-29 02:42:27, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-08-29 08:57:54 IP:218.210.xxx.xxx 訂閱
[code delphi]
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
//var
// p:TForm1;
begin
// 直接把 P 改成 Form1
//p:=TForm1(FindWindow('Form1',nil));
Form1.MyRec.id:=99; {<-- 在這裡就會出現存取違規}
Form1.Label1.Caption:='999999999999999999999';
end;

end.


[/code]
------
價值的展現,來自於你用哪一個角度來看待它!!
showrain
一般會員


發表:2
回覆:6
積分:1
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-09-01 00:50:17 IP:218.162.xxx.xxx 訂閱
感謝 careychen 大大的回應
不過大大的方式小弟試過只有在 auto create form 的模式下可行
在動態創建的方式下好像無法存取 Form1 的資料成員
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-09-01 09:19:59 IP:218.210.xxx.xxx 訂閱
 哦~~,你是動態的呀~~,那有兩種方式,參考一下
方法一:
[code delphi]
procedure TForm2.Button1Click(Sender: TObject);
var p:TForm1;
begin
p:=TForm1.Create(Application);
Form1.MyRec.id:=99;
Form1.Label1.Caption:='999999999999999999999';
// 用完後 free
FreeAndNil(p);
end;
[/code]

方法二:
[code delphi]
procedure TForm2.Button1Click(Sender: TObject);
begin
with TForm1.Create(Application) do
try
MyRec.id:=99;
Label1.Caption:='999999999999999999999';
finally
Free; // 用完後 free
end;
end;
[/code]
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-09-01 09:21:21, 註解 無‧
showrain
一般會員


發表:2
回覆:6
積分:1
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-09-01 23:36:03 IP:218.162.xxx.xxx 訂閱
感謝 careychen 大大的耐心回應
不過我試過大大的兩種方式,程式是順利的執行過去了但是 form1 的 資料內容卻沒有改變
例如更改前 Label1 的內容和更改後的值都是一樣沒有變
是不是小弟有甚麼地方沒有注意到請大大指導一下


roviury
一般會員


發表:3
回覆:49
積分:15
註冊:2008-08-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-09-01 23:51:19 IP:203.186.xxx.xxx 訂閱
FINDWINDOW 是得到一個HWND
而不是一個POINTER

PS.上面提到的方法一 到底P有什麼用?? DELPHI中還可能會造成WARNING , 他還以為是FORM2中產FORM1

[code delphi]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
MyRecord=record
id:integer;
name:String;
end;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
MyRec:MyRecord;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
p:TForm2;
begin
p:=TForm2.Create(owner);
p.ShowModal;
showmessage(inttostr(MyRec.id));
p.Destroy;
end;
end.

[/code]


[code delphi]
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
Form1.MyRec.id:=99; {<-- 在這裡就會出現存取違規}
Form1.Label1.Caption:='999999999999999999999';
end;
end.


[/code]
編輯記錄
roviury 重新編輯於 2008-09-02 00:04:50, 註解 無‧
roviury 重新編輯於 2008-09-02 00:09:57, 註解 無‧
roviury 重新編輯於 2008-09-02 00:11:32, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-09-02 09:13:12 IP:218.210.xxx.xxx 訂閱
那就有點怪了,在我第一次回的時候,那個樣子

你用 Form1 Create 了 Form2 ,然後 Form2 去使用 form1 的資源,這樣是可行的

那我就不大懂你的問題是什麼了

底下附的是我依你上面的方式寫成的,他是可以 Run 的

48bc9575bd247_Projects.rar
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-09-02 09:23:51, 註解 無‧
roviury
一般會員


發表:3
回覆:49
積分:15
註冊:2008-08-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-09-02 13:53:39 IP:203.186.xxx.xxx 訂閱
不過大大的方式小弟試過只有在 auto create form 的模式下可行
在動態創建的方式下好像無法存取 Form1 的資料成員

這是DELPHI版本問題???
我也不明白

不過大大的方式小弟試過只有在 auto create form2 的模式下可行
在動態創建form2的方式下好像無法存取 Form2 的資料成員

還可以說通

===================引 用 careychen 文 章===================
那就有點怪了,在我第一次回的時候,那個樣子

你用 Form1 Create 了 Form2 ,然後 Form2 去使用 form1 的資源,這樣是可行的

那我就不大懂你的問題是什麼了

底下附的是我依你上面的方式寫成的,他是可以 Run 的

48bc9575bd247_Projects.rar
showrain
一般會員


發表:2
回覆:6
積分:1
註冊:2002-04-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-09-03 03:01:04 IP:218.162.xxx.xxx 訂閱
感謝各位大大 不辭辛勞為小弟解答!!
今天仔細檢查一下原來是小弟的程式碼寫錯了,不好意思!!造成各位大大的困擾!!
careychen 大大所提出 程式碼 方法一 是可行的!! 對各位先進說聲抱歉與致上十二萬分的歉意!
但是,小弟想再請教一個問題假如:

form1 auto create
form2 和 form3 是動態建立

而 form3 是由 form2程式碼中動態建立
from2 是由 form1 程式碼中動態建立
那請問一下 form3 是否也能夠依照 careychen 大大的方法一存取 form2 資料呢??

感謝各位先進的指導!!謝謝!!
編輯記錄
showrain 重新編輯於 2008-09-03 03:01:56, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-09-03 16:17:29 IP:218.210.xxx.xxx 訂閱
以下程式只有 Form1 是 Main Form ,其他是需要時才 Create

Form1 準備一個 Button , 一個 Label ,Form1 的程式如下 ( 只 Copy Implementation 以下的 )

[code delphi]
implementation
{$R *.dfm}
uses Unit2;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Application);
Form2.ShowModal;
FreeAndNil(Form2);
end;
[/code]


Form2 準備 二個 Button 、一個 Label
[code delphi]
implementation
{$R *.dfm}
uses Unit1, Unit3;
procedure TForm2.Button1Click(Sender: TObject);
begin
Form3 := TForm3.Create(Application);
Form3.ShowModal;
FreeAndNil(Form3);
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
Form1.Label1.Caption := 'Call From Form2';
Form1.MyRec.Id := 123;
end;
[/code]


Form3 準備一個 Button
[code delphi]
implementation
{$R *.dfm}
uses Unit2;
procedure TForm3.Button1Click(Sender: TObject);
begin
Form2.Label1.Caption := 'Call From Form3';
end;
[/code]
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-09-03 16:22:40, 註解 無‧
careychen 重新編輯於 2008-09-03 16:23:16, 註解 無‧
系統時間:2024-05-02 22:17:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!