在运行时期间使形状显示在表单上

时间:2013-02-14 10:13:19

标签: delphi delphi-xe2

我有一个按钮,当点击时,我想要一个TMachine(又名TShape)出现在表格上。当前我没有错误,但它从未出现在表格上。

按钮代码

procedure TfDeptLayout.bAddMachineClick(Sender: TObject);
var
  machine: TMachine;
  shapeAsset,
  shapeShape,
  shapeNumber,
  shapeName: string;
begin
  if not OkToAdd() then
  begin
    ShowMessage('Please fill out form correctly!');
    Exit;
  end;

  ShapeAsset := Edit2.text;
  ShapeShape := Combobox1.Text;
  ShapeNumber := Edit3.Text;
  ShapeName := Edit1.Text;

  if sub = false then
    begin
      machine := TMachine.Create(self);
      machine.Parent := Self;
      machine.PlaceShape(0, FDB.GetWW(ShapeShape), FDB.GethW(ShapeShape), 
        '20', '20', ShapeName, ShapeNumber, ShapeAsset)
      //show save button
      //lockout add machine button
      //let user place machine top / left.
      //save all locations
      //save top and left for each tmachine to database
      //lockout save button
      //show add machine button
    end;

  if sub then
    ShowMessage('auto save form');

  ShowMessage('congrats you added a machine');        
end;

如果需要我可以展示TMachine单元吗?..

type    
  TMachine = class(TShape)
  private
    FOnMouseEnter: TNotifyEvent;
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
  protected
    procedure DoMouseEnter; virtual;
  published
    property OnMouseEnter: TNotifyEvent Read FOnMouseEnter write FOnMouseEnter;
  public
    mnName: string;
    mnAsset: string;
    mnNumber: string;
    mnIsPanel: string;
    mnBasicName: string;
    mnLShape: string;
    procedure PlaceShape(AM, sizeW, sizeH: Integer; ptop, pleft, name, order, 
      asset: string);
  end;

implementation

uses
  deptlayout;

procedure TMachine.CMMouseEnter(var Message: TMessage);
begin
  DoMouseEnter;
  inherited;
end;

procedure TMachine.DoMouseEnter;
begin
  if Assigned(FOnMouseEnter) then
    FOnMouseEnter(Self);
end;

procedure TMachine.PlaceShape(AM, sizeW, sizeH: Integer; ptop, pleft, name, 
  order, asset: string);
var
  myLabel: TLabel;
begin
  if ptop = '0' then
    Top := 136
  else
    Top := StrToInt(ptop);

  Width := sizeW;
  Height := sizeH;

  if pleft = '0' then
    Left := MyDataModule.fDB.LastX + 2  //set left
  else
    Left := StrToInt(pleft);

  MyDataModule.fDB.lastx := Left + sizeW;

  if AM = 1 then  //if in edit mode..
  begin
    //create label put inside the shape.
    myLabel := TLabel.Create(FDeptLayout);
    mylabel.Parent := FDeptLayout;
    mylabel.Left := Left;
    mylabel.Top := Top + 8;
    mylabel.Caption := '#' + mnNumber;
  end;
end;

end.

3 个答案:

答案 0 :(得分:3)

当然它不起作用!

添加计算机的代码位于if not OkToAdd() then内,因此仅在not OkToAdd时运行。但!即使是这种情况,也可以在运行代码之前Exit!因此,代码永远不会运行!

可能你的意思是这样:

if not OkToAdd then
begin
  ShowMessage('Please fill out form correctly!');
  Exit;
end; //END!!!!!!

答案 1 :(得分:3)

总结我上面的评论:

将您对fDeptLayout的引用更改为Self,就像您在编辑中所做的那样:

procedure TfDeptLayout.bAddMachineClick(Sender: TObject);
var
  machine : TMachine;
  shapeAsset,
  shapeShape,
  shapeNumber,
  shapeName : string;
begin
if not OkToAdd() then
begin
  showmessage('Please fill out form correctly!');
  Exit;
End;

  shapeAsset := edit2.text;
  ShapeShape := Combobox1.Text;
  ShapeNumber := Edit3.Text;
  ShapeName := Edit1.Text;

  if sub = false then
    begin
      machine := TMachine.Create(self);
      machine.Parent := Self;
      machine.PlaceShape(0,FDB.GetWW(ShapeShape),FDB.GethW(ShapeShape),'20','20',ShapeName,ShapeNumber,ShapeAsset)
      //show save button
      //lockout add machine button
      //let user place machine top / left.
      //save all locations
      //save top and left for each tmachine to database
      //lockout save button
      //show add machine button
    end;

  if sub then
      showmessage('auto save form');

showmessage('congrats you added a machine');


end;

为了避免将来出现混淆,请删除Delphi IDE为除主表单以外的所有表单创建的全局表单变量,以及任何其他自动处理表单 - 如果需要它们很少,并且“污染命名空间”

答案 2 :(得分:0)

未知原因解决了这个问题,但是在尝试通过放置

找到Machine的父级之后
showmessage('Machine Parent: '+Machine.parent.name);

它提供了访问错误。

已删除

Machine.parent := self;

编译,构建。然后重新加载

Machine.parent := self;

一切正常。