全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1297
推到 Plurk!
推到 Facebook!

請問如何在一個文字檔中(*.pas),搜尋到特定位置,再插入想要插入的文字

尚未結案
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-08 18:13:00 IP:211.72.xxx.xxx 未訂閱
各位先進,小弟要寫一個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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-08 19:23:40 IP:61.222.xxx.xxx 未訂閱
用 TstringList 方便載入檔案及插入資料。 就不需要考慮到#13#10的問題。
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-08 23:32:26 IP:61.229.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-10 16:27:51 IP:218.167.xxx.xxx 未訂閱
加點判斷避免不是出現在單獨一行    
 
    try
      ss.LoadFromFile(OpenDialog1.FileName);
      for i:=0 to ss.Count-1 do
      begin
        if Pos('//***請將程式碼寫到下面去***',ss.Strings[i])>0  then
          ss.Insert(i 1,'ShowMessage(''我是插入的程式碼'');');
      end;
      Memo1.Lines.Assign(ss);
    finally
      ss.Free;
    end;    
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-10 17:20:30 IP:61.219.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-10 17:54:19 IP:61.218.xxx.xxx 未訂閱
1.假設要取第5行的字串到str裡:   
str:=stringlist.Strings[5]<--這樣了嗎?
2.indexOf回傳的索引值,代表傳入indexOf的字串,是擺在TStringList陣列裡的第幾個,如果沒有符合的,就會回傳-1 3.insert,delete之後都會改變陣列的大小,所以,如果你要刪除index1到index2之間的值,那麼就要從索引值大的開始刪(就是從index2開始刪),如果從index1開始刪,則index1之後的索引值都會往前遞補
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-10 22:30:05 IP:61.219.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-11 12:26:19 IP:218.167.xxx.xxx 未訂閱
如果起始與結束文字不是只有該文字, 前面有空白或別的文字 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 i0; //偵測下一行是否結束, 奇怪 + 號出不來
            continue;
         end;          
         bDeleteStart:=Pos('//***請將程式碼寫到下面去***', ss[i])>0;
         if bDeleteStart then
            iStart:=i
      end;          ss.Insert(iStart 1,'');
      ss.Insert(iStart 2,Memo1.Text);
      ss.SaveToFile(OpenDialog1.FileName);
      Memo3.Lines.Assign(ss);
    finally
      ss.Free;
    end;
  end;
end;     
發表人 - chris_shieh 於 2004/11/11 12:28:27
dino
一般會員


發表:20
回覆:73
積分:23
註冊:2002-07-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-19 14:46:14 IP:211.23.xxx.xxx 未訂閱
感謝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 i0; //偵測下一行是否結束, 奇怪 + 號出不來
            continue;
         end;          
         bDeleteStart:=Pos('//***請將程式碼寫到下面去***', ss[i])>0;
         if bDeleteStart then
            iStart:=i
      end;          ss.Insert(iStart 1,'');
      ss.Insert(iStart 2,Memo1.Text);
      ss.SaveToFile(OpenDialog1.FileName);
      Memo3.Lines.Assign(ss);
    finally
      ss.Free;
    end;
  end;
end;    
系統時間:2024-07-06 19:43:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!