乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Delphi 中的自動(dòng)釋放策略

       獨(dú)孤求財(cái) 2012-03-30

      一、指定 Owner 后, 隨 Owner 連帶釋放:

      //uses Vcl.StdCtrls, Vcl.ExtCtrls;
      
      var
        panel: TPanel;
      
      procedure TForm1.Button1Click(Sender: TObject);
      begin
        panel := TPanel.Create(Self);
        panel.Parent := Self;
      
        with TButton.Create(panel) do //AOwner = panel
        begin
          Parent := panel;
          Caption := 'New Button';
        end;
      end;
      
      procedure TForm1.Button2Click(Sender: TObject);
      begin
        if Assigned(panel) then
          FreeAndNil(panel); //連帶釋放以它為 Owner 的對象
      end;


      二、使用接口:

      unit Unit1;
      
      interface
      
      uses
        Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
        Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
      
      type
        TForm1 = class(TForm)
          Button1: TButton;
          procedure Button1Click(Sender: TObject);
        end;
      
        //
        IBass = Interface
          function GetName: string;
          procedure SetName(const AName: string);
          property Name: string read GetName write SetName;
        end;
      
        //
        TBass = class(TInterfacedObject, IBass)
        private
          FName: string;
        protected
          function GetName: string;
          procedure SetName(const AName: string);
        public
          constructor Create(const AName: string);
        end;
      
      var
        Form1: TForm1;
      
      implementation
      
      {$R *.dfm}
      
      procedure TForm1.Button1Click(Sender: TObject);
      var
        X: IBass;
      begin
        X := TBass.Create('WanYi');
        ShowMessage(X.Name);
        X.Name := '萬一';
        ShowMessage(X.Name);
        {X 在此自動(dòng)釋放}
      end;
      
      { TBass }
      
      constructor TBass.Create(const AName: string);
      begin
        FName := AName;
      end;
      
      function TBass.GetName: string;
      begin
        Result := FName;
      end;
      
      procedure TBass.SetName(const AName: string);
      begin
        FName := AName;
      end;
      
      end.


      三、使用結(jié)構(gòu):

      unit Unit1;
      
      interface
      
      uses
        Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
        Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
      
      type
        TForm1 = class(TForm)
          Button1: TButton;
          procedure Button1Click(Sender: TObject);
        end;
      
        //
        TBass = record
        private
          FName: string;
          procedure SetName(const AName: string);
        public
          constructor Create(const AName: string);
          property Name: string read FName write SetName;
        end;
      
      var
        Form1: TForm1;
      
      implementation
      
      {$R *.dfm}
      
      procedure TForm1.Button1Click(Sender: TObject);
      var
        X: TBass;
      begin
        X := TBass.Create('WanYi');
        ShowMessage(X.Name);
        X.Name := '萬一';
        ShowMessage(X.Name);
        {X 在此自動(dòng)釋放}
      end;
      
      { TBass }
      
      constructor TBass.Create(const AName: string);
      begin
        FName := AName;
      end;
      
      procedure TBass.SetName(const AName: string);
      begin
        FName := AName;
      end;
      
      end.


      四、在 initialization 中建立、在 finalization 中釋放:

      unit Unit1;
      
      interface
      
      uses
        Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
        Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
      
      type
        TForm1 = class(TForm)
          Button1: TButton;
          procedure Button1Click(Sender: TObject);
        end;
      
      var
        Form1: TForm1;
      
      implementation
      
      {$R *.dfm}
      
      var
        List: TStringList;
      
      procedure TForm1.Button1Click(Sender: TObject);
      begin
        List.Clear;
        List.Add('WanYi');
        ShowMessage(List.Text);
      end;
      
      initialization
        List := TStringList.Create;
      finalization
        List.Free;
      
      end.


      五、使用動(dòng)態(tài)數(shù)組而不是 TList、TStringList 等:

      procedure TForm1.Button1Click(Sender: TObject);
      var
        arr: Array of string;
        i: Integer;
        s: string;
      begin
        for i := 0 to 6 do
        begin
          SetLength(arr, Length(arr)+1);
          arr[High(arr)] := StringOfChar(Char(i+65), 3);
        end;
        for s in arr do ShowMessage(s);
      end;
      
      procedure TForm1.Button2Click(Sender: TObject);
      var
        arr: TArray<string>;
        i: Integer;
        s: string;
      begin
        for i := 0 to 6 do
        begin
          SetLength(arr, Length(arr)+1);
          arr[High(arr)] := StringOfChar(Char(i+65), 3);
        end;
        for s in arr do ShowMessage(s);
      end;


      六、使用 TObjectList 而不是 TList:

      uses System.Contnrs;
      
      procedure TForm1.Button1Click(Sender: TObject);
      var
        list: TObjectList;
        i: Integer;
        btn: TButton;
      begin
        list := TObjectList.Create;
        for i := 0 to 6 do
        begin
          btn := TButton.Create(Self);
          with btn do begin
            Caption := Format('Btn %d', [i+1]);
            Parent := Self;
            Top := Height * i;
            Left := Width * i div 2;
          end;
          list.Add(btn);
        end;
        ShowMessage('TObjectList 釋放時(shí), 會同時(shí)釋放其中的對象');
        list.Free;
      end;
      
      procedure TForm1.Button2Click(Sender: TObject);
      var
        list: TList;
        i: Integer;
        btn: TButton;
      begin
        list := TList.Create;
        for i := 0 to 6 do
        begin
          btn := TButton.Create(Self);
          with btn do begin
            Caption := Format('Btn %d', [i+1]);
            Parent := Self;
            Top := Height * i;
            Left := Width * i div 2;
          end;
          list.Add(btn);
        end;
        ShowMessage('TList 釋放后, 其中的對象并未釋放');
        list.Free;
      end;


      七、使用 TObjectList<T> 而不是 TList<T>:

      uses System.Generics.Collections;
      
      procedure TForm1.Button1Click(Sender: TObject);
      var
        list: TObjectList<TButton>;
        i: Integer;
        btn: TButton;
      begin
        list := TObjectList<TButton>.Create;
        for i := 0 to 6 do
        begin
          btn := TButton.Create(Self);
          with btn do begin
            Caption := Format('Btn %d', [i+1]);
            Parent := Self;
            Top := Height * i;
            Left := Width * i div 2;
          end;
          list.Add(btn);
        end;
        ShowMessage('TObjectList 釋放時(shí), 會同時(shí)釋放其中的對象');
        list.Free;
      end;
      
      procedure TForm1.Button2Click(Sender: TObject);
      var
        list: TList<TButton>;
        i: Integer;
        btn: TButton;
      begin
        list := TList<TButton>.Create;
        for i := 0 to 6 do
        begin
          btn := TButton.Create(Self);
          with btn do begin
            Caption := Format('Btn %d', [i+1]);
            Parent := Self;
            Top := Height * i;
            Left := Width * i div 2;
          end;
          list.Add(btn);
        end;
        ShowMessage('TList 釋放后, 其中的對象并未釋放');
        list.Free;
      end;


      八、使用結(jié)構(gòu)體而不是結(jié)構(gòu)體指針:

      {假如某個(gè)函數(shù)的參數(shù)需要一個(gè)結(jié)構(gòu)指針}
      function Area(rect: PRect): Integer;
      begin
        Result := rect.Width * rect.Height;
      //  Result := rect^.Width * rect^.Height;
      end;
      
      {直接聲明指針并分配空間后需手動(dòng)釋放}
      procedure TForm1.Button1Click(Sender: TObject);
      var
        P: PRect;
      begin
        New(P);
        P^ := Rect(10, 10, 60, 50);
        ShowMessage(IntToStr(Area(P))); //2000
        Dispose(P);
      end;
      
      {}
      procedure TForm1.Button2Click(Sender: TObject);
      var
        R: TRect;
      begin
        R := Rect(10, 10, 60, 50);
        ShowMessage(IntToStr(Area(@R))); //2000
      end;

        本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多