請問如何在一個文字檔中(*.pas),搜尋到特定位置,再插入想要插入的文字 |
尚未結案
|
dino
一般會員 ![]() ![]() 發表:20 回覆:73 積分:23 註冊:2002-07-29 發送簡訊給我 |
各位先進,小弟要寫一個code產生器
我要搜尋"Unit1.pas"這個文字檔裡面的一段標記--> //***請將程式碼寫到下面去***, 並且在這段標記下面插入這段程式碼-->ShowMessage('我是插入的程式碼');
如下:
procedure TForm1.Button1Click(Sender: TObject); begin //***請將程式碼寫到下面去*** ShowMessage('我是插入的程式碼'); end;首先就要搜尋 //***請將程式碼寫到下面去*** 這段文字 然後下換行的指令(是不是#13#10呢?) 然後再寫入自己要寫入程式碼 不知道要怎麼寫,翻閱了關於檔案處理的所有函數, 搜尋跟寫檔有try出來了,但是都無法兜起來 不知各位高手可否提供一下寫法跟想法讓後輩可以參考一下,感激不盡 發表人 - dino 於 2004/11/08 18:16:22 |
wameng
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
change.jian
版主 ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
hi,dino:
以TStringList讀入的文字檔,如果要加入一行,可在TStringList裡呼叫Insert即可,底下為範例程式:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TForm1 = class(TForm) BitBtn1: TBitBtn; BitBtn2: TBitBtn; Memo1: TMemo; OpenDialog1: TOpenDialog; procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.BitBtn1Click(Sender: TObject); var ss:TStringList; i:Integer; begin if OpenDialog1.Execute then begin ss:=TStringList.Create; try ss.LoadFromFile(OpenDialog1.FileName); for i:=0 to ss.Count-1 do begin if ss.Strings[i] = '//***請將程式碼寫到下面去***' then ss.Insert(i 1,'ShowMessage(''我是插入的程式碼'');'); end; Memo1.Lines.Assign(ss); finally ss.Free; end; end; end; procedure TForm1.BitBtn2Click(Sender: TObject); begin //***請將程式碼寫到下面去*** end; end. |
chris_shieh
高階會員 ![]() ![]() ![]() ![]() 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
|
dino
一般會員 ![]() ![]() 發表:20 回覆:73 積分:23 註冊:2002-07-29 發送簡訊給我 |
change.jian兄與chris_shieh兄 感謝你們的回答
我試過了是可行的
但是發現一個問題
insert都是一直新增進去
但是要如何把舊程式碼清除呢? 就是每次insert時先把上次insert的字串都清除
我想過,可以再新增一個標記字串--> //***end***
就是先搜尋--> //***請將程式碼寫到下面去***
把行號記下來(index1)
然後再搜尋--> //***end***
也把行號記下來(index2),然後就逐一刪除index1到index2的所有字串
看了help,IndexOf這個method似乎是傳入字串,然後回傳一個integer,不知道
這個值是什麼,試過了好像不是用來紀錄行號的,請教一下如何得到行號呢?
還是說有什麼更好的方法可以去實現呢?
procedure TForm1.Button1Click(Sender: TObject); begin //***請將程式碼寫到下面去*** ShowMessage('我是插入的程式碼'); ShowMessage('我是插入的程式碼'); ..... //***end*** end; |
change.jian
版主 ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|
dino
一般會員 ![]() ![]() 發表:20 回覆:73 積分:23 註冊:2002-07-29 發送簡訊給我 |
change.jian兄 ,感謝你的再次提點,目前已經試出來的程式碼如下,給需要的人參考,還請各位高手指正
procedure TForm1.Button3Click(Sender: TObject); var ss:TStringList; i:Integer; j:Integer; startIndex:integer; endIndex:integer; begin Memo1.Text := Memo2.Lines.Text; if OpenDialog1.Execute then begin ss:=TStringList.Create; try ss.LoadFromFile(OpenDialog1.FileName); startIndex:=ss.IndexOf('//***請將程式碼寫到下面去***'); endIndex:=ss.IndexOf('//***end***'); //ShowMessage(inttostr(startIndex)); //ShowMessage(inttostr(endIndex)); for j:=endIndex - 1 downto startIndex 1 do begin ss.Delete(j); end; for i:=0 to ss.Count-1 do begin if Pos('//***請將程式碼寫到下面去***',ss.Strings[i])>0 then begin ss.Insert(i 1,''); ss.Insert(i 2,Memo1.Text); ss.SaveToFile(OpenDialog1.FileName); end; end; Memo3.Lines.Assign(ss); finally ss.Free; end; end; end; |
chris_shieh
高階會員 ![]() ![]() ![]() ![]() 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
如果起始與結束文字不是只有該文字, 前面有空白或別的文字
ex:
...
//這些是多餘文字 //***請將程式碼寫到下面去***
...
參考一下
procedure TForm1.Button3Click(Sender: TObject); var ss:THashedStringList; //改用THashedStringList比對速度較快 i:Integer; iStart:integer; bDeleteStart, bDeleteEnd:Boolean; begin Memo1.Text := Memo2.Lines.Text; if OpenDialog1.Execute then begin ss:=TStringList.Create; try ss.LoadFromFile(OpenDialog1.FileName); for i := 0 to ss.Count-1 do begin if bDeleteEnd then break else if bDeleteStart then begin ss.Delete[i]; if i發表人 - chris_shieh 於 2004/11/11 12:28:27 |
dino
一般會員 ![]() ![]() 發表:20 回覆:73 積分:23 註冊:2002-07-29 發送簡訊給我 |
感謝change.jian跟chris_shieh兩位的相助
由於開發工具的變更,需要轉換成C++ Builder
小弟C/C++的功力尚淺,正在努力的try 將以下的Object Pascal的語法轉成C++的語法,不知有哪位跨RAD的高手可以提供範例給小弟參考,謝謝
procedure TForm1.Button3Click(Sender: TObject); var ss:THashedStringList; //改用THashedStringList比對速度較快 i:Integer; iStart:integer; bDeleteStart, bDeleteEnd:Boolean; begin Memo1.Text := Memo2.Lines.Text; if OpenDialog1.Execute then begin ss:=TStringList.Create; try ss.LoadFromFile(OpenDialog1.FileName); for i := 0 to ss.Count-1 do begin if bDeleteEnd then break else if bDeleteStart then begin ss.Delete[i]; if i |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |