Functionlarda 1 den fazla result mümkün mü?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Functionlarda 1 den fazla result mümkün mü?
Selam arkadaslar,
Bildigim kadariyla functionlar sadece 1 tane result döndürebiliyor.
1 den fazla result döndürülebilir mi functionarda ?
Result[0] := 'ahmet';
Result[1] := 1965;
gibi...?
Bildigim kadariyla functionlar sadece 1 tane result döndürebiliyor.
1 den fazla result döndürülebilir mi functionarda ?
Result[0] := 'ahmet';
Result[1] := 1965;
gibi...?
result un bir pointer (işaretci) olursa içini istediğin gibi doldurabilirsin;
Örneğin
İstediğiniz bu budur bilmem işe yarıyor ama.
Örneğin
function ParcalaBehcet(myData:String):Tstrings;
Var
myResult:TStringList;
begin
myResult:=TStringList.Create;
myResult.Add(myData+' sonuç1');
myResult.add(myData+' sonuç2');
myResult.add(myData+' sonuç3');
result:=myResult;
end;
procedure TForm1.Button1Click(Sender: TObject);
Var
Sonuc:TStrings;
begin
Sonuc:=ParcalaBehcet('basit saçma örnek');
Showmessage(Sonuc.Strings[2]);
sonuc.free;
end;
İstediğiniz bu budur bilmem işe yarıyor ama.
eğer function tanımlarken
dersen param3 ve param4 çift taraflı çalışır. Yani bu functionu çağırırken
şeklinde bir çağırımla myfunc içinden myinteger ve mystring değişkenlerini sanki o functionun içindeymiş gibi değiştirebilirsin.
Yöntem 2:
Open array parameters yöntemiyle sonuç döndürebilirsin. Bu yöntem ile sadece tek tip değişken dizisi gönderebilirsin. Ama variant open array parameters ile aynı dizi içinde değişik tiplerde değişken döndürebilirsin. Yanlız variant open array paramaters kullanmak biraz sancılı. String'i Pansichar() şeklinde geçirmek gerekiyor. Bazı tipleride bu şekilde pointerla geçirmek gerekiyor. Bu tiplerin kullanımını help'ten bakabilirsin.
Kod: Tümünü seç
function myfunc(param1:string;param2:integer;var param3:integer; var param4:string):boolean;
Kod: Tümünü seç
var
myinteger:integer;
mystring:string;
begin
myfunc('aasf', 12123, myinteger, mystring);
...
Yöntem 2:
Open array parameters yöntemiyle sonuç döndürebilirsin. Bu yöntem ile sadece tek tip değişken dizisi gönderebilirsin. Ama variant open array parameters ile aynı dizi içinde değişik tiplerde değişken döndürebilirsin. Yanlız variant open array paramaters kullanmak biraz sancılı. String'i Pansichar() şeklinde geçirmek gerekiyor. Bazı tipleride bu şekilde pointerla geçirmek gerekiyor. Bu tiplerin kullanımını help'ten bakabilirsin.
Kod: Tümünü seç
Type
TmyOpenArrayResult = array of string;
TmyVariantOpenArrayResult =array of TVarRec;
....
Function myfunc1:TmyOpenArrayResult;
Function myfunc2:TmyVarianOpenArrayResult;
Prosedür kullanmak daha mantıklı olur bence.
Örnek bir kod yazayım;Prosedürün kullanacağı değişkenleri tanımlarken var derseniz, o değişkeni prosedür içinde değiştirebilirsiniz.
Kolay gelsin...
Örnek bir kod yazayım;
Kod: Tümünü seç
procedure DosyaAdiYolu(Dosya: String; var Ad: String; var Yol: String);
var
i: Integer;
begin
For i:=1 To length(Dosya) do
Begin
if copy(Dosya,i,1)='\' Then
begin
Ad := copy(Dosya,i+1,length(Dosya)-i-4);
Yol := copy(Dosya,1,i-1);
End;
End;
end;
Kod: Tümünü seç
var
Dosya: String;
DYolu: String;
DAdi: String;
begin
Dosya := 'C:\Deneme.txt';
DosyaAdiYolu(Dosya,DAdi,DYolu);
Form1.Caption := 'Yol:' + DYolu + ', Ad:' + DAdi;
//formun başlığında 'Yol:C:, Ad:Deneme.txt' yazar
end;
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Bu da benden
Aslında tüm çözümler hedefe götürür ama şık bir tercih düşünürsen kendi veri yapını oluşturup onu kullan derim.
kullanma şekli ise
şeklinde bir örnek inşallah işe yarayabilir.
Kod: Tümünü seç
type
TDosya=record
Ad,Yol,Uzantı:String;
Boyut:Integer;
end;
function StrToDosya(const DosyaAdi:String):TDosya;
var i:Integer;
begin
Result.Ad:=ExtractFileName(DosyaAdi);
Result.Yol:=ExtractFilePath(DosyaAdi);
Result.Uzanti:=ExtractFileExt(DosyaAdi);
Result.Boyut:=FileSize(DosyaAdi);
i:=Pos(Result.Uzanti,Result.Ad);
if i>0 then Result.Ad:=Copy(Result.Ad,1,i-1);
end;
function DosyaToStr(const Dosya:TDosya):String;{istenen örnek için gereği yok ama ben olsun istedim}
begin
with Dosya do Result:=Yol+Ad+Uzanti;
end;
Kod: Tümünü seç
var Dosya:TDosya;
begin
Dosya:=StrToDosya('c:\genel\deneme.txt');
ShowMessage(Format('%s -> %d byte',[DosyaToStr(Dosya),Dosya.Boyut]));
end;
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Aynı veritipinde sonuç döndürecekse dinamik dizilerden de yararlanabilirsin.
Uses'a Types ekledikten sonra:
Kullanımı
Hatta dönen değerlerin aynı tipte olmasına da gerek yok
Variant türünden dinamik dizi de tanımlayabilirsin
Uses'a Types ekledikten sonra:
Kod: Tümünü seç
function ToArray(S: String): TStringDynArray;
var
i : integer;
begin
SetLength(Result,Length(S));
For i := 1 to length(s) do
Result[i-1] := S[i];
end;
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
var
arr : TStringDynArray;
i :integer;
begin
arr := ToArray('deneme');
for i := low(arr) to high(Arr) do
ShowMessage(Arr[i]);
end;
Kod: Tümünü seç
type
TMyResults = array of variant;