• Delphi动态创建组件,并释放内存


    开发所用delphi版本是xe2,效果图如下:

    代码如下:

    -----------------------------------------------------------------------------------------------------------------

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Button1: TButton;
        Edit1: TEdit;
        Memo1: TMemo;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        function getmaxval(myarray: array of Integer):Integer;
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    var
      rec: Integer 0;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i,j,m,n,p:Integer;
      edt: TEdit;
      arr: array of Integer;
    begin
      Inc(rec);  //按钮点击次数
      m := 0;
      n := 0;
      p := 0;
      Memo1.Clear;
      for i := 0 to Panel1.ControlCount - 1 do
      begin
        if Panel1.Controls[i] is TEdit then
        inc(m);  //记录edit个数
      end;
      SetLength(arr,m);
      Memo1.Lines.Add('创建组件前的记录:' + #13#10 '--------------------------');
      Memo1.Lines.Add('Edit组件个数:' + IntToStr(m) + #13#10 '--------------------------');
      for j := 0 to Panel1.ControlCount - 1 do
      begin
        if Panel1.Controls[j] is TEdit then
        begin
          if n <= m then
          begin
            arr[n] := TEdit(Panel1.Controls[j]).Top;
            Memo1.Lines.Add('Edit' + IntToStr(n + 1) + '的Top值:' + IntToStr(arr[n]));
            Inc(n);
          end else Break;
        end;
      end;
      p := getmaxval(arr); //记录panel里最下面的edit的top值
      Memo1.Lines.Add('最大Top值:' + inttostr(p));
      //动态创建Edit
      //TEdit.Create(),参数是一个AOwner: TComponent,只要是窗体上的组件都可以,
      //但必须要在创建后重新指明父组件的名称,否则没法显示
      edt := TEdit.Create(Panel1);  //指明了owner,可以不释放内存,窗口关闭时由父组件销毁
      edt.Parent := Panel1;
      edt.Left := Edit1.Left;
      edt.Top := p + Edit1.Height + 3;
      edt.Width := Edit1.Width;
      edt.Height := Edit1.Height;
      edt.Text := 'Edit' + IntToStr(rec + 1);
      edt.Show;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);  //释放内存,并初始化
    var
      i,j,m:Integer;
      edts: array of TEdit;
    begin
      j := 0;  //数组edts的键[key]
      SetLength(edts,rec + 1);  //button1次数 + 原有的edit1
      for i := 0 to Panel1.ControlCount - 1 do
      begin
        if Panel1.Controls[i] is TEdit then
        begin
          edts[j] := TEdit(Panel1.Controls[i]);
          Inc(j);
        end;
      end;
      for m := Length(edts) downto 1 do  //edit1不释放,注意此处的downto,根据栈后进先出原则,否则会报错
      begin
        try
          edts[m].Free;
          rec := 0;
          Memo1.Clear;
        except
          //ShowMessage('释放动态创建组件的内存失败!');
        end;
      end;
    end;
     
    function TForm1.getmaxval(myarray: array of Integer):Integer;  //遍历数组取得最大值
    var
      i,max:Integer;
    begin
      max := myarray[0];
      for i := 1 to Length(myarray) - 1 do
      begin
        if myarray[i] >= max then
        max := myarray[i];
      end;
      Result := max;
    end;
     
    end.
  • 相关阅读:
    苹果和Google应该如何把二维码变成主流 | 36氪
    成绩换offer,中国版的Smarterer“一问一答”网站帮你把简历推荐给你想去的公司 | 36氪
    读过的一些书
    扫描QR码即可完成移动支付的LevelUp推出集合NFC、QR码等技术的移动支付终端,供商家免费使用 | 36氪
    “消息速递”团队推出“有声照片”,让照片同时拥有拍摄时的现场录音 | 36氪
    css3ps—ps直接生成css3 使用方法
    Google收购的Nik Software将会发力“服务器端图片处理”领域 | 36氪
    收藏本站
    让屏幕抖动一阵
    全中文日期显示
  • 原文地址:https://www.cnblogs.com/jijm123/p/11009010.html
Copyright © 2020-2023  润新知