Delphi中取代Foxpro宏替换的方法?(200分)

  • 主题发起人 主题发起人 Riantwin
  • 开始时间 开始时间
R

Riantwin

Unregistered / Unconfirmed
GUEST, unregistred user!
在Delphi中用什么方式实现Foxpro中的宏替换呢?我知道在Delphi中没有宏替换这一说,
但是有什么好的办法实现同样的功能呢?我在Delphi大富翁论坛搜索过,没有找到我想要的
答案。


程序设计目的:寻找到FindText字符串后,用ReplaceText字段的内容替换。

有一个数据库Replace,字段结构和数据库内容如下
FindText ReplaceText
_______________________________________________
Title DBEditTitle.Text
PageNum DBEditPageNum.Text
........

在Foxpro中可以用如下语句实现:
use Replace
locate for FindText='Title'
if found()
Replace_var=ReplaceText
Endif
//应用ReplaceText字段的值
?&ReplaceText


Delphi实现方法:
//假设DBEditTitle.Text:=“带你进入P4时代”;
Table1.Open;
Table1.First;
while not Table1.Eof do
Begin
FindText:=Table1.FieldByName('FindText').AsString;
ReplaceWith:=Table1.FieldByName('ReplaceText').AsString;
//在FindText处用ReplaceText的内容替换,为了简化,此处用ShowMessage显示变量值。
ShowMessage(ReplaceText);
ShowMessage(DBEditTitle.Text);
Table1.Next;
End;
运行结果ShowMessage(DBEditTitle.Text)显示的是“带你进入P4时代”,ShowMessage(ReplaceText)
显示的是“DBEditTitle.Text”。怎样才能实现“Title”用“带你进入P4时代”替换?

 
to chyw123:
Riantwin的意思是根据文本‘DBEditTitle.Text’查找到变量DBEditTitle.Text的
值,但我怀疑Riantwin的“?&ReplaceText”应该为:“?&Replace_var”。

to Riantwin:
我以前也用过foxpro,而且做过一些中型的应用,所以,我对foxpro的“&”-宏替换
非常之喜欢,我想宏替换的问题关键在于编译器如何识别程序中的变量名,能够由变量名
查找到变量在内存中的地址的问题,我也很想知道,所以我在以下地址也有相关的问题,
虽然还没有能够解决问题的回答,不过你可以看一下,也许会有启发,有答案了可别忘了
通知我一声。
http://www.delphibbs.com/delphibbs/dispq.asp?LID=583197
 
我说一下我的想法:

FindText ReplaceText
_______________________________________________
Title DBEditTitle.Text
PageNum DBEditPageNum.Text
以下为模拟实现,具体代码你得自己来:
...
//假设DBEditTitle.Text:=“带你进入P4时代”;
Table1.Open;
Table1.First;
while not Table1.Eof do
Begin
FindText:=Table1.FieldByName('FindText').AsString;
ReplaceText:=Table1.FieldByName('ReplaceText').AsString;
//在FindText处用ReplaceText的内容替换,为了简化,此处用ShowMessage显示变量值。
//你此时的ReplaceText当然是字符型变量了,只不过里面有控件名称
//你只能使用间接的方法来实现你的目的
//
  i:=Pos('.',ReplaceText);
tempEditControlName:=Copy(ReplaceText,1,i-1);
tempEditControl:=FindControl(tempEditControlName);
FieldValues['FindText']:=(tempEditControl as TEdit).Text;
//
ShowMessage(ReplaceText);
ShowMessage(DBEditTitle.Text);
Table1.Next;
End;
...

其实我认为你的字段这样搞就行了:
FindText ReplaceText
_______________________________________________
Title DBEditTitle
PageNum DBEditPageNum
//
tempEditControl:=FindControl(ReplaceText);
FieldValues['FindText']:=(tempEditControl as TEdit).Text;
//
 
稍作更正一下:

FindText ReplaceText
_______________________________________________
Title DBEditTitle.Text
PageNum DBEditPageNum.Text
以下为模拟实现,具体代码你得自己来:
...
var
tempEditControl: TDBEdit;
begin
...
//假设DBEditTitle.Text:=“带你进入P4时代”;
Table1.Open;
Table1.First;
while not Table1.Eof do
Begin
FindText:=Table1.FieldByName('FindText').AsString;
ReplaceText:=Table1.FieldByName('ReplaceText').AsString;
//在FindText处用ReplaceText的内容替换,为了简化,此处用ShowMessage显示变量值。
//你此时的ReplaceText当然是字符型变量了,只不过里面有控件名称
//你只能使用间接的方法来实现你的目的
//在此之前,你应该已经建立相关控件了
  i:=Pos('.',ReplaceText);
tempEditControlName:=Copy(ReplaceText,1,i-1);
tempEditControl:=FindControl(tempEditControlName);
//记不清了,不知是FindControl还是FindComponent了,你自己查一下帮助吧
Table1.FieldValues['FindText']:=(tempEditControl as TDBEdit).Text;
//这里可能得使用...as TEdit而不就是TDBEdit,我没有试过
//依照此方法,你可以在程序运行过程中动态建立这些存在于数据库中的控件
//我用此法做过一个程序,主要是动态建立与删除控件的问题,效果挺不错的。
ShowMessage(ReplaceText);
ShowMessage(DBEditTitle.Text);
Table1.Next;
End;
...

其实我认为你的字段这样搞就行了:
FindText ReplaceText
_______________________________________________
Title DBEditTitle
PageNum DBEditPageNum

//
tempEditControl:=FindControl(ReplaceText);
Table1.FieldValues['FindText']:=(tempEditControl as TDBEdit).Text;
//
 
谢谢Yanghaijun!!非常感谢!!我按你的方法已经实现了。

var
tempEditControl: TDBEdit;
ReplaceText:OleVariant;
FieldString:String;
begin
Table1.Open;
Table1.First;
while not Table1.Eof do
Begin
FindText:=Table1.FieldByName('FindText').AsString;
FieldString:=Table1.FieldByName('ReplaceText').AsString;
TempEditControl:=TDBEdit(FindComponent(FieldString)); //这里用function FindComponent(const Name: string): IComponent;
ReplaceWith:=(TempEditControl as TDBEdit).Text; //用as TDBEdit可以,数据库的ReplaceWith字段值为DBeditTitle
ShowMessage(ReplaceText);
ShowMessage(DBEditTitle.Text);
Table1.Next;
End;
End.

再次感谢 Yanghaijun!!
 
我的分呢?嘻嘻。
 
最近总上不了Delphi大富翁。
我还想向yanghaijun请教,假如取的变量不是控件,而是某
个值,怎办?
FindText ReplaceText
_______________________________________________
Title 'Delphi 6'
PageNum 126

另外,我不建立Form,而是Unit,不能放上TWordApplication,TWordDocument,又如何
声明和初始化?
我这样做,提示没有初始化:
var
WordApplication1:TWordApplication;
WordDocument1:TWordDocument;
Begin
Try
WordApplication1.Connect;
Except
.....
End;
 
多人接受答案了。
 
后退
顶部