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

請問如何在兩個 form 上執行同一隻程式?

尚未結案
760729
一般會員


發表:32
回覆:51
積分:16
註冊:2004-09-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-19 16:02:44 IP:61.61.xxx.xxx 未訂閱
各位先進: 我現下執行程式在 form1 長成一個 treeview, 待完成後. 點選該 treeview 中的任一 node, 希望執行同一隻程式而在 form2 上長成所選 node 中資料的 treeview, 不知是否有此實例, 提供參考.
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-21 23:09:12 IP:61.64.xxx.xxx 未訂閱
在Form2(in Unit2.cpp)上放一個TTreeView(named TreeView1). 並在Form1.cpp #include "Unit2.h". 下圖為點下Form1上的第一個Node, 並將此Node(包含它的children)複製到Form2的TreeView
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------
// 複製一個Node, 包含它的Child.
//
//  參數:
//    1. DestTreeView: 目的TreeView
//    2. RootSrcNode: 要複製的Node
//    3. RootDestNode: 目的Node
void CopyNode(TTreeView* DestTreeView, TTreeNode* RootSrcNode, TTreeNode* RootDestNode)
{
  // 找到RootSrcNode第一個Child.
  TTreeNode* ChildNode = RootSrcNode->getFirstChild();
  while( ChildNode )
  {
    TTreeNode* Node;
    // RootDestNode加上這個Child
    Node = DestTreeView->Items->AddChild(RootDestNode, ChildNode->Text);
    // 複製這個Child Node的所有Children Nodes
    CopyNode(DestTreeView, ChildNode, Node);        // RootSrcNode下一個Child node.
    ChildNode = RootSrcNode->GetNextChild(ChildNode);
  }
}    // 實作 TreeView1的OnMouseDown 事件
void __fastcall TForm1::TreeView1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  TTreeNode* node;
  node = TreeView1->GetNodeAt(X, Y);
  if (node)
  {
    RECT rect;
    rect = node->DisplayRect(TRUE);
    // 判斷點下去的是否為一個Node.
    if ((X >= rect.left) && (Y >= rect.top) &&
        (X <= rect.right) && (Y <= rect.bottom))
    {
      TTreeNode* NewNode;
      // 複製點下去的那個Node
      NewNode = Form2->TreeView1->Items->Add(NULL, node->Text);
      // 複製該Node的所有Children.
      CopyNode(Form2->TreeView1, node, NewNode);
    }
  }
}
//---------------------------------------------------------------------------    
760729
一般會員


發表:32
回覆:51
積分:16
註冊:2004-09-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-24 09:28:37 IP:61.61.xxx.xxx 未訂閱
Zard 你好: 可能我沒述說清楚, 我的程式如圖一(form1上)當我鍵入 URL 後, 選擇搜尋會出現圖二(form2), 選擇 done 後, 開始在圖一的 treeview 成長, 待結束後, 點選圖一 treeview 上的任何 node, 希望產生如圖一及圖二的form 並且執行原程式而在新產生的form1上長出所選 node 的 treeview. 即只寫一支程式, 在原form1 及新的 form1 上長出不同的 treeview.    
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-29 21:21:41 IP:219.137.xxx.xxx 未訂閱
760729 您好:    如果您要由程式本身以傳送參數的方式來執行自己的話,有幾點您可以參考一下:    1. 在程式開頭處以下列方式來檢查是否有參數傳遞給自己:

if(ParamCount()>0){
    AnsiString argv=ParamStr(1);
    SHowMessage("我得到的第一個參數是:" argv);
}
ParamCount() 是傳入參數的數量,ParamStr(1) 就是傳入的第一個參數字串,您可以透過這個字串來做後後續的動作,以您的例子而言,可以將參數字串轉為數字,然後當做 TreeView 之 RootNode 的依據,然後依據該值來建立 TreeView 即可,當然啦~如果您傳入的參數不只一個,那就依據 ParamCount() 值來做個迴圈,比照辦理即可取得各個參數了。 2. 要加上參數來呼叫程式自身時:

AnsiString RunStr = ParamStr(0) " 123";
WinExec(RunStr.c_str(), SW_SHOWNORMAL);
上例中:ParamStr(0) 是指向程式本身,"123" 是虛擬的參數字樣,程式與參數之間要留有一個以上的空格,以您的例子而言,可以將點選的 node 值轉為字串後當作參數,如果參數不只一個,那就得在各個參數間都加上空格來分隔。 上述方式僅是重點提示,如果要要將其實用化,應該還要依據實際需求做些相關的設定與檢查,例如:是否要告知 TreeView 的資料來源 (以便建立新的 TreeView)、檢查呼叫程式的來源 (以便被誤叫,而產生錯誤)....等等的。
760729
一般會員


發表:32
回覆:51
積分:16
註冊:2004-09-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-30 20:18:50 IP:59.105.xxx.xxx 未訂閱
RedSnow 謝謝您的指導
系統時間:2024-05-12 12:04:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!