Functionlarda 1 den fazla result mümkün mü?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Functionlarda 1 den fazla result mümkün mü?

Mesaj gönderen Glen »

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...?
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

result un bir pointer (işaretci) olursa içini istediğin gibi doldurabilirsin;


Ö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.
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

eğer function tanımlarken

Kod: Tümünü seç

function myfunc(param1:string;param2:integer;var param3:integer; var param4:string):boolean;
dersen param3 ve param4 çift taraflı çalışır. Yani bu functionu çağırırken

Kod: Tümünü seç

var
myinteger:integer;
mystring:string;
begin
myfunc('aasf', 12123, myinteger, mystring); 
...
ş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ç

Type
 TmyOpenArrayResult = array of string;
 TmyVariantOpenArrayResult =array of TVarRec;
....
Function myfunc1:TmyOpenArrayResult;

Function myfunc2:TmyVarianOpenArrayResult;
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Prosedür kullanmak daha mantıklı olur bence.
Ö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;
Prosedürün kullanacağı değişkenleri tanımlarken var derseniz, o değişkeni prosedür içinde değiştirebilirsiniz.

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;
Kolay gelsin...
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Bu da benden

Mesaj gönderen sabanakman »

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.

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;
kullanma şekli ise

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;
şeklinde bir örnek inşallah işe yarayabilir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Aynı veritipinde sonuç döndürecekse dinamik dizilerden de yararlanabilirsin.

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;
Kullanımı

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;
Hatta dönen değerlerin aynı tipte olmasına da gerek yok

Kod: Tümünü seç

type
  TMyResults = array of variant;
Variant türünden dinamik dizi de tanımlayabilirsin
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Mesaj gönderen Glen »

arkadaslar mesaji simdi okudum ve cevaplarini ve ilginizi görünce doğrusu şok oldum bu kadar beklemiyordum :)

çoğu mantığıma yattı ve de bayağı ihtiyacım vardı buna çok çok teşekkür ederim yardımlarınız için tekrar tekrar teşekkür ederim :)

Herkese kolay gelsin..
Cevapla