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

【如何將純文字檔TEXT含在Res,且取得不暫存在硬碟】

答題得分者是:pceyes
andyto202
一般會員


發表:10
回覆:29
積分:7
註冊:2006-12-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-17 12:31:52 IP:122.116.xxx.xxx 訂閱
我講一下我的操作流程

[code delphi]
unit auto;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OleCtrls, SHDocVw, StdCtrls, Activex, Menus;

type
TForm1 = class(TForm)
B1: TButton;
WebBrowser1: TWebBrowser;
Label1: TLabel;
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure LoginUrl2(Ur2:String);
public
{ Public declarations }
end;

var
Form1: TForm1;
logon:Boolean;

implementation
var
AppPath:string;
{$R *.DFM}
procedure TForm1.LoginUrl2(Ur2:String);
var docs,edits:OleVariant;
begin
WebBrowser1.Navigate(Ur2);
end;

procedure TForm1.FormCreate(Sender: TObject);

begin
AppPath:=ExtractFilePath(Application.ExeName);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
LoginUrl2(apppath 'abc.htm');
end;

end.
[/code]

1.用記筆本加入 myhtm htm abc.htm 並存成 abc.rc
2.brcc32 abc.rc 並產生了 abc.res
3.在{$R *.DFM}之後加入了{$R abc.res}
請問這樣子後
我要如何將
procedure TForm1.Button1Click(Sender: TObject);
begin
LoginUrl2(apppath 'abc.htm');
end;

這段用res來取代呢

之前討論的

