三層式傳圖片介面 |
答題得分者是:wameng
|
chih_kuan
中階會員 發表:38 回覆:82 積分:54 註冊:2003-02-20 發送簡訊給我 |
|
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: 請教各位同好.... 我要在三層式 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 發送簡訊給我 |
可以用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 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
你可以參考這篇http://delphi.ktop.com.tw/topic.php?TOPIC_ID=52498 混心雜欲 棄修身~唉
------
唉~ |
chih_kuan
中階會員 發表:38 回覆:82 積分:54 註冊:2003-02-20 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
chih_kuan
中階會員 發表:38 回覆:82 積分:54 註冊:2003-02-20 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
chih_kuan
中階會員 發表:38 回覆:82 積分:54 註冊:2003-02-20 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
chih_kuan
中階會員 發表:38 回覆:82 積分:54 註冊:2003-02-20 發送簡訊給我 |
|
chih_kuan
中階會員 發表:38 回覆:82 積分:54 註冊:2003-02-20 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
chih_kuan
中階會員 發表:38 回覆:82 積分:54 註冊:2003-02-20 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
这种情况下,我通常喜欢用 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 發送簡訊給我 |
引言: 这种情况下,我通常喜欢用 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 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
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 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
要引用回來,應該也是不難。 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 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
貼全來好了! 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |