Delphi 7 编辑组件创建

3
我有一个问题,关于在Delphi 7中运行时创建编辑组件。 当程序运行了“一段时间”后,创建TEdit组件就能正常工作。 然而,在Form的OnCreate事件中创建TEdit元素时,它们的高度是错误的。 此外,(几乎)同时创建的形状具有正确的高度。 红色标记的Edits是在Forms OnCreate过程中创建的,而其他Edits则是在另一个事件中创建的。 编辑:
procedure TTPLVisorForm.CreateZeichen(ZShape : TShape; ZEdit : TEdit; VLeft : integer);
begin
  with ZShape do
  begin
    Width := 50;
    Height := 50;
    Left := VLeft;
    Top := 25;
    Shape := stRectangle;
    Parent := self.Band;
    SendToBack();
  end;

  with ZEdit do
  begin
    Text := '#';
    Left := VLeft+1;
    Top := 26;
    Parent := self.Band;
    Font.Height := 48;
    Width := 48;
    Height := 48;
    SendToBack;
  end;
end;

被调用的方式:

procedure TZeichen.Anzeigen(Form : TObject; Left : integer);
begin
  self.Form := Form;

  self.ZShape := TShape.Create(TTPLVisorForm(self.Form).Band);
  self.ZEdit := TEdit.Create(TTPLVisorForm(self.Form).Band);

  TTPLVisorForm(Form).CreateZeichen(self.ZShape, self.ZEdit, Left);
end;

被调用的方法:

procedure TMagnetband.ErweitereRechts;
var
  Zeichen : TZeichenKette;
begin
  Zeichen := TZeichenKette.Create;
  self.LetztesZeichen.Naechstes := TZeichenKette(Zeichen);
  Zeichen.Vorheriges := self.LetztesZeichen;

  Zeichen.Zeichen.Anzeigen(self.Form,
                                      self.LetztesZeichen.Zeichen.ZShape.Left +
                                      self.LetztesZeichen.Zeichen.ZShape.Width +
                                      self.Padding);
  self.LetztesZeichen := Zeichen;
  self.Laenge := self.Laenge+1;
end;

再次被调用的方法:

procedure TTuringmaschine.ZeichenAnfuegen;
begin
  self.Magnetband.ErweitereRechts;
end;

被调用:

procedure TTuringmaschine.PanelResize(Sender: TObject);
begin
  while self.Magnetband.GetRechtsMax < self.Panel.Width do
    self.ZeichenAnfuegen;
end;

最后被调用的地方:

Constructor TTuringmaschine.Create(Form : TObject);
var
  Breite : integer;
begin
  self.Zustand := 0;
  self.Form := TTPLVisorForm(Form);
  self.Panel := TTPLVisorForm(self.Form).Band;
  self.Magnetband := TMagnetband.Create(self.Form);
  TTPLVisorForm(Form).Band.OnResize := self.PanelResize;

  self.PanelResize(Nil);
  //self.CreateMagnetkopf;
end;

构造函数可以在OnCreate事件或其他事件中调用。


2
不要让我们猜测你的代码。请提供一个简化的程序,以便重现问题。 - David Heffernan
1
请提供完整的程序,以便我们能够重现问题。 - David Heffernan
不,您能否提供一个可以立即运行的完整程序呢?为什么您不能这样做呢? - David Heffernan
CreateZeichen方法中,关闭你的ZEditAutoSize属性。当然,由于文本周围有间距,所以需要减小字体的高度,因此如果使用48像素的字体高度,就不能将控件的高度设置为48像素。40像素的字体高度适合该背景形状。 - TLama
关闭AutoSize就可以了!作为答案发布? - ltsstar
1个回答

5

TEdit控件中有一个文本边距,因此如果您将Font.Height设置为48,则如果控件的AutoSize属性设置为True,则控件的高度不会完全是48。我个人会减小字体的高度,并确保关闭AutoSize。您的CreateZeichen方法将如下所示:

procedure TTPLVisorForm.CreateZeichen(ZShape: TShape; ZEdit: TEdit;
  VLeft: Integer);
begin
  with ZShape do
  begin
    Width := 50;
    Height := 50;
    Left := VLeft;
    Top := 25;
    Shape := stRectangle;
    Parent := Self.Band;
    SendToBack;
  end;

  with ZEdit do
  begin
    AutoSize := False;
    Text := '#';
    Left := VLeft + 1;
    Top := 26;
    Parent := Self.Band;
    Font.Height := 40;
    Width := 48;
    Height := 48;
    SendToBack;
  end;
end;

我仍然不明白为什么同样的代码在后面调用时能够工作,但至少它让它工作了。谢谢! - ltsstar
我仍然不明白为什么同样的代码稍后调用时会工作。只有你有代码,才能理解它。请不要对我们隐藏代码。花时间给我们提供所有需要的信息。 - David Heffernan
@DavidHeffernan 我不想隐藏代码,但它目前分为8个单元。不过我很快会开一个git。 - ltsstar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接