在程序运行期动态设置控件焦点顺序,listbox1里面能否改成中文名称呢? ( 积分: 50 )

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

rgn

Unregistered / Unconfirmed
GUEST, unregistred user!
在程序运行期动态设置控件焦点顺序?listbox1里面能否改成中文名称呢?
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
ListBox1: TListBox;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
procedure LoadComponent;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
LoadComponent;

end;

procedure TForm1.LoadComponent;
var
i:integer;
tl:TList;
tc:TWinControl;
begin
tl := TList.create;
try
self.GetTabOrderList(tl);
with ListBox1.Items do
begin
clear;
for i := 0 to tl.count - 1 do
begin
tc := TL;
if (tc is TWincontrol) and (tc.TabStop) then
AddObject(tc.Name,tc);

end;
end;

finally
tl.free;
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
with ListBox1, Items do
begin
if ItemIndex > 0 then
Exchange(ItemIndex,ItemIndex-1);

end;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
with ListBox1, Items do
begin
if (ItemIndex >= 0) and (ItemIndex < count-1) then
Exchange(ItemIndex,ItemIndex+1);

end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
LoadComponent;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
i:integer;
tc:TWinControl;
begin
with ListBox1, Items do
for i := 0 to count - 1 do
begin
tc := TWinControl(objects);
if assigned(tc) then
tc.TabOrder := i;
end;

end;

end.
例如edit1在listbox1里面显示是'姓名',怎样改这个程序呢?
 
for i:=64 to 92 do
listbox.add(ini.readstring('Section',chr(i)+'a'));
 
你这种不如直接看成一个文本文件来读好了啊,要不就使用循环好了
var
tmp:string;
.......
for I:= ord('a') to ord('z') do
begin
tmp := IniFileName.readstring('a',char(I)+'a','');
listbox.item.add(tmp);
end;
可能语法上有点错误,但是我想差不多是这个意思了.
 
var
iniFile:TiniFile;
strList:Tstrings;
i:integer;
begin
iniFile:=TiniFile.Create('C:/Test.ini');
strList := Tstringlist.Create();
try

iniFile.ReadSection('a',strList);//把a这一节读到strList里,这就不用管它是什么了。
for i:= 0 to strList.Count do
begin
ListBox.Items.Add(iniFile.ReadString('a',strList,'')); end;
Finally
iniFile.Free;
strList.Free;
end;

end;
 
var
F: TIniFile;
sList: TStrings;
i: Integer;
begin
F := TIniFile.Create('C:/abc.ini');
sList := TStringList.Create;
try
F.ReadSectionValues('a',sList);
for i := 0 to sList.Count - 1 do
ListBox1.Items.Add(sList.ValueFromIndex);
finally
F.Free;
sList.Free;
end;
end;
 
我表达不够清楚
ini文件的内容如下:
[as]
qa=0
ba=2
zb=9
ca=1
da=3
wa=7
qb=8


怎样把qa,ba,ca这些等号前面的值的右边都包含一个a的,
将它们等号后面的内容读到listbox里面?
即listbox1里面只显示
0
2
1
3
7
 
var
F: TIniFile;
sList: TStrings;
i: Integer;
begin
F := TIniFile.Create('C:/abc.ini');
sList := TStringList.Create;
try
F.ReadSectionValues('a',sList);
for i := 0 to sList.Count - 1 do
begin
if PosEx('a',sList.Names,2) = 0 then continue;
ListBox1.Items.Add(sList.ValueFromIndex);
end;
finally
F.Free;
sList.Free;
end;
end;
 
我是要等号全面那个包含a的,在listbox里面显示它等号后面的内容啊
 
我上面贴的代码不行吗?我就是按你这个要求修改我LS的啊。
 
var
SL:TStrings;
n : integer;
begin
SL:=TStringist.Create;
try
SL.LoadFromFile(YOU_INI_FILE);
for n:=0 to SL.Count - 1 do
begin
if SL[n][1]='[' then Continue;
if SL[n][2] = 'a' then
Memo.Line.Add(Copy(SL[n],3,MAXINT));
end;
finally
SL.Free;
end;
end;

修改了,增加了一个 '[' 的处理。
 
LZ,我刚运行测试过了,满足你的要求。LS的兄弟,方法我先不说,你这里面有个风险,要是出现一个空行,你的程序就会报错。
 
没错。再加一个空行判断吧。至少杀鸡没有动牛刀。
 
来个更简单明了的算啦:
procedure Get_rgn_iniFile(rgn_inifileName:string;ShowFor:TMemo);
var
MS:TMemoryStream;
P1,P2 : PChar;
begin
MS:=TMemoryStream.Create;
try
MS.LoadFromFile(rgn_inifileName);
MS.SetSize(MS.Size + 1);
PChar(Integer(MS.Memory) + MS.Size - 1)^:= #0;
P1:=MS.Memory;
while integer(P1) < integer(MS.Memory) + MS.Size do
begin
if (P1^='a')and((P1 + 1)^='=') then
begin
inc(P1,2);
P2 := P1;
while (P1^>#$19) do inc(P1);
P1^ := #0;
ShowFor.Lines.Add(P2);
end;
Inc(P1);
end;
finally
MS.Free;
end;
end;

// 用例:
procedure TForm1.Button1Click(Sender: TObject);
begin
Get_rgn_iniFile(YOU_INI_FILE_NAME,Memo);
end;

这总方便了吧,啥也不用顾忌,管它有没有空行、有没有非法,统吃!还有速度奇快的优势。
 
多人接受答案了。
 
后退
顶部