-5

ボタンがあり、クリックすると、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.
4

3 に答える 3

3

もちろん動作しません!

マシンを追加するコードは内部if not OkToAdd() thenにあるため、。の場合にのみ実行されますnot OkToAdd。しかし!この場合でもExit、コードを実行する前に!したがって、コードは実行されません。

おそらくあなたはそれがこのようになることを意味します:

if not OkToAdd then
begin
  ShowMessage('Please fill out form correctly!');
  Exit;
end; //END!!!!!!
于 2013-02-14T10:17:05.170 に答える
0

なぜこれで解決したのかは不明ですが、Machineの親を見つけようとした後

showmessage('Machine Parent: '+Machine.parent.name);

アクセスエラーが発生していました。

削除

Machine.parent := self;

コンパイル、ビルド。その後、再び追加されました

Machine.parent := self;

そしてすべてがうまくいった。

于 2013-02-15T05:40:24.587 に答える