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

三層式傳圖片介面

答題得分者是:wameng
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-18 17:52:15 IP:61.66.xxx.xxx 未訂閱
請教各位同好.... 我要在三層式 Aplication 那一層定義一個可以讓Client傳送圖片至Application的FUNCTION 或者叫方法.... 請問我要如何定義這個型態(態别)??
------
叔叔有練過,初學者不要學。
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-18 18:15:07 IP:203.204.xxx.xxx 未訂閱
引言: 請教各位同好.... 我要在三層式 Aplication 那一層定義一個可以讓Client傳送圖片至Application的FUNCTION 或者叫方法.... 請問我要如何定義這個型態(態?)??
我都是用OleVariant, 然後用ClientDataSet的Bolb欄位型態填資料, 再用ClientDataSet.Data傳. <iFrame src="http://www.coss.com.tw/jieshu/sign.htm" width=400 height=105 scolling="NO" border="0"></iFrame> 震江系統(股)公司: http://www.coss.com.tw/ 捷舒軟體設計坊: http://www.coss.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-18 18:16:38 IP:61.222.xxx.xxx 未訂閱
可以用IPicture。 IPicture 實際上是 OlePicture 的指針。 在 AXCtrls.pas 中提供了兩個函數 可以將 ActiveX 中的 OlePicture 和 TPicture 進行轉換工作。 procedure GetOlePicture(Picture: TPicture; var OlePicture: IPicture); procedure SetOlePicture(Picture: TPicture; OlePicture: IPictureDisp); 我再補充一點也可以用 Variant 型態。 由Client 先將圖片存為 Stream 再轉換為 OleVariant 傳送出去; Image1.Picture.Graphic.SaveToStream 發表人 - wameng 於 2004/10/18 18:28:23
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-18 23:45:21 IP:220.134.xxx.xxx 未訂閱
wameng桑.... 可是會出現沒有定義的訊息呢.... 我是否要uses 那一個unit 呢?? 請您賜教....^_^
------
叔叔有練過,初學者不要學。
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-18 23:52:52 IP:61.222.xxx.xxx 未訂閱
>可是會出現沒有定義的訊息呢.... 是哪一個部分呢!
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-19 09:14:14 IP:218.168.xxx.xxx 未訂閱
你可以參考這篇http://delphi.ktop.com.tw/topic.php?TOPIC_ID=52498 混心雜欲 棄修身~唉
------
唉~
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-19 11:59:02 IP:61.66.xxx.xxx 未訂閱
interface 我是訂出來了.... 請問可有實例參考???.....
------
叔叔有練過,初學者不要學。
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-19 12:21:55 IP:61.222.xxx.xxx 未訂閱
{ CLIENT } var P : IPictureDisp; begin GetOlePicture(Image1.Picture,P); //Application Server 自製事件 APPSERVER.PicTest(P); end;
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-19 13:40:14 IP:61.66.xxx.xxx 未訂閱
wameng大大 可ipicture 不是一種interface 嗎??...並不是一種type 我已把 AXCtrls uses 進來了...還是會出現 ipicture 未定義..... 怎麼辦呢??... 須要我把圖傳上來嗎??
------
叔叔有練過,初學者不要學。
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-19 13:51:38 IP:61.222.xxx.xxx 未訂閱
請 USES AXCtrls,Activex;
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-10-19 13:55:37 IP:61.66.xxx.xxx 未訂閱
引言: 請 USES AXCtrls,Activex;
有的....我都有use 進來了
------
叔叔有練過,初學者不要學。
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-10-19 14:10:44 IP:61.222.xxx.xxx 未訂閱
出現什麼問題呢! 我試都沒問題啊!
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-10-19 14:18:48 IP:61.66.xxx.xxx 未訂閱
引言: 出現什麼問題呢! 我試都沒問題啊!
那我把我定義的傳上來(Ap & Client) 請稍候~~^_^
------
叔叔有練過,初學者不要學。
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-10-19 14:23:31 IP:61.66.xxx.xxx 未訂閱
如圖片(ap 和 client 我都傳了)
------
叔叔有練過,初學者不要學。
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-10-19 14:39:31 IP:61.222.xxx.xxx 未訂閱
是 IPicture 吧!
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-10-19 14:57:38 IP:61.66.xxx.xxx 未訂閱
引言: 是 IPicture 吧!
還是不行.... 連傳都傳不出去.. 是不是....我的 SCComm.AppServer ===> variant 並不是 olevariant ??? 方便的話.....這是我的msn chih_kuan@hotmail.com
------
叔叔有練過,初學者不要學。
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-10-19 15:02:17 IP:218.17.xxx.xxx 未訂閱
这种情况下,我通常喜欢用 BSTR。    不管是图片,还是其它BLOB的DATA,比如一个FILE,都是一串BINARY的数据。都可以放进字符串里,也就是BSTR里。    比如,可以这样写:    
var
  S:String;
  Mem:TMemoryStream;
  Pic:TPicture;
procedure
  Mem:=TMemoryStream.Create;
  try
    Pic.SaveToStream(Mem);
    SetLength(S,Mem.Size);
    Mem.Read(S[1],Mem.Size);
  finally
  end;
end;    当然,最后把这个S作为接口函数的结果传给客户端。客户端反过来恢复就行了。    
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-10-19 15:12:33 IP:61.66.xxx.xxx 未訂閱
引言: 这种情况下,我通常喜欢用 BSTR。 不管是图片,还是其它BLOB的DATA,比如一个FILE,都是一串BINARY的数据。都可以放进字符串里,也就是BSTR里。 比如,可以这样写:
var
  S:String;
  Mem:TMemoryStream;
  Pic:TPicture;
