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

又是TMemoryStream的问题

答題得分者是:lcsboy
bigdogchina
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-13 20:42:24 IP:211.162.xxx.xxx 未訂閱
我把最近大大们有关TMemoryStream的文章都看了,我还是愚昧,不清楚,请大家指点: 1. TMemorySteam中怎么控制要写入得变量,如果是想写入的是字符而不是字节呢,因为我看了一位大大的 void __fastcall TForm1::Button1Click(TObject *Sender) {         if(SaveDialog1->Execute())         {             TMemoryStream *msBuf = new TMemoryStream();              BYTE bBuf=0;             msBuf->Size=256;             for(int i=0; iSize; i ) //写入的是数字 { msBuf->Position=i; bBuf=i; msBuf->Write(&bBuf, 1); } msBuf->SaveToFile(SaveDialog1->FileName ".dat"); delete msBuf; } } 问题是我想写入的不是BYTE,而是字符,或者其他类型的值时,是不是要考虑该类型变量的大小呢?如果要,能不能给例子看看.谢谢了. 2还有可以通过Position来控制写入的位置,但是如果按照另一位大大的做法,在编译的时候不会出错,在执行的时候却会出错: void __fastcall TForm1::Button2Click(TObject *Sender) { char *pt; TMemoryStream *TMS; TMS=new TMemoryStream(); TMS->LoadFromFile("H:\\File.aaa"); //该File.aaa文件已经是创建了的 pt=(BYTE *)TMS->Memory; pt =50; *pt='A'; //错误就出在这里,编译器说是非法的访问 delete TMS; } 我真的有点傻眼了,不是说可以在自己希望的位置更改吗? 3还有lcsboy 版主的一个回答是不是有点问题,在http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30852 中,版主回答可以在元件中也使用,当时写的代码如下: TMemoryStream *TMS=new TMemoryStream(); ......... ......... Memo1->Lines->LoadFromStream(TMS); //可以用 RichEdit1->Lines->LoadFromStream(TMS); //可以用 Image1->Pictures->LoadFromStream(TMS); //好象应该是Picture,还有在这中间没有LoadFormSteam()这个函数,只有LoadFromFile()和LoadFromClipboardFormat()这两个函数,我的确没有找到大大说的那个函数,还有现在tms中的数据是给Memo1还是RechEdi1,或Image1用呢?如果是大家用,有什么办法把它们区分开来呢?(lcsboy大大,不要生气,我不是鸡蛋里挑骨头,实在是我找不到啊,请原谅新手的无知) 4.最后,能不能请大大们对TMemoryStram来个比较详细的总结,最好是成为大家学习的经验,让以后新手们不在发我这样幼稚的问题,让大家少走弯路,因为我发现有关TMemoryStream的问题被提出来的几率很高,谢谢大大们,求您了. 人生在勤,不索何获?
------
人生在勤,不索何获?
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-13 21:15:42 IP:211.76.xxx.xxx 未訂閱
所謂師父領進門, 修行在個人.    (1) 一般, 我在處理TMemoryStream都是以Byte的觀念來處理...因為可能有些東西是要一個個byte去比對或是作置換. 就像你在使用陣列時的關念是差不多的. 若是你陣列的處理一直想不通, 除了char還能不能用int, long 去處理的話, 那真的是有待加強自己指標的觀念了 ><" 一個word等於兩個byte 你可以參考以下的觀念:
TMemoryStream *msBuf = new TMemoryStream(); 
msBuf->Size=256;
WORD wBuf=0;
wBuf=(WORD *)msBuf->Memory;
for(int i=0; iSize; i =2) //
{
msBuf->Position=i;
wBuf=i;
msBuf->Write(&wBuf, 2);
}
msBuf->SaveToFile(SaveDialog1->FileName ".dat");
delete msBuf;    
(2) 看不出來那裡有問題, 而且我的BCB 5.0也可以compiler pass! (3) http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30852 , 看文章不要斷章取義, 請注意 神吧....所有元件的LoadFormStream和SaveToStream裡面放的就是TMemorStream, 只是裡面的data自己要處理好 概念: 你可以使用SaveToStream, 把他存到一塊memory, 至於裡面的data是什麼, 就看你要怎麼處理, 比如說bmp檔, 你可以自己scan出紅色, 把他改成綠色, 然後再LoadFromStream, 再update一次, 你就可以發現你的bmp檔偷偷的被你換掉顏色了. 若是字串, 也是差不多的原理, 只是這麼一大堆的資料, 是存放在你PC上的某一堆Memory! 我絕對不可能跟你保證任意時候你處理的TMemoryStream的第一個bytes會是0 or 0xFF. 我只能告訴你觀念. 寫程式, 不一定就是要拘泥於一種寫法....找出自己最適用的寫法是最重要. 不過偶爾聽聽別人怎麼寫也是很不錯的 發表人 -
系統時間:2024-06-29 22:28:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!