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

【動態Form】同一Procedure可否被二個外來的Form呼叫執行

尚未結案
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-04 21:12:20 IP:61.221.xxx.xxx 未訂閱
各位前輩,很不好意思~又來麻煩大家了…< > 希望前輩們能不吝賜教,非常感恩~< > 是這樣的…我的問題跟下面這篇我之前詢問過的問題大同小異, 就是動態視窗,其處理程序由一個單一的unit來執行: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38781 這一次,是又追加了一個Form3… 也就是我的元件有:Form1、Form2、Form3、unit1、unit2、unit3、unit4 而這個Form3的配置與Form2相同,有一個button, 其button內寫下這段:
procedure TForm3.Button1Click(Sender: TObject);
begin
   x:=1; --->已在public宣告過
   testForm.send(self); --->錯誤停在此「Incompatible types:TForm2,TForm3」
end;
而在unit4中(也就是處理showmessage的副程式)寫:
unit Unit4;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  unit2, unit3;
type
  Tunit04 = class(TObject)
  private
    { Private declarations }
  public
    procedure send(Form2:TForm2; Form3:TForm3);
    { Public declarations }
  end;
var
  testForm: Tunit04;
implementation
//uses unit2, unit3;
procedure Tunit04.send(Form2:TForm2; Form3:TForm3) ;
begin
   if Form2.x =1 then
   begin
     showmessage('test1');
     Form2.x:=0;
   end;
   if Form3.x =1 then
   begin
     showmessage('test2');
     Form3.x:=0;
   end;
end;
end.
是否是說同一個procedure底下,無法接受二種不同的TForm型態? 還是說我的Self需修改為什麼參數呢? 這是我上傳我有問題的程式↓ http://delphi.ktop.com.tw/topic.php?TOPIC_ID=40042 不好意思…又得麻煩各位前輩了…><|||||
hagar
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-04 22:09:48 IP:202.39.xxx.xxx 未訂閱
procedure send(Form2:TForm2; Form3:TForm3); // 第一個參數的型態是 TForm2, 第二個參數的型態是 TForm3
procedure TForm3.Button1Click(Sender: TObject);
begin
   // ...
   testForm.send(self); // 這裏只傳入了一個參數, 且型態為 TForm3, 正確是要傳入兩個參數, 且第一個參數型態為 TForm2, 第二個參數型態為 TForm3
end;
錯誤部份的 self 參數指的是 Form3, 其型態為 TForm3 而 send procedure 所要傳入的第一個參數型態為 TForm2 所以會有 TForm2 與 TForm3 型態不會的錯誤了. --- Everything I say is a lie. 發表人 - hagar 於 2003/11/04 22:13:24
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-05 09:26:09 IP:61.221.xxx.xxx 未訂閱
引言: procedure send(Form2:TForm2; Form3:TForm3); // 第一個參數的型態是 TForm2, 第二個參數的型態是 TForm3
procedure TForm3.Button1Click(Sender: TObject);
begin
   // ...
   testForm.send(self); // 這裏只傳入了一個參數, 且型態為 TForm3, 正確是要傳入兩個參數, 且第一個參數型態為 TForm2, 第二個參數型態為 TForm3
end;
-- Everything I say is a lie. 發表人 - hagar 於 2003/11/04 22:13:24
感謝hagar前輩的指引,原來是忽略了這個問題… 又學到一次經驗了~非常感激~^_^ 我將程式修正為: 【 class="code"> x:=1; testForm.send(self,nil); 【unitl3底下】
   x:=1;
   testForm.send(nil,Self) ;
已可順利的傳值至unit4做showmessage的處理, 但,仍發生一個問題… 其bug畫面如下: 當我進入menu->Form3,按下button時, 便會跑出這麼一個訊息… 是否是表示因為我的Form2尚未create出來, 所以,程式無法判別出Form2這個物件? 如果是在Form2底下按下button,它會成功跑出「test1」來, 但,也會跟著跳出那個錯誤訊息… 可否再請教前輩,這該如何解決或許修正呢? 不好意思~又麻煩前輩了~m(_ _)m
hagar
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-05 09:37:07 IP:202.39.xxx.xxx 未訂閱
testForm.send(self,nil);  此時您第一個參數傳入 nil, 所以在 if Form2.x = 1 這一行 就會發生 Access Violation 了 您可以先檢查 Form2 是否為 nil, 如:
if Form2 <> nil then
  if Form2.x = 1 then
    ...
--- Everything I say is a lie.
uuujjj
一般會員


發表:31
回覆:59
積分:18
註冊:2002-09-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-05 09:55:20 IP:61.221.xxx.xxx 未訂閱
引言: testForm.send(self,nil); 此時您第一個參數傳入 nil, 所以在 if Form2.x = 1 這一行 就會發生 Access Violation 了 您可以先檢查 Form2 是否為 nil, 如:
if Form2 <> nil then
  if Form2.x = 1 then
    ...
--- Everything I say is a lie.
實在是太感謝hagar前輩的指導了… :::^0^::: 我的問題總算是解決了~非常謝謝您這麼有效率的回答~ 動態Form傳值終於大致上瞭解其原理了, 會再繼續深入的鑽研的~十分感激 【修正unit4】
procedure Tunit04.send(Form2:TForm2 ;Form3:TForm3) ;
begin
  if Form2 <> nil then
  begin
   if Form2.x =1 then
   begin
     showmessage('test1');
     Form2.x:=0;
     exit;
   end;
  end;
  if Form3 <> nil then
  begin
   if Form3.x =1 then
   begin
     showmessage('test2');
     Form3.x:=0;
   end;
  end;
end;
【unitl2的button底下】
x:=1;
  testForm.send(self,nil);
【unitl3的button底下】
x:=1;
   testForm.send(nil,Self) ;
已可完全正常的相互處理其程序, 供有相同疑問的人做參考。 再次謝謝hagar前輩~
系統時間:2024-05-04 16:22:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!