Dinamik array kullanımı hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Dinamik array kullanımı hakkında

Mesaj gönderen adelphiforumz »

Selamlar

Genelde funsiyon yada procedurlerde aşağıdaki gibi bir yöntele dinamik array işlemleri kullanıyorum
tek boyutlu dinamik array olduğunda parametre olarak "[1,2,3...]" ifadesi içerisinde değer gönderilebilirken
type Record olarak tanımlanan array lerede aynı şekilde göndermenin bir yolu varmıdır
Yaptığım 2 farklı örneği aşağıda ekledim
Yardımlarınız için teşekkürler

Genelde kullandığım yapım fonkisyon

Kod: Tümünü seç

    function fndb_SQLQuery(pAdoQuery: TADOQuery; SQLText: String; const PValue: array of Variant; pDosyaAcmaSekli: TypeDosyaAcmaSekli = TypeOpen): Boolean;
...
...
...
function TfrmAnaForm.fndb_SQLQuery(pAdoQuery: TADOQuery; SQLText: String; const PValue: array of Variant; pDosyaAcmaSekli: TypeDosyaAcmaSekli): Boolean;
var
  i: Integer;
begin
  try
    with pAdoQuery do
    begin
      Close;
      SQL.Clear;
      SQL.Text := SQLText;

      for I := Low(PValue) to High(PValue) do
        Parameters[i].Value := PValue[i];
      if pDosyaAcmaSekli = TypeOpen Then
        Open;
      if pDosyaAcmaSekli = TypeExec Then
      begin
        ExecSQL;
        Close;
      end;
    end;

    Result := True;
  except
    on E: Exception do
    begin
      Result := False;
    end;
  end;
end;
Fonksiyonu çağırma şeklim

Kod: Tümünü seç

    frmAnaForm.fndb_SQLQuery(QryGenel, 'select * from Uyeler where Ad = :pAd and Soyad = :pSoyad', ['Ali', 'Veli'], TypeOpen);
Record array olarak kullandığımda ise

Kod: Tümünü seç

type TGridFilterRec = Record
    sColName:TcxGridDBColumn;
    foKosul:TcxFilterOperatorKind;
    vValue:Variant;
    vDisplayValue:Variant;
    fbokVarmi : Boolean;
    fbokBoolOperatorKind : TcxFilterBoolOperatorKind;
end;
...
...
...
    procedure pr_FiltercxGrid(_FilterIslemi:TypeFilter; _GridDBView:TcxGridDBTableView; const _FilterRec:array of TGridFilterRec);
...
...
...
procedure TEntityFunctions.pr_FiltercxGrid(_FilterIslemi:TypeFilter; _GridDBView:TcxGridDBTableView; const _FilterRec:array of TGridFilterRec);
var
  AItemList: TcxFilterCriteriaItemList;
  I : Integer;
begin
  with _GridDBView.DataController.Filter do
  begin
    BeginUpdate;
    try
      Root.Clear;
      if _FilterIslemi = FilterAktif then
      begin
          for I := 0 to High(_FilterRec) do
          begin
              if _FilterRec[I].fbokVarmi = True then
                  Root.BoolOperatorKind := _FilterRec[I].fbokBoolOperatorKind;
              if _FilterRec[I].vDisplayValue <> '' then
                  Root.AddItem(_FilterRec[I].sColName, _FilterRec[I].foKosul, _FilterRec[I].vValue, _FilterRec[I].vDisplayValue)
              else
                  Root.AddItem(_FilterRec[I].sColName, _FilterRec[I].foKosul, _FilterRec[I].vValue, VarToStr(_FilterRec[I].vValue));
          end;
      end;
    finally
      EndUpdate;
    end;
    Active := True;
  end;
end;

Fonksiyonu çağırma şeklim

Kod: Tümünü seç

var
  _FilterRec : array of TGridFilterRec;
begin
        SetLength(_FilterRec, 1);
        _FilterRec[0].sColName := ViewBekleyenSecim;
        _FilterRec[0].foKosul  := foEqual;
        _FilterRec[0].vValue   := True;
        _FilterRec[0].vDisplayValue := 'True';
        _FilterRec[0].fbokVarmi := False;
        EntityFunctions.pr_FiltercxGrid(FilterAktif, ViewBekleyen, _FilterRec);
acaba buna benzer bir şekilde çağırma yöntemi olabilirmi
EntityFunctions.pr_FiltercxGrid(FilterAktif, ViewBekleyen, [(ViewBekleyenSecim,foEqual,True,'True',False),(...).....]);
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Dinamik array kullanımı hakkında

