无法在Delphi中更改TEdit文本

杰萨塔

我在运行时将组件添加到表单中,还添加了事件,这些事件会更改字典中这些组件的属性以供以后调用。

TEventBeforeInsert = function(var AComponent: TComponent; AForm: TForm): Boolean of Object;

TFieldBase = class
private
  FEvent:TEventBeforeInsert;
....
function TFieldBase.EventBeforeInsert: TEventBeforeInsert;
begin
  Result:=FEvent;
end;

function TFieldBase.EventBeforeInsert(AEvent: TEventBeforeInsert): TFieldBase ;
begin
  FEvent:=AEvent;
  Result:=Self;
end;

....

表格电话

TFormBase.New
.addStringField
(
    TFieldBase.New
    .Enabled(True)
    .Description('User')
    .EventBeforeInsert(TEvents.New.EditFillUser), TTabsNames.Tab1
).Show();

表格类

TFormBase = class(TForm)
private
FDictionary: TDictionary<String, TEventBeforeInsert>;
...
function TFormBase.addStringField(AField: TFieldBase; ATab: TTabsNames): TFormBase;
var
  FLink: TLinkControlToField;
  FEdit: TEdit;
begin
  Result := Self;
  FEdit := TEdit.Create(Self);
  FEdit.Visible := True;
  FEdit.Parent := TPanel(PanelParent.FindComponent('PanelTab' + Ord(ATab).ToString));
  FEdit.Enabled:=AField.Enabled;

 
  if Assigned(AField.EventBeforeInsert) then
  begin
    FDictionary.Add(FEdit.Name,AField.EventBeforeInsert);
  end;
end;
...
procedure TFormBase.rectInsertClick(Sender: TObject);
var
    Item:String;
begin
  for Item in FDictionary.Keys do
  begin
    if Not FDictionary.Items[Item](Self.FindComponent(Item),Self) then
      Exit;
  end;
end;

我在这里遇到问题,在调试时我看到正确更改了text属性,但是对显示的表单没有任何更改。

TEvents = class
...
function TEvents.EditFillUser(AComponent: TComponent;AForm: TForm): Boolean;
begin
  TEdit(AComponent).Text:=IntToStr(0);
  Result:=True;
end

我认为变量通过值传递可能是个问题……有人可以帮我吗?

编辑1:我尝试使用这样声明的字典:

FDictionary: TDictionary<TComponent, TEventBeforeInsert>;
...
if Not FDictionary.Items[Item](Item,Self) then //call

而且我也尝试使用TForm引用,如下所示:

function TEvents.EditFillUser(AComponent: String;AForm: TForm): Boolean;
begin
  TEdit(AForm.FindComponent(AComponent)).Text:=IntToStr(0);
  Result:=True;
end
雷米·勒博

在中TFormBase.addStringField(),您没有在将Name值创建到新创建的TEdit对象之前将其分配到中FDictionary.只有在设计时创建的组件才会自动生成Name在运行时创建的组件不会。因此,您正在使用blank跟踪对象Name如果要通过跟踪对象Name,则需要实际将自己的值分配给FEdit.Name,例如:

function TFormBase.addStringField(AField: TFieldBase; ATab: TTabsNames): TFormBase;
var
  ...
  FEdit: TEdit;
  FEvent: TEventBeforeInsert;
begin
  ...
  FEdit := TEdit.Create(Self);
  FEdit.Name := 'SomeUniqueNameHere'; // <-- for you to decide on...
  ...
 
  FEvent := AField.EventBeforeInsert;
  if Assigned(FEvent) then
    FDictionary.Add(FEdit.Name, FEvent);
end;

但是,在这种情况下,我完全没有理由使用a TDictionary考虑使用aTList代替,那么您根本不需要Name这也将提高迭代的性能,TFormBase.rectInsertClick()因为它不再需要TComponent使用每个对象来寻找FindComponent()

