DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: laidabin
今日帖子: 1
在线用户: 9
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 tianpanhaha (tianpanhaha) ▲▲▲▲△ -
普通会员
2019/4/14 20:04:51
标题:
请问一下各位,如何把多个函数合并成1个,代码如下。 浏览:1646
加入我的收藏
楼主:
unit Unit1;

interface

uses
  Vcl.Forms,
  Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
  private
    {Private declarations}
  public
    {Public declarations}
  end;

var
  Form1: TForm1;

type
  TArrayInt = array of Integer;
  TArrayStr = array of string;

//这2个函数一样的内容,只不过参数不一样,内容都一样的,如何合并成1个呢?
procedure Analyze(AStr: string; var AStruct: TArrayInt); overload;
procedure Analyze(AStr: string; var AStruct: TArrayStr); overload;

implementation

{$R *.dfm}


procedure Analyze(AStr: string; var AStruct: TArrayInt); overload;
var
  I: Integer;
begin
  for I := 0 to 100 do
  begin
    Form1.Caption := I.ToString;
  end;
  SetLength(AStruct, 10);
end;

procedure Analyze(AStr: string; var AStruct: TArrayStr); overload;
var
  I: Integer;
begin
  for I := 0 to 100 do
  begin
    Form1.Caption := I.ToString;
  end;
  SetLength(AStruct, 10);
end;

end.
----------------------------------------------
 QQ群:325010556 欢迎加入。
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2019/4/14 22:02:12
1楼: 低版本用 variant,高版本用泛型 ~
----------------------------------------------
-
作者:
男 tianpanhaha (tianpanhaha) ▲▲▲▲△ -
普通会员
2019/4/15 15:09:42
2楼: 泛型就这个例子,能具体一点吗
----------------------------------------------
 QQ群:325010556 欢迎加入。
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2019/4/17 17:35:29
3楼: procedure Analyze<T>(AStr: string; var AStruct: TArray<T>);
----------------------------------------------
-
作者:
男 tianpanhaha (tianpanhaha) ▲▲▲▲△ -
普通会员
2019/4/17 18:04:48
4楼: 楼上的大兄弟,函数内容能写出来一下吗?
----------------------------------------------
 QQ群:325010556 欢迎加入。
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2019/4/17 18:52:09
5楼: 楼上的大兄弟,函数内容你不是说一模一样吗?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 tianpanhaha (tianpanhaha) ▲▲▲▲△ -
普通会员
2019/4/18 21:11:12
6楼: 盒子多了楼上这种自命清高的沙雕,真是悲惨。
----------------------------------------------
 QQ群:325010556 欢迎加入。
作者:
男 feiyanm (feiyanm) ▲▲▲▲▲ -
普通会员
2019/4/19 13:53:59
7楼: 广告位出租,别的就不说了。。。
----------------------------------------------
Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!我去WC吐一会儿去!
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2019/4/20 17:49:53
8楼: Type
  TAnalyze<T> = procedure(AStr: string; var AStruct: TArray<T>); 

其它看帮助吧,记住泛型本身不支持RTTI,只有泛型实例支持RTTI。
所以不能根据T来判断数据类型,老老实实写出每个数据类型的实现函数。

procedure AnalyzeString(AStr: string; var AStruct: TArray<string>);
begin

end;

procedure AnalyzeString(AStr: string; var AStruct: TArray<Integer>);
begin

end;
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/4/21 13:39:42
9楼: i: Integer; i.ToString() 能在Delphi中编译通过吗?……
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2019/4/21 14:33:22
10楼: 不知道楼主想做什么?其实你可以看看Generics.Collections/Generics.Defaults单元。
下面是个简单的例子,在Rad10.2运行通过:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Rtti;

type
  TGenericTest = class
  public
    class function Print<T>(const A: TArray<T>): string;
  end;

  TMyObject = class
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

class function TGenericTest.Print<T>(const A: TArray<T>): string;
var
  i: Integer;
  val: TValue;
  obj: TObject;
  s: string;
begin
  Result := '';
  for i := Low(A) to High(A) do begin
    val := TValue.From(A[i]);
    //s := val.ToString;  //如果是对象,只能显示类名+地址
    if val.IsObject then begin
      obj := val.AsObject;
      if (obj is TComponent) and (TComponent(obj).Name <> '') then begin
        s := Format('%s @ %p', [TComponent(obj).Name, Pointer(obj.ClassType)]);
      end else begin
        s := val.ToString;
      end;
    end else begin
      s := val.ToString;
    end;
    Result := Format('%s'#13#10'%s', [Result, s]);
  end;
  Delete(Result, 1, 2);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  A: TArray<Integer>;
  B: TArray<string>;
  C: TArray<TObject>;
  myObj: TMyObject;
begin
  SetLength(A, 5);
  A[0] := 92398;
  A[1] := 283;
  A[2] := 3743;
  A[3] := 5712;
  A[4] := 439;
  ShowMessage('Integer: '#13#10 + TGenericTest.Print<Integer>(A));

  SetLength(B, 3);
  B[0] := 'string 1';
  B[1] := 'string 2';
  B[2] := 'string 3';
  ShowMessage('String: '#13#10 + TGenericTest.Print<string>(B));

  myObj := TMyObject.Create;
  try
    SetLength(C, 3);
    C[0] := Button1;
    C[1] := Self;
    C[2] := myObj;
    ShowMessage('Object: '#13#10 + TGenericTest.Print<TObject>(C));
  finally
    myObj.Free;
  end;
end;

end.
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2019/4/22 8:56:19
11楼: 被我踢了的人,基本上都喜欢喷我。
----------------------------------------------
(C)(P)Flying Wang
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行72.26563毫秒 RSS