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

請問是否可將 PROJECT1.EXE 的 DataSet 給 PROJECT2.EXE 使用

尚未結案
ufjjc
一般會員


發表:18
回覆:47
積分:23
註冊:2002-05-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-05 23:58:15 IP:220.130.xxx.xxx 未訂閱
請問是否可將 PROJECT1.EXE 已建立 的 DataSet 或 DATASOURCE 連結的 資 料 TABLE/QUERY 給 PROJECT2.EXE 使用
Amanda_Chen
一般會員


發表:25
回覆:82
積分:21
註冊:2003-12-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-08 08:47:36 IP:61.165.xxx.xxx 未訂閱
您好!   想問一下是不是兩個不同的Project中兩個不同的表單的資料資訊傳遞呢?如果是這樣的話。如Project2的表單Form2(unit2)中有資料元素DataSet1,Project1的表單Form1(unit1)需要用DataSet1,則如下,以按鍵觸發引用為例,不知是否您想要的:

>     
        
ufjjc
一般會員


發表:18
回覆:47
積分:23
註冊:2002-05-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-09 23:27:48 IP:220.130.xxx.xxx 未訂閱
謝謝回應 不過 兩個 PROJECT 是不同的 EXE , 而不是同一 EXE,不同的 UNIT .    之前的 的寫法 如下 procedure TForm1.Button1Click(Sender: TObject); type PInteger = ^Integer; var Px,Py: PInteger; ps : string; begin //---------------------------------------------------------- // 將指標轉為字串 ,再將字串 轉為 指標 Px := ADDR( DataSource1.DataSet); ps := intTOSTR(PX^); Py := ptr( STRTOINT(PS) ); DBDataSet1.DataSet := Pointer(py); end
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-10 00:58:46 IP:203.67.xxx.xxx 未訂閱
不同的應用程式,不同的記憶區間,不能使用相同的指標 假如在程式一,指標指向一個字串或物件, 但在程式二時,相同指標不一定指向字串或物件。 學而時習之不亦樂乎!
ufjjc
一般會員


發表:18
回覆:47
積分:23
註冊:2002-05-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-10 09:52:53 IP:220.130.xxx.xxx 未訂閱
不同的應用程式,不同的記憶區間,不能使用相同的指標 假如在程式一,指標指向一個字串或物件, 但在程式二時,相同指標不一定指向字串或物件。 請問可有其他方法解決,謝謝
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-10 16:14:05 IP:211.162.xxx.xxx 未訂閱
ufjjc大大,您好! 打擾您一下,看看這個idea,看能否對您解決問題有所幫助: 通過使用映射文件在不同的>記憶體映射文件 主要將使用以下幾個> > ②打開映射文件:<> > ③映射到本進程中:<> > ④關閉映射文件:<> > 具體 class="code"> unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls; const WM_DATA = WM_USER 1024; type PShareMem = ^TShareMem; TShareMem = record Data: array[0..255] of char; end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; PShare: PShareMem; implementation {$R *.DFM} var HMapping: THandle; HMapMutex: THandle; const MAPFILESIZE = 1000; REQUEST_TIMEOUT = 1000; procedure OpenMap; begin {創建一個文件映射內核對象} HMapping := CreateFileMapping( $FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TShareMem), {這個文件映射物件的名字用於與其他進程共用該物件,} pchar('Map Name') ); if (hMapping = 0) then begin ShowMessage('不能創建記憶體映射文件'); Application.Terminate; exit; end; {將文件資料映射到進程的位址空間} {當創建了一個文件映射物件之後,仍然必須讓系統爲文件的資料保留 一個位址空間區域,並將文件的資料作爲映射到該區域的物理記憶體進行提交。 } PShare := PShareMem(MapViewOfFile(HMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0)); if PShare = nil then begin CloseHandle(HMapping); ShowMessage('Can''t View Memory Map'); Application.Terminate; exit; end; {既然我們通過pvFile得到了映象視圖的起始地址,那麽可以對視圖做一些操作了} end; procedure CloseMap; begin if PShare <> nil then {從進程的位址空間中撤銷文件資料的映象} UnMapViewOfFile(PShare); if HMapping <> 0 then CloseHandle(HMapping); end; function LockMap: Boolean; begin Result := true; {創建互斥物件} HMapMutex := CreateMutex(nil, false, pchar('MY MUTEX NAME GOES HERE')); if HMapMutex = 0 then begin ShowMessage('不能創建互斥物件'); Result := false; end else begin if WaitForSingleObject(HMapMutex, REQUEST_TIMEOUT) = WAIT_FAILED then begin ShowMessage('不能對互斥物件加鎖!'); Result := false; end end end; procedure UnlockMap; begin {關閉文件映射物件和文件物件} ReleaseMutex(HMapMutex); CloseHandle(HMapMutex); end; procedure TForm1.Button1Click(Sender: TObject); var str: pchar; begin str := pchar('簡單的共用記憶體的例子'); CopyMemory(@(pShare^.data), Str, Length(str)); {發送消息表明有資料} PostMessage(FindWindow(nil, 'MyForm'), WM_DATA, 1, 1) end; procedure TForm1.FormDestroy(Sender: TObject); begin UnlockMap; CloseMap; end; procedure TForm1.FormCreate(Sender: TObject); begin OpenMap; LockMap; end; end. 將Project2的caption='Myform',用於發送資料端的程式找到本程式,並通知本程式有關的消息 Project2的code如下

unit Unit2;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;    const
  WM_DATA = WM_USER   1024;
type
  PShareMem = ^TShareMem;
  TShareMem = record
    Data: array[0..255] of char;
  end;
  TMyForm = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure getShareInfo(var Msg: TMessage); message WM_DATA; {處理WM_DATA}
  end;    var
  MyForm: TMyForm;
  PShare: PShareMem;
  MapHandle: THandle;    implementation    {$R *.DFM}    procedure TMyForm.getShareInfo(var Msg: TMessage); {處理WM_DATA}
begin
  if msg.LParam=1 then {是我們設定的消息參數}
    Memo1.Text := PShare^.Data;
end;    procedure TMyForm.FormCreate(Sender: TObject);
begin
  MapHandle := OpenFileMapping(FILE_MAP_WRITE, {獲取完全訪問映射文件}
    False, {不可繼承的}
    pchar('Map Name')); {映射檔案名字}
  if MapHandle = 0 then
  begin
    ShowMessage('不能定位記憶體映射文件塊!');
    Halt;
  end;
  PShare := PShareMem(MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0));
  if PShare = nil then
  begin
    CloseHandle(MapHandle);
    ShowMessage('Can''t View Memory Map');
    Application.Terminate;
    exit;
  end;
  FillChar(PShare^, SizeOf(TShareMem), 0);
end;    procedure TMyForm.Button1Click(Sender: TObject);
begin
  CloseHandle(MapHandle);
  close;
end;    end.
先運行Project1,再運行Project2,然後單擊Project1的發送資料,就可以在Project2看到接受到的資料. 我也是一知半解,如有谬误,请多多指教! < class="code"> =============== 人生在勤,不索何获? =============== 發表人 - bigdogchina 於 2004/05/10 16:21:08
------
人生在勤,不索何获?
ufjjc
一般會員


發表:18
回覆:47
積分:23
註冊:2002-05-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-10 17:24:24 IP:220.130.xxx.xxx 未訂閱
非常感謝bigdogchina 與 其他前輩的解答
系統時間:2024-05-15 11:35:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!