我想让一个函数返回多个数值用什么方法好?(100分)

  • 主题发起人 主题发起人 sunyb
  • 开始时间 开始时间
S

sunyb

Unregistered / Unconfirmed
GUEST, unregistred user!
比如我传过去两个日期调用一个函数,函数里打开数据集进行查找,然后返回查找的多个结果
 
返回一个stringlist
 
procedure Test(d1, d2: TDateTime
var result1, result2: string);
begin
...
result1 := 'result1';
result2 := 'result2';
end;

-----
http://www.8421.org
 
例如下边的这个函数
function tfrmcontrol.getstrings(sqlstring: string): tstringlist;
begin
result := tstringlist.Create;
if tempquery.Active then
tempquery.Close;
tempquery.SQL.Clear;
tempquery.SQL.Add(sqlstring);
tempquery.Prepare;
tempquery.Open;
tempquery.First;
while not tempquery.Eof do
begin
result.Add(tempquery.fieldbyname(tempquery.Fields[0].FIELDname).asstring);
tempquery.Next;
end;
end;
 
将函数返回结果定义为可变数组类型,
在函数中用SetLength设定结果大小,
那么返回的个数=high(result)-low(result)+1,不就搞定了,太简单了!
 
返回一个结构体(record),或返回一个 TList
 
variant就可以了。
 
用结构体,最好不要用variant速度太慢
 
建议不要用TStringList,它是个对象,返回对象的话如果处理不好就会造成内存泄漏(用Result返回对象要自己写代码Free)。
同意张无忌的,用结构体作为结果返回。
其实答案无非两种,另一种就是qdyoung的方法。
 
按引用调用
或者用全局变量
 
同意djdsz,下面是我自已写的一段函数以供参考:
function TFZLRForm.GetXs(sTab, sField, sTj, sRField: string
iCase: integer):
variant;
//sTab:表名
//sField:字段名
//sTj:条件
//sRField:返回值所在的字段名
//iCase:返回字段类型,如果需要的话你可以返回无数不同类型的值
var
fJg : double;
sJg : string;
iJg : integer;
begin
fJg := 0;
iJg := 0;
sJg := '';
with Qcx do
begin
Close;
Sql.Clear;
Sql.Add('SELECT * FROM ' + sTab);
Sql.Add('WHERE ' + sField + '=''' + sTj + '''');
Open;
case iCase of
0: fJg := FieldByName(sRField).AsFloat;
1: sJg := FieldByName(sRField).AsString;
2: iJg := FieldByName(sRField).AsInteger;
end
{Case}
Close;
end;
case iCase of
0: Result := fJg;
1: Result := sJg;
2: Result := iJg;
end
{Case}
end;
 
procedure func1(var a: string;var b:integer;var c: boolean);
begin
a:='111111';
b:=1;
c:=true;
end
 
象WINDOWS API那样给它做个回调,把针对一个值的处理过程的地址传给它,让它每搜索到
一个值就调用一次这个处理过程……
type
TMyData = record
...
end;
TSearchProc = procedure(MyData: TMyData);

procedure SeachIt(SearchProc: TSearchProc);
var
thisData: TMyData;
begin
....
SearchProc(thisData);
...
end;

 
后退
顶部