先生:
流程應該是這樣的:
1. 由res載入文件後(所以要你重新開新版嘛!")
我已經另外開版了^_^
2. 若照
pcslxl 大的做法,是基本做法,要save to file,再重新由硬碟載入HTM執行,這應該不是你要的,只要存到硬碟後,就算刪除,還是可以用軟體抓回來看帳號密碼的 ;另外RES是不能含入全文字檔TEXT的,要以stringtable方式存在的。
我要的是將htm殺掉也沒關係,只要exe帶著走,就可以用了
3. 應該要以TMemoryStream方式在程式內部取得文字檔。
這部份我聽的不是很懂說>_<
4. 之前PO給你的TextToWebBrowser(stream.text,WebBrowser1); 應該可以用了(已切合主題了),再將3取得的文字檔填入即可。
這個的確可以解決,不過好像是res好像比較正統(不過不知道是不是res檔要搭配exe檔才有用)
編輯記錄
andyto202 重新編輯於 2008-12-17 12:39:38, 註解 無‧
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-17 14:56:17 IP:122.118.xxx.xxx 訂閱
假設你的RC內容如下,你也會用BRC32編譯成myhtm.RES
請注意,你要標準的RC,困難在於它要用 " 全改成 OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object ListBox1: TListBox
Left = 16
Top = 16
Width = 105
Height = 401
ItemHeight = 13
TabOrder = 0
OnClick = ListBox1Click
end
object Memo1: TMemo
Left = 136
Top = 16
Width = 529
Height = 401
Lines.Strings = (
'Memo1')
TabOrder = 1
end
end

[/code]
ResourceLocalizer.pas
[code delphi]
unit ResourceLocalizer;
interface
uses Classes, Windows;
type
TResourceLocalizer = class
class procedure GetGroup(const Strings : TStrings);
class function GetOneString(const Offset, Position : integer) : string;
end;
implementation
const
MaxBuffer = 255;
{ TResourceLocalizer }
// 自stringtable取得群組名稱
class procedure TResourceLocalizer.GetGroup(const Strings : TStrings);
const
delta = 1000; // 移動間距
var
buffer : array[0..MaxBuffer] of char;
ls : integer;
position : integer;
begin
position := delta;
Strings.Clear;
ls := LoadString(hInstance, position, buffer, sizeof(buffer));
while ls <> 0 do
begin
Strings.AddObject(buffer, TObject(position));
position := position delta;
ls := LoadString(hInstance, position, buffer, sizeof(buffer));
end;
end;
// 僅能取得單一字串
// TResourceLocalizer.GetString(2000,1); 表示取得 2001單一字串
class function TResourceLocalizer.GetOneString(const Offset, Position: integer) : string;
var
buffer : array[0..MaxBuffer] of char;
ls : integer;
begin
Result := '';
ls := LoadString(hInstance, Offset Position, buffer, sizeof(buffer));
if ls <> 0 then
begin
Result := buffer;
end;
end;
end.
[/code]
------
努力會更接近成功
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-17 16:43:46 IP:60.248.xxx.xxx 訂閱
※注意此方法即與前一篇 pcslxl 所說的一樣!!! 此方法才是您需要的正解!

1、將您打的 htm 存好,例如叫 myHtm.html

2、編輯一個檔案叫 myHtm.rc 裡面打上 如下的內容
htm Media 檔案路徑
※※※ 注意,路徑的地方,請不要有空白,不要有中文,一個斜線要打兩個斜線
例:
如果放在 D:\Test\Htm 的路徑下
則要打成
htm Media D:\\Test\\Htm\\myHtm.html

補充:
如果有多個檔案的話,那就可以寫成
htm1 Media 檔案路徑
htm2 Media 檔案路徑
htm3 .....
:
:

3、執行 brcc32 myHtm.rc 後就會跑出一個 myHtm.res 的檔案

之後程式如下面這樣寫 (先 Copy 您的)

[code delphi]
unit auto;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OleCtrls, SHDocVw, StdCtrls, Activex, Menus;

type
TForm1 = class(TForm)
B1: TButton;
WebBrowser1: TWebBrowser;
Label1: TLabel;
ListBox1: TListBox;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure LoginUrl2(Ur2:String);
public
{ Public declarations }
end;

var
Form1: TForm1;
logon:Boolean;

implementation

var
AppPath:string;

{$R *.DFM}
{$R myHtm.res}

procedure TForm1.LoginUrl2(Ur2:String);
var docs,edits:OleVariant;
begin
WebBrowser1.Navigate(Ur2);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
AppPath := ExtractFilePath(Application.ExeName);
end;

procedure TForm1.Button1Click(Sender: TObject);
var sFilename: String;
begin
sFilename := 'abc.htm';
with TResourceStream.Create(HInstance, 'htm', 'Media') do
try
try
SaveToFile(AppPath sFilename );
LoginUrl2(AppPath sFilename);
DeleteFile(AppPath sFilename);
except
end;
finally
Free;
end;
end;

end.
[/code]
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-12-17 16:49:10, 註解 無‧
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-17 18:18:12 IP:220.141.xxx.xxx 訂閱
感謝 careychen 指正!
他的方法確實是簡單明瞭,我上面的方法也是可以用(那是為了多國語言改的),但仍不算正解,
不過我仍然堅持不要刪除的做法,用MemoryStream的方式轉成TextToWebBrowser
顯示,參考一下吧!
敬待 careychen 大大再次指正。
[code delphi]
unit unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, MSHTML,ActiveX, SHDocVw;


type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Label1: TLabel;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
logon:Boolean;

implementation

var
AppPath:string;

{$R *.DFM}
{$R myHtm.res}


procedure TextToWebBrowser(ASrc: string; AWebBrowser: TWebBrowser);
var
vv: Variant;
HTMLDocument: IHTMLDocument2;
begin
vv := VarArrayCreate([0,0],varVariant);
vv[0] := ASrc;
HTMLDocument := AWebBrowser.Document as IHTMLDocument2;
HTML(pSafearray(TVarData(vv).VArray));
HTMLDocument.close;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
mystream : Tmemorystream;
s : string;
begin
with TResourceStream.Create(HInstance, 'htm', 'Media') do
try
try
mystream := TMemorystream.Create;
try
SaveToStream(mystream); // 存到memorystream
SetLength(S,mystream.Size); // 初設S字串的大小
mystream.Position:=0;
mystream.Read(S[1],mystream.Size);
Memo1.Lines.Add(S); // 將S讀入Memo1
TextToWebBrowser(memo1.Lines.Text,WebBrowser1); // 將字串直接讀入WebBrowser1
finally
mystream.free;
end;
except
end;
finally
Free;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
AppPath := ExtractFilePath(Application.ExeName);
webbrowser1.Navigate('about:blank');
end;

end.

[/code]
------
努力會更接近成功
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-17 18:33:32 IP:60.248.xxx.xxx 訂閱
不敢不敢,前輩您言重了,小弟覺得您上面的作法非常棒,小弟的回文只是依其需求回應
我要的是將htm殺掉也沒關係,只要exe帶著走,就可以用了

而小弟是比較希望發問者有空間自己去想想,不是把程式全部丟出去,讓發問者思考一下而已,
因為本篇的文其實在前一篇時有前輩已經提示了,所以希望發問者能自己再好好想一下。

===================引 用 pceyes 文 章===================
感謝 careychen 指正!
他的方法確實是簡單明瞭,我上面的方法也是可以用(那是為了多國語言改的),但仍不算正解,
不過我仍然堅持不要刪除的做法,用MemoryStream的方式轉成TextToWebBrowser
顯示,參考一下吧!
敬待 careychen 大大再次指正。
------
價值的展現,來自於你用哪一個角度來看待它!!
andyto202
一般會員


發表:10
回覆:29
積分:7
註冊:2006-12-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-17 19:33:56 IP:60.250.xxx.xxx 訂閱
您的方法確實可行,不過我雖然可以將exe帶著走,不過每當我執行完exe,htm會產生出來耶(就是之前的htm檔,感覺就好像winrar的自解壓縮一樣,雖然可以自動執行,但是必須解壓縮的感覺一樣)

===================引 用 careychen 文 章===================
不敢不敢,前輩您言重了,小弟覺得您上面的作法非常棒,小弟的回文只是依其需求回應
我要的是將htm殺掉也沒關係,只要exe帶著走,就可以用了

而小弟是比較希望發問者有空間自己去想想,不是把程式全部丟出去,讓發問者思考一下而已,
因為本篇的文其實在前一篇時有前輩已經提示了,所以希望發問者能自己再好好想一下。

===================引 用 pceyes 文 章===================
感謝 careychen 指正!
他的方法確實是簡單明瞭,我上面的方法也是可以用(那是為了多國語言改的),但仍不算正解,
不過我仍然堅持不要刪除的做法,用MemoryStream的方式轉成TextToWebBrowser
顯示,參考一下吧!
敬待 careychen 大大再次指正。
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-12-17 22:06:28 IP:220.141.xxx.xxx 訂閱
careychen 大,看了您的回文,真是受益良多,其實我也有疑問的,網上找資料,RC內容一般都是binary file如.cur , .bmp , .avi ,誏我誤以為RC沒有Text格式的,看到有Media時真是很驚呀,不知能否提供搜尋方向,看有沒有對照表,比如說 Media能容許的檔案格式有那些,我是有找到RecData可供容MP3的,真的很好玩。
我是認真過頭了,認為既然發問者要將有含帳號密碼的Html置入Exe,目的就是為了保密需要,刪除檔案再回復的軟體隨手找很多呢!帳號密碼一旦流出去就禍患無窮;最希望發問者一直往下問,感覺就像在寫專案一樣,以後要找資料的人,找到一篇可以提供許多思考方向,但又希望不要離題,真是令人難以取舍。
careychen 大,我很貪心的希望您可以再增加一篇Res含在Dll中調用的,應該還不算離題吧!
===================引 用 careychen 文 章===================
........回文只是依其需求回應
我要的是將htm殺掉也沒關係,只要exe帶著走,就可以用了

......是比較希望發問者有空間自己去想想,不是把程式全部丟出去,讓發問者思考一下而已,
因為本篇的文其實在前一篇時有xx已經提示了,所以希望發問者能自己再好好想一下。

------
努力會更接近成功
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-12-18 00:21:22 IP:59.126.xxx.xxx 訂閱
呵,您太抬舉了,另…跟您說一個不是秘密的小秘密,就是那個 Media 也就是那個 RC_Type,其實是.... 騙人的,那個  rc 裡面其實他的語法結構是

Name Type Path

所以小弟上面的 Sample 中是用

Html1 Media D:\\ABC\\ABC.HTML

但其實 Rc 可以這樣寫
a a1 E:\\Test.rar
b b1 E:\\word.doc
c c1 E:\\1.txt

使用時就是
with TResourceStream.Create(HInstance, 'a', 'a1') do ......
with TResourceStream.Create(HInstance, 'b', 'b1') do ......
with TResourceStream.Create(HInstance, 'c', 'c1') do ......


而在原本 Delphi 所定義的 RC_Type (Help 中有,請找 TResourceStream.Create) 有下面幾樣
至於您要在 Res含在Dll中調用的部份,之前有前輩已經有寫了,幫您找了出來請參考 這裡
------
價值的展現,來自於你用哪一個角度來看待它!!
andyto202
一般會員


發表:10
回覆:29
積分:7
註冊:2006-12-07

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-12-18 00:34:21 IP:122.116.xxx.xxx 訂閱
careychen兄可以順便回答我的問題嗎
為什麼htm會再執行後又跑出來呢

===================引 用 careychen 文 章===================
呵,您太抬舉了,另…跟您說一個不是秘密的小秘密,就是那個 Media 也就是那個 RC_Type,其實是.... 騙人的,那個 rc 裡面其實他的語法結構是

Name Type Path

所以小弟上面的 Sample 中是用

Html1 Media D:\\ABC\\ABC.HTML

但其實 Rc 可以這樣寫
a a1 E:\\Test.rar
b b1 E:\\word.doc
c c1 E:\\1.txt

使用時就是
with TResourceStream.Create(HInstance, 'a', 'a1') do ......
with TResourceStream.Create(HInstance, 'b', 'b1') do ......
with TResourceStream.Create(HInstance, 'c', 'c1') do ......


而在原本 Delphi 所定義的 RC_Type (Help 中有,請找 TResourceStream.Create) 有下面幾樣
至於您要在 Res含在Dll中調用的部份,之前有前輩已經有寫了,幫您找了出來請參考 這裡
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-12-18 06:31:10 IP:220.141.xxx.xxx 訂閱
andyto202先生:
請教您一個問題,我PO的兩篇#2及#4您是否都有真的用程式跑過嗎? careychen大所PO的的#3和我的#4篇又有何不同?我所PO的兩篇都可以解決你的問題,且都不會再產生Html出來,對別人已完全幫你寫完的程式,沒有測試,是很不禮貌的行為,因為這篇標題是我訂的,所以我的答案在你未提出來前就已想好了,所以絶對會切題,careychen大根本不需再回應你,他要你動腦筋,而我直接告訴你答案:你只要把我的#4減掉他的#3就是你下面要的答案了,因為你根本沒有認真看程式。

===================引 用 andyto202 文 章===================
careychen兄可以順便回答我的問題嗎
為什麼htm會再執行後又跑出來呢

------
努力會更接近成功
系統時間:2024-04-29 6:05:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!