Mesaj gönderen ertank »

Merhaba,

Ne sormak istediğinizi anlayamadım. Zaten dinamik record türünde parametre gönderdiğiniz zaman yapmak istediğinizi elde etmiş oluyorsunuz diye düşünüyorum.

Aşağıdaki şekilde (tek bir parametre olarak) kullanım için bilgim dahilinde dinamik record türünde parametre göndermeniz gerekli.

Kod: Tümünü seç

EntityFunctions.pr_FiltercxGrid(FilterStatus: TypeFilter; View: TcxGridDBTableView, Params: Array of TMyParamRecord);
Alternatif olarak her bir parametreyi dinamik array olarak tanımlayarak ayrı ayrı göndermeyi deneyebilirsiniz.

Kod: Tümünü seç

EntityFunctions.pr_FiltercxGrid(FilterStatus: TypeFilter; View: Array of TcxGridDBTableView; Condition: Array of TCondition; vValue: Array of Boolean; DisplayValue: Array of string; OK: Array of Boolean);
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Dinamik array kullanımı hakkında

Mesaj gönderen adelphiforumz »

"ertank" hocam sorun sizin yaptığınız aşağıdaki fonksiyonu çağırmakta

Kod: Tümünü seç

EntityFunctions.pr_FiltercxGrid(FilterStatus: TypeFilter; View: TcxGridDBTableView, Params: Array of TMyParamRecord);
fonsiyonunu çağırırken "Params: Array of TMyParamRecord" parametresine birden fazla veriyi nasıl göndericez
mutlaka setlength'mi yapmak lazım
yoksa "[x,y,x,...] gibi bir yolu varmı
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Dinamik array kullanımı hakkında

Mesaj gönderen ertank »

Record türlerini dinamik array olarak kullanabilmek için SetLength() fonksiyonu ile kaç kopya olarak hafızada yer ayrılması gerektiğini belirtmek gerekli. SetLength() programcıya yardımcı olarak hafızadan record için gerekli yer ayırır. Ancak Create edilmesi gereken bileşenler için sadece pointer boyutunda yer ayırır.

Aşağıdaki örnek basitçe Create gerektiren kullanım şeklini göstermektedir. Örneğin çalışması için form üzerinde Memo1 atında bir TMemo bileşeni olması gerekmektedir. Örnek Delphi 10.1 Update 2 üzerinde çalışmaktadır.

Kod: Tümünü seç

procedure TForm1.FillMemo(Rec: TArray<TMyRecord>);
var
  i: Integer;
begin
  Memo1.Lines.Clear();

  // Boş array kullanılamaz
  if Length(Rec) = 0 then Exit();

  for I := Low(Rec) to High(Rec) do
  begin
    Memo1.Lines.Add('Indeks: ' + i.ToString());
    if Assigned(Rec[i].List) then
      Memo1.Lines.Add('List: ' + QuotedStr(Rec[i].List.CommaText))
    else
      Memo1.Lines.Add('List: (atama yapılmamış)');
    Memo1.Lines.Add('Param1: ' + QuotedStr(Rec[i].Param1));
    Memo1.Lines.Add('Param2: ' + QuotedStr(BoolToStr(Rec[i].Param2, True)));
    Memo1.Lines.Add(EmptyStr);
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  ARec: TArray<TMyRecord>;
  i: Integer;
begin
  ReportMemoryLeaksOnShutdown := True;

  SetLength(ARec, 6);
  ARec[0].List := TStringList.Create();
  ARec[0].Param1 := 'True';
  ARec[0].Param2 := True;

  ARec[1].List := TStringList.Create();
  ARec[1].List.Add('test');
  ARec[1].Param1 := EmptyStr;
  ARec[1].Param2 := False;

  ARec[2].List := TStringList.Create();
  ARec[2].Param1 := 'False';
  ARec[2].Param2 := False;

  ARec[3].List := nil;
  ARec[3].Param1 := 'False';
  ARec[3].Param2 := False;

  ARec[4].List := TStringList.Create();
  ARec[4].List.Add('test1');
  ARec[4].List.Add('test2');
  ARec[4].List.Add('test3');
  ARec[4].Param1 := 'True';
  ARec[4].Param2 := True;

  // 5 numaralı Array içini sonucunu gözlemlemek adına
  // bilinçli olarak doldurmuyoruz.

  FillMemo(ARec);

  // Hafızayı temizlemeyi unutma
  for I := Low(ARec) to High(ARec) do
    ARec[i].List.Free();
end;
Cevapla