问个COMBOX值随STRINGLIST值实时变化的问题?(200)

  • 主题发起人 主题发起人 madeagle
  • 开始时间 开始时间
M

madeagle

Unregistered / Unconfirmed
GUEST, unregistred user!
表单上有一个COMBOX,一个STRINGLISTvar StrList:TstringList;StrList.loadFrom('a.txt');combox1.items:=StrList;如何能实现COMBOX值随STRINGLIST值变化而实时变化?调用指针或内存?请高手指教!如果再赋值combox1.items:=StrList;就没意思了,呵呵^)^
 
试试 combox1.Items.Assign(mmo1.Lines);
 
assign试过,也不行呀,呵呵其实就是以前探讨过的 A:=1;B:=A;A:=2;B = ? 的问题~~~
 
试试这样:procedure TForm1.btnCalcClick(Sender: TObject);var A: string; B: Pointer;begin A := '10'; B := @A; A := '20abc'; ShowMessageFmt('%s', [String(B^)]);end;
 
最终你的需求可以改成这样:procedure TForm1.btnCalcClick(Sender: TObject);var B: Pointer;begin B := @mmo1.Lines; combox1.Items := TStrings(B^);end;结贴吧。
 
procedure TForm1.btnCalcClick(Sender: TObject);var StrList: TStringList; B: Pointer;begin StrList := TStringList.Create; StrList.LoadFromFile('a.txt'); B := @StrList; combox1.Items := TStrings(B^);end;
 
其实还可以使用PChar函数,如下示例:procedure TForm1.btnCalcClick(Sender: TObject);var StrList: TStringList;begin StrList := TStringList.Create; StrList.LoadFromFile('a.txt'); cbx1.Items := TStrings(PChar(StrList));end;
 
谢谢szhcracker的解答,呵呵……你看清楚俺的问题了吗?代码你测试了吗?StrList值变动的时候COMBOBOX1的ITEMS值跟着实时变动了没?===============================procedure TForm1.btnCalcClick(Sender: TObject);var B: Pointer;begin B := @mmo1.Lines; combox1.Items := TStrings(B^);end; // mmo1的Lines值变动时,combox1并不实时变动=======================================================其实还可以使用PChar函数,如下示例:procedure TForm1.btnCalcClick(Sender: TObject);var StrList: TStringList;begin StrList := TStringList.Create; StrList.LoadFromFile('a.txt'); cbx1.Items := TStrings(PChar(StrList));end; //StrList值变动时 cbx1.ITEMS的值并不实时变动[:(]
 
你的代码其实还是跟 cbx1.Items:=StrList 就是一样的效果!
 
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) ComboBox1: TComboBox; Button1: TButton; Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Memo1KeyPress(Sender: TObject; var Key: Char); private { Private declarations } StrList: TStringList; procedure OnStrChange(Sender: TObject); public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin //StrList.Clear; StrList.LoadFromFile('Test.txt');end;procedure TForm1.FormCreate(Sender: TObject);begin StrList:=TStringList.Create; StrList.OnChange:=OnStrChange;end;procedure TForm1.FormDestroy(Sender: TObject);begin if Assigned(StrList) then StrList.Free;end;procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);begin if Key=#13 then begin StrList.Assign(Memo1.Lines); end;;end;procedure TForm1.OnStrChange(Sender: TObject);begin ComboBox1.Items.Assign(StrList); ComboBox1.ItemIndex:=0;end;end.
 
你要实时,难道不会用一个定时器吗?
 
自己写个ComboBox否则就老老实实地赋值[8D]
 
看看 Items 是如何实现的就明白了。 property Items: TStrings read FItems write SetItems;procedure TCustomCombo.SetItems(const Value: TStrings);begin if Assigned(FItems) then [red]FItems.Assign(Value)[/red] else FItems := Value;end;所以:要实现你所需的功能,得改写TCombobox的实现或者重写一个控件,麻烦。还不如 combox1.items:=StrList 就一行代码, 也没什么麻烦的。[:)]
 
还是应该重写一个控件!
 
谢谢大家参与…… dorry的答案更简便一点……
 

Similar threads

后退
顶部