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

有關MemoryStream的問題

答題得分者是:gemi0305
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-16 11:14:28 IP:61.220.xxx.xxx 未訂閱
在小弟先前的一個如何利用(TObject *Sender)來減少重複程式問題中,Justmade大哥提到: 1. 你可用從 (TClientSocket *Sender).Name 找出是幾號 或 2. 你可在 ClientSocketX.Tag 存放號數來分辦是幾號 找出合適的 MemoryStream 由於 MemoryStream 不是元件所以不能用 FindComponent 方法找出合適的,你可以用一個 Array 或 TList 來裝著這些 MemoryStream 的 Pointer, 在找到是幾號後使用 小弟嘗試將MemoryStream的位址放在array中,此部分程式碼如下: jpgStream1=new TMemoryStream; jpgStream2=new TMemoryStream; jpgStream3=new TMemoryStream; jpgStream4=new TMemoryStream; //以下部分我測試過是錯誤的,我的用意是想取出各stream的指標 jpg_pos[0] = jpgStream1; jpg_pos[1] = jpgStream2; jpg_pos[2] = jpgStream3; jpg_pos[3] = jpgStream4; 那麼請問大家,若我想讀寫第n號MemoryStream時該怎麼寫呢? 先謝謝大家啦! 發表人 - danielj 於 2003/07/16 11:19:57
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-16 11:32:14 IP:210.66.xxx.xxx 未訂閱
danielj你好, 一維array的方式,現在好像在bcb中比較少人用, 大家對一維好像都用List來存放, 可以試試看這樣寫: 宣告:   TList *jpg_pos = new TList;    加入:   jpg_pos->Add(jpgStream1);   jpg_pos->Add(jpgStream2);   jpg_pos->Add(jpgStream3);   jpg_pos->Add(jpgStream4);    要取其中第n茟:   jpg_pos->Items[n]; // 注意0為第一茟    讓你參考看看 剛剛那個
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-16 12:00:51 IP:61.220.xxx.xxx 未訂閱
多謝gemi0305的回應,最近受您幫助很多… 能否請您再多加一個寫MemoryStream的例子,譬如我想對第一個讀取jpg圖檔進來該怎麼寫呢? 再次感謝您!
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-16 13:05:38 IP:210.66.xxx.xxx 未訂閱
danielj你好, 你可以利用SaveToStream(); 和LoadFromStream(); 來對MemoryStream做存取, 可參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=22731    如果你想找MemoryStream更多的資料的話 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30852    如果到時真的沒頭緒,再來討論 國泰平安
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-16 13:51:33 IP:61.220.xxx.xxx 未訂閱
再次感謝gemi0305! 我從您的回覆中已經知道如何取到某個memorystream的指標,但是我還是不知道怎麼透過這個指標去讀寫某個MemoryStream jpgStream1=new TMemoryStream; jpgStream2=new TMemoryStream; jpgStream3=new TMemoryStream; jpgStream4=new TMemoryStream; TList *jpg_pos = new TList; jpg_pos->Add(jpgStream1); jpg_pos->Add(jpgStream2); jpg_pos->Add(jpgStream3); jpg_pos->Add(jpgStream4); 譬如說要讀圖進到jpgStream1,要怎麼利用jpg_pos[0]來達成呢? 也就是說,我想把原本用 if (jpg_num==1) jpgStream1->LoadFromFile("1.jpg"); else if (jpg_num==2) jpgStream2->LoadFromFile("1.jpg"); else if (jpg_num==3) jpgStream3->LoadFromFile("1.jpg"); else if (jpg_num==4) jpgStream4->LoadFromFile("1.jpg"); 以較簡潔方便的方式來取代 請gemi0305及各位高手們教一下,謝謝!
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-16 13:51:52 IP:61.220.xxx.xxx 未訂閱
再次感謝gemi0305! 我從您的回覆中已經知道如何取到某個memorystream的指標,但是我還是不知道怎麼透過這個指標去讀寫某個MemoryStream jpgStream1=new TMemoryStream; jpgStream2=new TMemoryStream; jpgStream3=new TMemoryStream; jpgStream4=new TMemoryStream; TList *jpg_pos = new TList; jpg_pos->Add(jpgStream1); jpg_pos->Add(jpgStream2); jpg_pos->Add(jpgStream3); jpg_pos->Add(jpgStream4); 譬如說要讀圖進到jpgStream1,要怎麼利用jpg_pos[0]來達成呢? 也就是說,我想把原本用 if (jpg_num==1) jpgStream1->LoadFromFile("1.jpg"); else if (jpg_num==2) jpgStream2->LoadFromFile("1.jpg"); else if (jpg_num==3) jpgStream3->LoadFromFile("1.jpg"); else if (jpg_num==4) jpgStream4->LoadFromFile("1.jpg"); 以較簡潔方便的方式來取代 請gemi0305及各位高手們教一下,謝謝!
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-16 16:08:36 IP:210.66.xxx.xxx 未訂閱
danielj你好, 為了要真正的解決你的問題, 可否向大家說明一下,你這程式的功用是什麼?    說不定大家會幫你想一個更適合的解決辨法, 人說殺雞焉用牛刀,也許你的問題不難,只是你的方法用不習慣 國泰平安
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-17 13:46:09 IP:61.220.xxx.xxx 未訂閱
多謝gemi0305的提醒,我現在就把程式的目的敘述一下: 我想要利用一個TreeView及一個ListView來構成有點像是電子相簿的東西,TreeView是用來顯示相簿目錄,譬如像: 我的相簿-- |-- 加入新目錄 |-- 結婚紀念 |-- 太平山出遊 |-- 墾丁出遊 當然一開始我的相簿是空的,必需選取TreeNode的 "加入新目錄" 這一項,此時希望在ListView那邊的畫面出現: 加入相片 加入相片組 加入相片摘要圖 然後再由雙擊加入" "去加入想要的東西,雙擊加入某項之後還需要跳出設定頁(我目前是用另一個Form來顯示),譬如說相片大小及相片拍攝日期、拍攝者等,等設定好了之後,此項目就被加入在TreeNode的第一層目錄,以後每選到這個目錄,ListView的視窗就要出現設定的圖片及內容,若是選到"加入目錄"則是出現ListView的加入項目。特別的是我想做到能由camera即時輸入影像,所以需要一些動態存取記憶體的方式,所以想利用MemoryStream,每個目錄對應一個MemoryStream,選到某一個項目,就要顯示出對應的圖片。 以上有點亂,大家如果看不懂我寫的再提出來問好了,先謝謝大家囉!
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-17 14:23:17 IP:210.66.xxx.xxx 未訂閱
danielj你好, 我對"能由camera即時輸入影像"感到很好奇, 這是什麼意思呢? 是說用
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-18 08:35:55 IP:61.220.xxx.xxx 未訂閱
是的,就是用pc camera(視訊用的那種)來取得照片…
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-07-18 08:40:09 IP:210.66.xxx.xxx 未訂閱
danielj你好, 這是前些天版上有人作的, 你可以參考看看哦
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-07-22 09:00:15 IP:61.220.xxx.xxx 未訂閱
感謝gemi0305您的再度回覆! 您提到的那個範例我已經看過,不過我還是想知道怎麼利用MemoryStream的標籤來做搜尋或引用。 比如說現在共有四個MemoryStream,各貼上0~3的標籤,我希望能夠在不同的情況下選到不同的標籤,進而很簡單地對應到相對的MemoryStream來寫入/讀出,小弟的問題不知大家能否看懂… 在此先感謝大家的回應!
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-07-22 21:32:17 IP:61.224.xxx.xxx 未訂閱
danielj你好, 小弟不才,因為平時很少把TMemoryStream拿來做影像的處理, 所以只會對bmp檔做,至於jpg檔的話,可能你要請教版上的前輩了說 我盡我所知的告訴你哦~ 以下範例: 請在 class="code"> //----------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //---------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TMemoryStream *jpgStream1; TMemoryStream *jpgStream2; TMemoryStream *jpgStream3; TMemoryStream *jpgStream4; TList *jpg_pos; //此綠色部份通常放在.h檔中 //-------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { jpgStream1=new TMemoryStream(); jpgStream2=new TMemoryStream(); jpgStream3=new TMemoryStream(); jpgStream4=new TMemoryStream(); jpg_pos = new TList; jpgStream1->LoadFromFile("c://1.bmp"); //載入至MemoryStream jpgStream2->LoadFromFile("c://2.bmp"); jpgStream3->LoadFromFile("c://3.bmp"); jpgStream4->LoadFromFile("c://4.bmp"); //要先將東西放入 MemoryStream之後,才可以存入List jpg_pos->Add(jpgStream1); //把MemoryStream分別存入List中 jpg_pos->Add(jpgStream2); jpg_pos->Add(jpgStream3); jpg_pos->Add(jpgStream4); Image1->Stretch=true; } //------------------------------------------------------ void __fastcall TForm1::Button1Click(TObject *Sender) { Image1->Picture->Bitmap->LoadFromStream((TStream*)jpg_pos->Items[StrToInt(Edit1->Text)]); } //-------------------------------------------------------------- //把List中的資料取出,但記得,要用(TStream*)來轉形, //我只想到Bitmap有提供Stream的功能,所以就先用這個當範例, //被牽就只好使用BMP檔了...> < 請不要介意,參考看看 國泰平安
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-07-23 09:09:13 IP:61.220.xxx.xxx 未訂閱
gemi0305謝謝您啦!您點出了重點,還特別留了一點給我自行設法,真是用心良苦!不過不才在下亂試竟也試出來了,修改過的程式碼如下,還請大家不吝指正,謝謝大家! //---------------------------------------------------------------------------    #include  #pragma hdrstop #include "Unit1.h" #include //<==這是版上高手教的,使用JPEG時要載入的標頭檔 //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { jpgStream1=new TMemoryStream(); jpgStream2=new TMemoryStream(); jpgStream3=new TMemoryStream(); jpgStream4=new TMemoryStream(); jpg_pos = new TList; jpgStream1->LoadFromFile("d:\\program\\avi_prod\\0000.jpg");//<<==改為載入JPEG jpgStream2->LoadFromFile("d:\\program\\avi_prod\\0001.jpg");//<<==改為載入JPEG jpgStream3->LoadFromFile("d:\\program\\avi_prod\\0002.jpg");//<<==改為載入JPEG jpgStream4->LoadFromFile("d:\\program\\avi_prod\\0003.jpg");//<<==改為載入JPEG //要先將東西放入 MemoryStream之後,才可以存入List jpg_pos->Add(jpgStream1); //把MemoryStream分別存入List中 jpg_pos->Add(jpgStream2); jpg_pos->Add(jpgStream3); jpg_pos->Add(jpgStream4); Image1->Stretch=true; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //此部分程式修改成下面的樣子 TJPEGImage *jpg = new TJPEGImage(); jpg->LoadFromStream((TStream*)jpg_pos->Items[StrToInt(Edit1->Text)]); Image1->Canvas->Draw(0,0,jpg); delete jpg;//<<移除動態新增的東西 } //--------------------------------------------------------------------------- 發表人 - danielj 於 2003/07/23 09:15:42 發表人 - danielj 於 2003/07/23 09:32:42 發表人 - danielj 於 2003/07/23 09:33:34
系統時間:2024-05-18 5:19:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!