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

ReplaceDialog問題~WordPad內的取代功能

尚未結案
Miki-lion
中階會員


發表:90
回覆:180
積分:54
註冊:2005-04-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-09 00:24:29 IP:218.162.xxx.xxx 未訂閱
正在念金禾C++ Builder 完全攻略 第9章的ReplaceDialog    做出來了 編譯沒有問題了(感謝某大教導)    不過有2個問題    1.出來的對話框出現位置很奇怪 2.取代功能完全沒有出來....頭疼~因為我是看書上照打的 完全不知道是哪裡的錯~請問大大們該如何解決 最後面的才是ReplaceDialog,前面的分別是開檔讀檔自行對話框 程式碼: //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { if(OpenDialog1->Execute()) { RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { if(SaveDialog1->Execute()) { RichEdit1->Lines->SaveToFile(SaveDialog1->FileName); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { if(FontDialog1->Execute()) { RichEdit1->Font=FontDialog1->Font; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) { ReplaceDialog1->Position = Point(RichEdit1->Left + RichEdit1->Width, RichEdit1->Top); ReplaceDialog1->Execute(); } //--------------------------------------------------------------------------- void __fastcall TForm1::ReplaceDialog1Replace(TObject *Sender) { TReplaceDialog *dlg = (TReplaceDialog *)Sender; /* perform a global case-sensitive search for FindText in Memo1 */ int SelPos = RichEdit1->Lines->Text.Pos(dlg->FindText); if (SelPos > 0) { RichEdit1->SelStart = SelPos - 1; RichEdit1->SelLength = dlg->FindText.Length(); // Replace selected text with ReplaceText RichEdit1->SelText = dlg->ReplaceText; } else MessageBeep(0); } //--------------------------------------------------------------------------- void __fastcall TForm1::ReplaceDialog1Find(TObject *Sender) { int FoundAt, StartPos, ToEnd; // 如果不是第一次搜尋,將接著下一個搜尋 if (RichEdit1->SelLength) StartPos = RichEdit1->SelStart + RichEdit1->SelLength; else // 如果是第一次搜尋,初始化StartPos StartPos = 0; // ToEnd是搜尋字串起始位址到RichEdit最末端位置的剩餘字串長度 ToEnd = RichEdit1->Text.Length() - StartPos; FoundAt = RichEdit1->FindText(ReplaceDialog1->FindText, StartPos, ToEnd, TSearchTypes()<< stMatchCase); if (FoundAt != -1) { RichEdit1->SetFocus(); RichEdit1->SelStart = FoundAt; RichEdit1->SelLength = ReplaceDialog1->FindText.Length(); } } //---------------------------------------------------------------------------
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-09 00:43:45 IP:218.168.xxx.xxx 未訂閱
您好:    PO程式碼的方式請參考版規說明,煩請修改謝謝您的配合 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=58991
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-09 01:59:01 IP:59.104.xxx.xxx 未訂閱
妳好!我試過妳的程式碼,出現的位置在正中間,也可以正確取代! 執行圖片如下:
#include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ReplaceDialog1->Position = Point(RichEdit1->Left + RichEdit1->Width, RichEdit1->Top);
  ReplaceDialog1->Execute();
}
//---------------------------------------------------------------------------    void __fastcall TForm1::ReplaceDialog1Replace(TObject *Sender)
{
  TReplaceDialog *dlg = (TReplaceDialog *)Sender;
  /* perform a global case-sensitive search for FindText in Memo1 */
  int SelPos = RichEdit1->Lines->Text.Pos(dlg->FindText);
  if (SelPos > 0)
  {
  RichEdit1->SelStart = SelPos - 1;
  RichEdit1->SelLength = dlg->FindText.Length();
  // Replace selected text with ReplaceText
  RichEdit1->SelText = dlg->ReplaceText;
  }
  else
    MessageBeep(0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ReplaceDialog1Find(TObject *Sender)
{
  int FoundAt, StartPos, ToEnd;
  // 如果不是第一次搜尋,將接著下一個搜尋
  if (RichEdit1->SelLength)
    StartPos = RichEdit1->SelStart + RichEdit1->SelLength;
  else
    // 如果是第一次搜尋,初始化StartPos
    StartPos = 0;
    // ToEnd是搜尋字串起始位址到RichEdit最末端位置的剩餘字串長度
    ToEnd = RichEdit1->Text.Length() - StartPos;
    FoundAt = RichEdit1->FindText(ReplaceDialog1->FindText, StartPos, ToEnd, TSearchTypes()<< stMatchCase);
    if (FoundAt != -1)
    {
      RichEdit1->SetFocus();
      RichEdit1->SelStart = FoundAt;
      RichEdit1->SelLength = ReplaceDialog1->FindText.Length();
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  if(OpenDialog1->Execute())
    RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName);
}
//---------------------------------------------------------------------------
妳有其它文章未結案,如有不滿意的答案,請使用"結案"!
wu-eric
中階會員


發表:14
回覆:82
積分:64
註冊:2004-03-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-09 02:02:11 IP:210.66.xxx.xxx 未訂閱
建議你按一下Project->Build All Projects後,再執行看看
Miki-lion
中階會員


發表:90
回覆:180
積分:54
註冊:2005-04-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-09 11:35:43 IP:218.162.xxx.xxx 未訂閱
Builder ALL試過了還是沒有功能 視窗不在中央的問題,我想到了,我的程式一開始是小螢幕(偏排變很亂) 變成大螢幕後就正常了,不知道是不是我這部份沒做好 我把程式壓在一起放這裡~~這樣應該比較清楚了 www.cyut.edu.tw/~s9127073/Edit_net.rar 感謝討論區內的各位陪我一起成長
cashyy
高階會員


發表:117
回覆:322
積分:212
註冊:2004-04-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-09 12:16:20 IP:59.104.xxx.xxx 未訂閱
妳好!請妳把!
//ReplaceDialog1->Position = Point(RichEdit1->Left   RichEdit1->Width, RichEdit1->Top);
  ReplaceDialog1->Execute();
請把這一行紅色的字拿掉,ReplaceDialog就可以出現在中央了!
wu-eric
中階會員


發表:14
回覆:82
積分:64
註冊:2004-03-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-10 17:39:57 IP:210.66.xxx.xxx 未訂閱
第一、修改下列這行 ReplaceDialog1->Position = Point(RichEdit1->Left RichEdit1->Width, RichEdit1->Top); 為 //ReplaceDialog1->Position = Point(RichEdit1->Left RichEdit1->Width, RichEdit1->Top); 第二、ReplaceDialog1物件的Events 頁簽中的 OnReplace 要為 ReplaceDialog1Replace ps:一般來說,VCL物件的事件程式應由BCB來建立初始, 例如ReplaceDialog1物件的OnReplace事件, 可在ReplaceDialog1物件的Events 頁簽中的 OnReplace,點滑鼠左鍵二下,即可建立初使 發表人 - wu-eric 於 2005/05/10 18:57:00
Miki-lion
中階會員


發表:90
回覆:180
積分:54
註冊:2005-04-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-10 22:23:24 IP:218.162.xxx.xxx 未訂閱
很感謝你的回答~視窗已經可以在中央了 不過取代的功能方面依然有些問題 1.找下一個方面:無法將選取的文字反白,不知道現在是選那一個 2.全部取代方面:只能夠一個一個來取代.... 很感謝回答過我的問題的每一個人 因為這是我第一個寫的BCB
wu-eric
中階會員


發表:14
回覆:82
積分:64
註冊:2004-03-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-10 23:16:47 IP:220.229.xxx.xxx 未訂閱
 
void __fastcall TForm1::ReplaceDialog1Replace(TObject *Sender)
 {
  TReplaceDialog *dlg = (TReplaceDialog *)Sender;
  int SelPos;
  if (dlg->Options.Contains(frReplace))
  {
    SelPos = RichEdit1->Lines->Text.Pos(dlg->FindText);
    if (SelPos > 0)
    {
      RichEdit1->SelStart = SelPos - 1;
      RichEdit1->SelLength = dlg->FindText.Length();
      // Replace selected text with ReplaceText
      RichEdit1->SelText = dlg->ReplaceText;
    }
  }
  else if (dlg->Options.Contains(frReplaceAll))
  {
    SelPos = RichEdit1->Lines->Text.Pos(dlg->FindText);
    while(SelPos > 0)
    {
      SelPos = RichEdit1->Lines->Text.Pos(dlg->FindText);
      if(SelPos>0)
      {
      RichEdit1->SelStart = SelPos-1;
      RichEdit1->SelLength = dlg->FindText.Length();
      // Replace selected text with ReplaceText
      RichEdit1->SelText = dlg->ReplaceText;
      }        }
  }
1.ReplaceDialog1物件的Events 頁簽中的 OnFind 要為 ReplaceDialog1Find,這與我上次跟你講的一樣 2.ReplaceAll 請參考上面程式碼 發表人 - wu-eric 於 2005/05/10 23:19:05
Miki-lion
中階會員


發表:90
回覆:180
積分:54
註冊:2005-04-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-05-11 02:41:23 IP:218.162.xxx.xxx 未訂閱
大大真是太感激了,全部取代功能已經好了 不過我剛發現作好處理 存檔後會讓原始檔變成亂碼(ASCII?) 但這問題離題了 所以我先結束這裡的 感謝有回答我的大大 不管是有用到的還是沒用到的 都讓我受益良多 感謝
系統時間:2024-05-14 5:38:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!