delphi编程 实现一功能
发布网友
发布时间:2023-12-25 13:36
我来回答
共5个回答
热心网友
时间:2024-01-12 01:15
源文本文档
一台电脑是由多部分组成的,其中包括有[显示器/显示器是电脑的标准输出单元,可显示程序执行及操作的过程与实时性的输出结果],键盘,鼠标,和主机!
其中主机包括有CPU,内存,[硬盘/简称HD,是个人计算机中最主要的储存设备即辅助内存],主板,电源等部件!
---------------------------------------------------
你在盒子上说
其实DATA.TXT里的的文字是随机的,关键字的位置和个数都不能确定的,按道理不可能用LABEL来组合。
下边是我的道理^_^
首先字都是读到数组里的,字号是固定的,一个汉字占两个字节,一个全角标点也两个字节,所以可以量出来在这个应用程序窗体上一行最多可以放多少个字(假设窗体长1000像素,字50X50像素) 也就是说每行最多输出20字
首先先把字符定义出来,还有,计数器 L=20
数组1=一台电脑是由多部分组成的,其中包括有
数组2=[显示器/显示器是电脑的标准输出单元,可显示程序执行及操作的过程与实时性的输出结果]
数组3=键盘,鼠标,和主机!<-这有个硬回车
数组4=[硬盘/简称HD,是个人计算机中最主要的储存设备即辅助内存]
数组5=主板,电源等部件
此处代码应该容易写
核心部分
先检测首字符是不是"["
如果不是,测长,通过TEXTOUT(我记得好像是...)输出普通字符,每输出一个字符前都要扣一个计数器,然后下一个输出点是(500-50*L)如果计数器到0了或者字符是回车的话
那给TEXTOUT的TOP+80(字50 字纵间距30)
如果此数组字符输出结束了,下一个数组必定是"["开头,所以把现在剩余的长度加上关键字的长度(从[到/中间是关键字长度)如果数值<0
TEXTOUT的TOP+80
带有CLICK事件的LABLE1通过数组读取它的caption属性和hint属性(这不细说了)
TOP数值有了,LEFT=500-剩余字数*50 LABEL它也知道该往哪呆了
下一个输出点在LEFT=500-剩余字数*50+LABEL.WIDTH处,
到写这也差不多了..这点东西写了我一个多小时...
其实用哎呀.......的TCPPWEBBROWSER也行,不过.和你图上的软件风格就不一样了.
代码太有挑战.我决定不要分了..希望你自己应该能搞定,我知道,我这里边有很多细节都没有.但希望我写的会对你有帮助.
^_^
热心网友
时间:2024-01-12 01:15
介绍地址
我先看下再来,占个一楼,呵呵
热心网友
时间:2024-01-12 01:16
我是玩BCB的,BCB和Delphi除了语法,其它基本上是一样的。
所以,以我个人的看法说说,仅供参考。
1、想直线解决这个问题是没门的,基本上是办不到的。正如你所说,最大的问题,很难准确定位关键词,别的还可以想办法。
2、所以,只能绕弯子走,不过,如果是我来做的话,这弯子就绕得很大了,我会使用TCppWebBrowser控件,用Html网页来实现他。也就是说,你那个TXT文本文件要变成标准的Html格式,据我所知,Html里要实现你说的这个功能是不难的。不过界面就变了,呵呵。
3、当然,按我的做法,在事实上,所有的效果都会是Html出来的,程序就只变成一个壳了。
我想,除了我说的办法,可能没有别的方便的方法了。
热心网友
时间:2024-01-12 01:17
个人认为用动态生成label和form的方法应该是可以解决这个问题的。
先说一下想法吧:
第一步,用一个stringlist读data.txt,所用方法为LoadFromFile。
第二步,写两个函数,先命名为gettxt1和gettxt2,用pos来判断“[”、“]”和“/”的位置,各返回一个integer类型的变量。
第三步,写一个动态生成label控件的函数,返回值为integer类型(如果result为0,那么说明label不是“[]”内的内容,无onclick事件;如果为1,则是“[]”里的内容,有onclick事件)。
第四步,循环判断stringlist的每一行,其中用到的函数有length,copy,delete等。将stringlist中的第一行赋值给string1,用length得到长度,用gettxt1得到“[”的位置,如果存在“[”,得到它的位置,用copy截取其前面的字符串,赋值给string2,调用动态生成label控件,将其caption设为string2。如果不存在“[”,则直接跳过,判断第二行,如果第二行中存在“[”,获得其位置,并截取其前面的字符串,赋值为string3,用string2:=string1+string3的方法,获得完整的字符串,调用动态生成label控件函数,caption为string2;
再说“[]”里的内容获取,基本上同上面的方法,所不同的有两点:一是要将“[]”里的内容添加到一个stringlist类型中(该类型变量为全局变量),先命名为strshowtxt;二是caption为“[]”里的内容的label有onclick事件,而这个事件需要另写一个过程,这个过程先命名为showtxt。
第四步,如何显示关键字内容。
要想显示关键字内容,必需知道哪一个label的caption值为关键字,要实现这一步,就要在动态生成label时想办法。上面提到动态生成的label控件的函数,其中要有这一步,如果是“[]”里的字符,那么将这个label的tag值设为1(默认为0)。调用showtxt过程,循环判断strshowtxt每行中是否有这个关键字,没有,则直接跳过;有,就动态生成一个form和label,将label的caption值设为strshowtxt这一行的内容。
基本上就想到这么多,当然其中还是有许多不足吧,自己还没试,试过后就知道是不是能行。
//////////////////////////////////////////////
做出一部分,但还不能判断是点的哪一个,所以只要点label,就会出来,还在想....
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procere FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function showlabel(value:string;value1:Boolean):Boolean;
procere showtxt;
procere showform(Sender: TObject);
end;
var
Form1: TForm1;
n:integer;
lab:TLabel;
implementation
{$R *.dfm}
{ TForm1 }
function TForm1.showlabel(value: string; value1: Boolean):Boolean;
begin
lab:=TLabel.Create(form1);
lab.Caption:=value;
lab.Parent:=form1;
lab.Visible:=true;
lab.AutoSize:=true;
if n=0 then
lab.Left:=10
else
lab.Left:=n;
lab.Top:=10;
if value1 then
lab.Tag:=0
else
lab.Tag:=1;
lab.OnClick:=showform;
lab.Width:=lab.Width+32;
n:=lab.Left+lab.Width;
result:=true;
end;
procere TForm1.showtxt;
var
str:tstringlist;
string1,string2,string3:string;
i,m:integer;
begin
str:=tstringlist.Create;
try
str.LoadFromFile('E:\新建文件夹\data.txt');
string1:=str.Strings[0];
i:=pos('[',string1);
string2:=copy(string1,1,i-1);
m:=pos('/',string1);
string3:=copy(string1,i+1,m-i-1);
showlabel(string2,true);
showlabel(string3,false);
finally
str.Free;
end;
end;
procere TForm1.FormCreate(Sender: TObject);
begin
n:=0;
showtxt;
end;
procere TForm1.showform(Sender: TObject);
var
str,str1:tstringlist;
myform:Tform;
i,m,n:integer;
s,s1:string;
st:widestring;
la:TLabel;
begin
str:=tstringlist.Create;
str1:=tstringlist.Create;
myform:=Tform.Create(nil);
la:=TLabel.Create(myform);
try
str.LoadFromFile('E:\新建文件夹\data.txt');
for i:=0 to str.Count-1 do
s1:=s1+str.Strings[i];
n:=pos(']',s1);
m:=pos('[',s1);
while m<>0 do
begin
s:=copy(s1,m+1,n-m-1);
str1.Add(s);
delete(s1,1,n);
m:=pos('[',s1);
n:=pos(']',s1);
end;
for i:=0 to str1.Count-1 do
begin
m:=pos(lab.Caption,str1.Strings[i]);
if m<>0 then
st:=str1.Strings[i];
break;
end;
if m<>0 then
begin
myform.Caption:='内容';
myform.Width:=300;
myform.Height:=300;
la.Caption:=st;
la.Parent:=myform;
la.AutoSize:=true;
la.Top:=10;
la.Left:=10;
la.Visible:=true;
la.Width:=la.Width+100;
myform.ShowModal;
end;
finally
str.Free;
str1.Free;
myform.Free;
end;
end;
end.
热心网友
时间:2024-01-12 01:17
首先,可以考虑使用正则式来匹配字符串,正则式的资料请自行Google或百度,否则要在这里写书了。
其次,关于表现形式可以有多种,比如动态生成Label并设定相关属性;如果允许的话,使用RichEdit并设置字体和链接(类似超链接)等;实在不行,自己在Canvas上画吧,这个就比较麻烦了。