procedure
  Mem:=TMemoryStream.Create;
  try
    Pic.SaveToStream(Mem);
    SetLength(S,Mem.Size);
    Mem.Read(S[1],Mem.Size);
  finally
  end;
end;    当然,最后把这个S作为接口函数的结果传给客户端。客户端反过来恢复就行了。    
呃...我現在就是用這種方式..... 但有些問題.... 況且..資料庫裡字串欄位的長度也有限制~~~ 所以我才想改採另一種方式
------
叔叔有練過,初學者不要學。
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#19 引用回覆 回覆 發表時間:2004-10-19 15:33:14 IP:61.66.xxx.xxx 未訂閱
由Client 先將圖片存為 Stream 再轉換為 OleVariant 傳送出去 ====>請問.....一個是class 一個是 type ... 我要如何轉呢??
------
叔叔有練過,初學者不要學。
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#20 引用回覆 回覆 發表時間:2004-10-19 17:46:31 IP:61.222.xxx.xxx 未訂閱
function MemoryStreamToOleVariant(Strm: TMemoryStream): OleVariant; var Data: PByteArray; begin Result := VarArrayCreate([0, Strm.Size - 1], varByte); Data := VarArrayLock(Result); try Strm.Position := 0; Strm.ReadBuffer(Data^, Strm.Size); finally VarArrayUnlock(Result); end; end; function OleVariantToMemoryStream(OV: OleVariant): TMemoryStream; var Data: PByteArray; Size: integer; begin Result := TMemoryStream.Create; try Size := VarArrayHighBound (OV, 1) - VarArrayLowBound(OV, 1) 1; Data := VarArrayLock(OV); try Result.Position := 0; Result.WriteBuffer(Data^, Size); finally VarArrayUnlock(OV); end; except Result.Free; Result := nil; end; end; {Cleint } var MemoryStream: TMemoryStream; BinaryData : OleVariant; begin MemoryStream := TMemoryStream.Create; try Image1.Picture.Graphic.SaveToStream(MemoryStream); BinaryData := MemoryStreamToOleVariant(MemoryStream); {呼叫APPSERVER 自訂 Method} APPSERVER.PICTEST(BinaryData); finally MemoryStream.Free; end; end; IPicture 也可以 Variant 也可以。
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#21 引用回覆 回覆 發表時間:2004-10-19 18:10:42 IP:61.66.xxx.xxx 未訂閱
wameng大大.....可以了... 我現在可以用olevariant 傳到ap端了.... 剩下的我可以自己把它用blob 存到server 去了... 但在此..在請教一個相關問題... 如果..我從ap端傳回到client ... 要如何把這串stream顯示在image上....???? 謝謝你....
------
叔叔有練過,初學者不要學。
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#22 引用回覆 回覆 發表時間:2004-10-19 18:30:45 IP:61.222.xxx.xxx 未訂閱
要引用回來,應該也是不難。 var BinaryData : OleVariant; Stream: TMemoryStream; begin {APPSERVER 自訂Method 回傳 OleVariant} BinaryData := APPSERVER.GetPicture; Stream := OleVariantToMemoryStream(BinaryData); Try Stream.Position := 0; Image1.Picture.Graphic.LoadFromStream(Stream); finally Stream.free; end; end;
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#23 引用回覆 回覆 發表時間:2004-10-20 09:27:37 IP:61.66.xxx.xxx 未訂閱
wameng大大........ 有問題了....在Run的時候會變這樣.... 請問是何原因呢??
------
叔叔有練過,初學者不要學。
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#24 引用回覆 回覆 發表時間:2004-10-20 14:10:18 IP:61.222.xxx.xxx 未訂閱
會發生 Access V..... 的問題。 主要因素為 Image2.Picture.Graphic 尚未建立類別。 若該圖片為 JPEG Jpeg :TJpegimage; begin Jpeg :=TJpegimage.Create; Try Jpeg.LoadFromStream(Stream); Image2.Picture.Assign(Jpeg); finally Jpeg.Free; end;
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#25 引用回覆 回覆 發表時間:2004-10-20 14:11:52 IP:61.222.xxx.xxx 未訂閱
貼全來好了! var BinaryData : OleVariant; Stream: TMemoryStream; Jpeg :TJpegimage; begin { Stream to Variant} Stream := TMemoryStream.Create; Try Image1.Picture.Graphic.SaveToStream(Stream); BinaryData := MemoryStreamToOleVariant(Stream); finally Stream.Free; end; { Varinat to Stream} Stream := OleVariantToMemoryStream(BinaryData); Try Stream.Position := 0; Jpeg :=TJpegimage.Create; Try Jpeg.LoadFromStream(Stream); Image2.Picture.Assign(Jpeg); finally Jpeg.Free; end; finally Stream.Free; end; end;
chih_kuan
中階會員


發表:38
回覆:82
積分:54
註冊:2003-02-20

發送簡訊給我
#26 引用回覆 回覆 發表時間:2004-10-20 15:07:11 IP:61.66.xxx.xxx 未訂閱
wameng....tks...... 都弄好了... 感謝你為我解決了延宕半年之久的問題... 謝謝....^_^
------
叔叔有練過,初學者不要學。
系統時間:2024-11-23 18:32:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!