Miki-lion
中階會員
發表:90 回覆:180 積分:54 註冊:2005-04-24
發送簡訊給我
|
正在念金禾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
發送簡訊給我
|
您好: PO程式碼的方式請參考版規說明,煩請修改謝謝您的配合
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=58991
|
cashyy
高階會員
發表:117 回覆:322 積分:212 註冊:2004-04-30
發送簡訊給我
|
妳好!我試過妳的程式碼,出現的位置在正中間,也可以正確取代!
執行圖片如下:
#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
發送簡訊給我
|
建議你按一下Project->Build All Projects後,再執行看看
|
Miki-lion
中階會員
發表:90 回覆:180 積分:54 註冊:2005-04-24
發送簡訊給我
|
Builder ALL試過了還是沒有功能 視窗不在中央的問題,我想到了,我的程式一開始是小螢幕(偏排變很亂)
變成大螢幕後就正常了,不知道是不是我這部份沒做好 我把程式壓在一起放這裡~~這樣應該比較清楚了
www.cyut.edu.tw/~s9127073/Edit_net.rar
感謝討論區內的各位陪我一起成長
|
cashyy
高階會員
發表:117 回覆:322 積分:212 註冊:2004-04-30
發送簡訊給我
|
妳好!請妳把!
//ReplaceDialog1->Position = Point(RichEdit1->Left RichEdit1->Width, RichEdit1->Top);
ReplaceDialog1->Execute();
請把這一行紅色的字拿掉,ReplaceDialog就可以出現在中央了!
|
wu-eric
中階會員
發表:14 回覆:82 積分:64 註冊:2004-03-17
發送簡訊給我
|
第一、修改下列這行
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
發送簡訊給我
|
很感謝你的回答~視窗已經可以在中央了 不過取代的功能方面依然有些問題 1.找下一個方面:無法將選取的文字反白,不知道現在是選那一個
2.全部取代方面:只能夠一個一個來取代....
很感謝回答過我的問題的每一個人
因為這是我第一個寫的BCB
|
wu-eric
中階會員
發表:14 回覆:82 積分:64 註冊:2004-03-17
發送簡訊給我
|
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
發送簡訊給我
|
大大真是太感激了,全部取代功能已經好了 不過我剛發現作好處理 存檔後會讓原始檔變成亂碼(ASCII?) 但這問題離題了 所以我先結束這裡的 感謝有回答我的大大 不管是有用到的還是沒用到的 都讓我受益良多 感謝
|