TFormBase = class(TForm)
private
  type TEventBeforeInsertPair = TPair<TComponent, TEventBeforeInsert>;
  FBeforeInsertEvents: TList<TEventBeforeInsertPair>;
  ...
public
  constructor Create;
  destructor Destroy; override;
  ...
end;

...

constructor TFormBase.Create;
begin
  inherited;
  FBeforeInsertEvents := TList<TEventBeforeInsertPair>.Create;
end;

destructor TFormBase.Destroy;
begin
  FBeforeInsertEvents.Free;
  inherited;
end;

function TFormBase.addStringField(AField: TFieldBase; ATab: TTabsNames): TFormBase;
var
  ...
  FEdit: TEdit;
  FEvent: TEventBeforeInsert;
begin
  ...
  FEdit := TEdit.Create(Self);
  ...

  FEvent := AField.EventBeforeInsert;
  if Assigned(FEvent) then
    FBeforeInsertEvents.Add(TEventBeforeInsertPair.Create(FEdit, FEvent));
end;

procedure TFormBase.rectInsertClick(Sender: TObject);
var
  Item: TEventBeforeInsertPair;
begin
  for Item in FBeforeInsertEvents do
  begin
    if not Item.Value(Item.Key, Self) then
      Exit;
  end;
end;

...

另外,您的TEvents.EditFillUser()方法与的定义不匹配TEventBeforeInsert的第一个参数TEventBeforeInsert声明为通过引用传递TComponent指针var(为什么?),但是的第一个参数EditFillUser()没有这样做。除非你想让你的事件处理程序,以改变什么TComponent指针指着(不会工作,你正在使用的方式TEventBeforeInsertTDictionary),则没有理由绕过TComponent通过指针var引用都:

TEventBeforeInsert = function(AComponent: TComponent; AForm: TForm): Boolean of Object;

同样,您对的使用TEvents.New似乎是内存泄漏,因为没有人拥有新创建的TEvents对象的所有权(除非其构造函数将对象添加到我们看不到的某些内部列表中)。与相同TFieldBase.New甚至TFormBase.New(假设关闭窗体时没有OnClose设置任何事件Action=caFree)。在某个时候,您需要调用您的Free()任何class对象Create()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

TEdit,Delphi中的唯一数字

来自分类Dev

如何在Delphi中获得TEdit的画布?

来自分类Dev

无法在delphi中更改TPanel的颜色

来自分类Dev

无法在Unity中更改文本的文本颜色

来自分类Dev

无法更改 js 中的文本,类文本

来自分类Dev

Android中的Delphi TEdit-在每个TEdit的基础上关闭自动大写

来自分类Dev

如何用TEdit(文本框)中的文本写入文件

来自分类Dev

TEdit属性变量delphi

来自分类Dev

TEdit的Delphi数组

来自分类Dev

无法在gedit中更改文本大小

来自分类Dev

无法在gedit中更改文本大小

来自分类Dev

无法在Java的JTextArea中更改文本

来自分类Dev

无法更改GVim中的默认文本宽度

来自分类Dev

无法更改setTimeout函数中的按钮文本

来自分类Dev

无法在 Angular 中更改按钮的文本

来自分类Dev

Delphi-无法更改Excel PivotField中的功能

来自分类Dev

在TEdit中为选定的文本使用样式化的SysColor

来自分类Dev

在Delphi中拖放文本

来自分类Dev

无法更改UITextField的文本

来自分类Dev

无法从div更改文本

来自分类Dev

无法更改UITextField文本

来自分类Dev

无法从div更改文本

来自分类Dev

无法更改jQuery Mobile中动态生成的按钮文本

来自分类Dev

无法在插槽中更改QLabel文本两次

来自分类Dev

无法在禁用的文本输入字段中更改CSS颜色属性

来自分类Dev

无法在文本字段中更改映射数据的值

来自分类Dev

无法在Microsoft Word 2010中更改文本颜色

来自分类Dev

CSS无法更改div类中的文本颜色

来自分类Dev

无法更改jQuery Mobile中动态生成的按钮文本