Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
ARRAYi nasıl for'la dönerim.
#11
Problemi çözemedm yardım eden kimse yok mu 
Hala aynı yerdeyim Cry
Cevapla
#12
Array of variant veya TArray<T> olarak kullanabilirsin veya TDictionary var bunları inceleyebilirsin.
İmam Süleyman Yakub <--> Molla Mustafa Mansur
Evlatlarım!
Cismanımız TÜRK ruhumuz ise İSLAM.
Bu yolda daim olalım her an.
Cevapla
#13
Merhaba.

Ama siz de bize yardımcı olmuyorsunuz ki ...

oku(INTARRAY); veya oku(FLOATARRAY );  dediğiniz zaman bir amaç bekliyoruz. 

- Bu varsayalım sesli okuma olsa bile bilgisayarın hoparlörü aracılığıyla size hizmet eder. 

- Procedure veya Function olarak verdiğini parametre ARRAY'ın Variant benzeri bir yapıda olmasını öngörüyorsun anladık ama fonksiyon ise cevabı ne olacak. Procedure ise nereye hizmet edecek...

- Şimdi vereceğim bilgi hazır lokmadan ziyade araştırma için yolunu kaybetmiş kişilere başlama noktası olsun  Smile

System UNIT'de aşağıdaki şekilde VARIANT tip tanımları yer alır. Buradan feyz alarak şunu yapabilirsiniz.

const
{ Variant type codes (wtypes.h) }

 varEmpty    = $0000; { vt_empty        0 }
 varNull     = $0001; { vt_null         1 }
 varSmallint = $0002; { vt_i2           2 }
 varInteger  = $0003; { vt_i4           3 }
 varSingle   = $0004; { vt_r4           4 }
 varDouble   = $0005; { vt_r8           5 }
 varCurrency = $0006; { vt_cy           6 }
 varDate     = $0007; { vt_date         7 }
 varOleStr   = $0008; { vt_bstr         8 }
 varDispatch = $0009; { vt_dispatch     9 }
 varError    = $000A; { vt_error       10 }
 varBoolean  = $000B; { vt_bool        11 }
 varVariant  = $000C; { vt_variant     12 }
 varUnknown  = $000D; { vt_unknown     13 }
//varDecimal  = $000E; { vt_decimal     14 } {UNSUPPORTED as of v6.x code base}
//varUndef0F  = $000F; { undefined      15 } {UNSUPPORTED per Microsoft}
 varShortInt = $0010; { vt_i1          16 }
 varByte     = $0011; { vt_ui1         17 }
 varWord     = $0012; { vt_ui2         18 }
 varLongWord = $0013  { vt_ui4         19 } {deprecated 'use varUInt32'} ;
 varUInt32   = $0013; { vt_ui4         19 }
 varInt64    = $0014; { vt_i8          20 }
 varUInt64   = $0015; { vt_ui8         21 }
 varRecord   = $0024; { VT_RECORD      36 }
{  if adding new items, update Variants' varLast, BaseTypeMap and OpTypeMap }

 varStrArg   = $0048; { vt_clsid        72 }
 varObject   = $0049; {                 73 }
 varUStrArg  = $004A; {                 74 }
 varString   = $0100; { Pascal string  256 } {not OLE compatible }
 varAny      = $0101; { Corba any      257 } {not OLE compatible }
 varUString  = $0102; { Unicode string 258 } {not OLE compatible }
 // custom types range from $110 (272) to $7FF (2047)

 varTypeMask = $0FFF;
 varArray    = $2000;
 varByRef    = $4000;


SYSTEM bize referans olduğunda göre aynı bilgiyi burada kullanarak şunu yapabilirsiniz.


procedure MevlanaArray( aArrayParam: Variant );
Var
  i          : Integer;
  iType      : Integer;
  strType    : String;
begin
  ShowMessageFmt('Başı: %d, Sonu: %d', [ VarArrayLowBound(aArrayParam, 1), VarArrayHighBound(aArrayParam, 1) ]);
 
  for i := VarArrayLowBound(aArrayParam, 1) to VarArrayHighBound(aArrayParam, 1)
  do begin
    iType := VarType( aArrayParam[i] );    
    case iType of
      varEmpty    : strType := 'varEmpty   '; // $0000; { vt_empty        0 }
      varNull     : strType := 'varNull    '; // $0001; { vt_null         1 }
      varSmallint : strType := 'varSmallint'; // $0002; { vt_i2           2 }
      varInteger  : strType := 'varInteger '; // $0003; { vt_i4           3 }
      varSingle   : strType := 'varSingle  '; // $0004; { vt_r4           4 }
      varDouble   : strType := 'varDouble  '; // $0005; { vt_r8           5 }
      varCurrency : strType := 'varCurrency'; // $0006; { vt_cy           6 }
      varDate     : strType := 'varDate    '; // $0007; { vt_date         7 }
      varOleStr   : strType := 'varOleStr  '; // $0008; { vt_bstr         8 }
      varDispatch : strType := 'varDispatch'; // $0009; { vt_dispatch     9 }
      varError    : strType := 'varError   '; // $000A; { vt_error       10 }
      varBoolean  : strType := 'varBoolean '; // $000B; { vt_bool        11 }
      varVariant  : strType := 'varVariant '; // $000C; { vt_variant     12 }
      varUnknown  : strType := 'varUnknown '; // $000D; { vt_unknown     13 }
    //varDecimal  : strType := 'varDecimal '; // $000E; { vt_decimal     14 } {UNSUPPORTED as of v6.x code base}
    //varUndef0F  : strType := 'varUndef0F '; // $000F; { undefined      15 } {UNSUPPORTED per Microsoft}
      varShortInt : strType := 'varShortInt'; // $0010; { vt_i1          16 }
      varByte     : strType := 'varByte    '; // $0011; { vt_ui1         17 }
      varWord     : strType := 'varWord    '; // $0012; { vt_ui2         18 }
    //varLongWord : strType := 'varLongWord'; // $0013  { vt_ui4         19 } {deprecated 'use varUInt32'} ;
      varUInt32   : strType := 'varUInt32  '; // $0013; { vt_ui4         19 }
      varInt64    : strType := 'varInt64   '; // $0014; { vt_i8          20 }
      varUInt64   : strType := 'varUInt64  '; // $0015; { vt_ui8         21 }
      varRecord   : strType := 'varRecord  '; // $0024; { VT_RECORD      36 }
      varStrArg   : strType := 'varStrArg  '; // $0048; { vt_clsid        72 }
      varObject   : strType := 'varObject  '; // $0049; {                 73 }
      varUStrArg  : strType := 'varUStrArg '; // $004A; {                 74 }
      varString   : strType := 'varString  '; // $0100; { Pascal string  256 } {not OLE compatible }
      varAny      : strType := 'varAny     '; // $0101; { Corba any      257 } {not OLE compatible }
      varUString  : strType := 'varUString '; // $0102; { Unicode string 258 } {not OLE compatible }
      varTypeMask : strType := 'varTypeMask'; // $0FFF;
      varArray    : strType := 'varArray   '; // $2000;
      varByRef    : strType := 'varByRef   '; // $4000;    
    end;
    
    case iType of
      varDouble    : ShowMessage( FloatToStr(aArrayParam[i]) );
      varOleStr    : ShowMessage( aArrayParam[i] );
      varInteger   : ShowMessage( IntToStr(aArrayParam[i]) );
      varDate      : ShowMessage( DateTimeToStr( aArrayParam[i] ) );
      varEmpty     : ShowMessage( 'içinde hiç veri yok' );
      else ShowMessageFmt(' Tipini bilemedim... TypeID = %d (%s) ', [iType, strType] );
    end;
  end;
end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  VarArray  : Variant;
begin
  VarArray := VarArrayCreate( [0, 4 - 1], varVariant );
  
  VarArray[0] := String   ( 'Muharrem' );
  VarArray[1] := Integer  ( 1973       );
  VarArray[2] := TDateTime( Now()      );
  VarArray[3] := Double   ( 0.127      );
  
  MevlanaArray( VarArray );
 
  VarClear( VarArray );
end;

Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#14
(07-10-2018, Saat: 13:10)mrmarman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merhaba.

Ama siz de bize yardımcı olmuyorsunuz ki ...

oku(INTARRAY); veya oku(FLOATARRAY );  dediğiniz zaman bir amaç bekliyoruz. 

- Bu varsayalım sesli okuma olsa bile bilgisayarın hoparlörü aracılığıyla size hizmet eder. 

- Procedure veya Function olarak verdiğini parametre ARRAY'ın Variant benzeri bir yapıda olmasını öngörüyorsun anladık ama fonksiyon ise cevabı ne olacak. Procedure ise nereye hizmet edecek...

- Şimdi vereceğim bilgi hazır lokmadan ziyade araştırma için yolunu kaybetmiş kişilere başlama noktası olsun  Smile

System UNIT'de aşağıdaki şekilde VARIANT tip tanımları yer alır. Buradan feyz alarak şunu yapabilirsiniz.

const
{ Variant type codes (wtypes.h) }

 varEmpty    = $0000; { vt_empty        0 }
 varNull     = $0001; { vt_null         1 }
 varSmallint = $0002; { vt_i2           2 }
 varInteger  = $0003; { vt_i4           3 }
 varSingle   = $0004; { vt_r4           4 }
 varDouble   = $0005; { vt_r8           5 }
 varCurrency = $0006; { vt_cy           6 }
 varDate     = $0007; { vt_date         7 }
 varOleStr   = $0008; { vt_bstr         8 }
 varDispatch = $0009; { vt_dispatch     9 }
 varError    = $000A; { vt_error       10 }
 varBoolean  = $000B; { vt_bool        11 }
 varVariant  = $000C; { vt_variant     12 }
 varUnknown  = $000D; { vt_unknown     13 }
//varDecimal  = $000E; { vt_decimal     14 } {UNSUPPORTED as of v6.x code base}
//varUndef0F  = $000F; { undefined      15 } {UNSUPPORTED per Microsoft}
 varShortInt = $0010; { vt_i1          16 }
 varByte     = $0011; { vt_ui1         17 }
 varWord     = $0012; { vt_ui2         18 }
 varLongWord = $0013  { vt_ui4         19 } {deprecated 'use varUInt32'} ;
 varUInt32   = $0013; { vt_ui4         19 }
 varInt64    = $0014; { vt_i8          20 }
 varUInt64   = $0015; { vt_ui8         21 }
 varRecord   = $0024; { VT_RECORD      36 }
{  if adding new items, update Variants' varLast, BaseTypeMap and OpTypeMap }

 varStrArg   = $0048; { vt_clsid        72 }
 varObject   = $0049; {                 73 }
 varUStrArg  = $004A; {                 74 }
 varString   = $0100; { Pascal string  256 } {not OLE compatible }
 varAny      = $0101; { Corba any      257 } {not OLE compatible }
 varUString  = $0102; { Unicode string 258 } {not OLE compatible }
 // custom types range from $110 (272) to $7FF (2047)

 varTypeMask = $0FFF;
 varArray    = $2000;
 varByRef    = $4000;


SYSTEM bize referans olduğunda göre aynı bilgiyi burada kullanarak şunu yapabilirsiniz.


procedure MevlanaArray( aArrayParam: Variant );
Var
  i          : Integer;
  iType      : Integer;
  strType    : String;
begin
  ShowMessageFmt('Başı: %d, Sonu: %d', [ VarArrayLowBound(aArrayParam, 1), VarArrayHighBound(aArrayParam, 1) ]);
 
  for i := VarArrayLowBound(aArrayParam, 1) to VarArrayHighBound(aArrayParam, 1)
  do begin
    iType := VarType( aArrayParam[i] );    
    case iType of
      varEmpty    : strType := 'varEmpty   '; // $0000; { vt_empty        0 }
      varNull     : strType := 'varNull    '; // $0001; { vt_null         1 }
      varSmallint : strType := 'varSmallint'; // $0002; { vt_i2           2 }
      varInteger  : strType := 'varInteger '; // $0003; { vt_i4           3 }
      varSingle   : strType := 'varSingle  '; // $0004; { vt_r4           4 }
      varDouble   : strType := 'varDouble  '; // $0005; { vt_r8           5 }
      varCurrency : strType := 'varCurrency'; // $0006; { vt_cy           6 }
      varDate     : strType := 'varDate    '; // $0007; { vt_date         7 }
      varOleStr   : strType := 'varOleStr  '; // $0008; { vt_bstr         8 }
      varDispatch : strType := 'varDispatch'; // $0009; { vt_dispatch     9 }
      varError    : strType := 'varError   '; // $000A; { vt_error       10 }
      varBoolean  : strType := 'varBoolean '; // $000B; { vt_bool        11 }
      varVariant  : strType := 'varVariant '; // $000C; { vt_variant     12 }
      varUnknown  : strType := 'varUnknown '; // $000D; { vt_unknown     13 }
    //varDecimal  : strType := 'varDecimal '; // $000E; { vt_decimal     14 } {UNSUPPORTED as of v6.x code base}
    //varUndef0F  : strType := 'varUndef0F '; // $000F; { undefined      15 } {UNSUPPORTED per Microsoft}
      varShortInt : strType := 'varShortInt'; // $0010; { vt_i1          16 }
      varByte     : strType := 'varByte    '; // $0011; { vt_ui1         17 }
      varWord     : strType := 'varWord    '; // $0012; { vt_ui2         18 }
    //varLongWord : strType := 'varLongWord'; // $0013  { vt_ui4         19 } {deprecated 'use varUInt32'} ;
      varUInt32   : strType := 'varUInt32  '; // $0013; { vt_ui4         19 }
      varInt64    : strType := 'varInt64   '; // $0014; { vt_i8          20 }
      varUInt64   : strType := 'varUInt64  '; // $0015; { vt_ui8         21 }
      varRecord   : strType := 'varRecord  '; // $0024; { VT_RECORD      36 }
      varStrArg   : strType := 'varStrArg  '; // $0048; { vt_clsid        72 }
      varObject   : strType := 'varObject  '; // $0049; {                 73 }
      varUStrArg  : strType := 'varUStrArg '; // $004A; {                 74 }
      varString   : strType := 'varString  '; // $0100; { Pascal string  256 } {not OLE compatible }
      varAny      : strType := 'varAny     '; // $0101; { Corba any      257 } {not OLE compatible }
      varUString  : strType := 'varUString '; // $0102; { Unicode string 258 } {not OLE compatible }
      varTypeMask : strType := 'varTypeMask'; // $0FFF;
      varArray    : strType := 'varArray   '; // $2000;
      varByRef    : strType := 'varByRef   '; // $4000;    
    end;
    
    case iType of
      varDouble    : ShowMessage( FloatToStr(aArrayParam[i]) );
      varOleStr    : ShowMessage( aArrayParam[i] );
      varInteger   : ShowMessage( IntToStr(aArrayParam[i]) );
      varDate      : ShowMessage( DateTimeToStr( aArrayParam[i] ) );
      varEmpty     : ShowMessage( 'içinde hiç veri yok' );
      else ShowMessageFmt(' Tipini bilemedim... TypeID = %d (%s) ', [iType, strType] );
    end;
  end;
end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  VarArray  : Variant;
begin
  VarArray := VarArrayCreate( [0, 4 - 1], varVariant );
  
  VarArray[0] := String   ( 'Muharrem' );
  VarArray[1] := Integer  ( 1973       );
  VarArray[2] := TDateTime( Now()      );
  VarArray[3] := Double   ( 0.127      );
  
  MevlanaArray( VarArray );
 
  VarClear( VarArray );
end;

Merhaba 
Siz iyi bir abiye benziyorsunuz.Ben de biraz yardımcı olmaya çalışayım.
Sorumda da belirmiştim. "Böyle her türlü ARRAYi okuyabilecğim genel bir fonksiyon yazabilirmiiym"
Ama sanırım tam ifade edememişim.İfade etmeye çalışayım.
Alıntı:oku(INTARRAY); veya oku(FLOATARRAY );  dediğiniz zaman bir amaç bekliyoruz. 
Buradaki amaç; "sadece" farklı türlerdeki dizileri tek bir fonksiyona parametre olarak geçebilmekti.
Bunu verdiğiniz Variant örneğinde görebiliyoruz.Muhtemelen bizim bilmediğimiz daha farklı yöntemleri de vardır.Olabilir.
Fonksiyon ya da procedure içerisinde ne yapıldığının çok bir önemi yoktu.

Belki tasarım açısından bir fonksiyona her türlü veri tipini geçip karmaşıklığını arttırmak, metrik ve tasarım açısından çok doğru bir yaklaşım olmayabilir.Amacımız Variant tipinin modern diye tabir edebileceğimiz TValue tipine yakından bakmaktı.

Hazır lokmada olsa yemeden önce içinde zararlı bir şey var mı diye bakmak doğru olur.
Variant'dan feyz alarak aşağıdaki gibi fonksiyon yazdım.

procedure Ikra(const AValue: TValue);
var
 I: Integer;
 ATypeInfo: PTypeInfo;
begin
 if not AValue.IsArray then  // if not(AValue.TypeInfo.Kind in [tkDynArray, tkArray]) then
   raise Exception.Create('Bu bir array değildir!');

 for I := 0 to AValue.GetArrayLength - 1 do
 begin
   ATypeInfo := AValue.GetArrayElement(I).TypeInfo;

   if ATypeInfo.Kind = tkInteger then
   begin
     ShowMessage(AValue.GetArrayElement(I).AsInteger.ToString);
   end;

   if ATypeInfo.Kind = tkFloat then
   begin
     ShowMessage(AValue.GetArrayElement(I).AsExtended.ToString);
   end;

   if ATypeInfo.Kind = tkVariant then
   begin
     ShowMessage(AValue.GetArrayElement(I).AsVariant.ToString);
   end;

 end;

end;

var
 AIntArray: array of Integer;
 AFloatArray: array of Double;
 AGenericIntArray: TArray<Integer>;
 AVariantArray: array of Variant;
 AValue: TValue;
 AStaticIntArray: array [0 .. 1] of Integer;
begin
 SetLength(AIntArray, 1);
 AIntArray[0] := 21;

 SetLength(AFloatArray, 1);
 AFloatArray[0] := 2.2;

 SetLength(AGenericIntArray, 1);
 AGenericIntArray[0] := 25;

 SetLength(AVariantArray, 1);
 AVariantArray[0] := 54;

 AStaticIntArray[0] := 2;

 Ikra(TValue.From(AStaticIntArray));
 Ikra(TValue.From(AIntArray));
 Ikra(TValue.From(AIntArray));
 Ikra(TValue.From(AFloatArray));
 Ikra(TValue.From(AGenericIntArray));
 Ikra(TValue.From(AVariantArray));
end;

(07-10-2018, Saat: 12:35)ahmet_sinav Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Array of variant veya TArray<T> olarak kullanabilirsin veya TDictionary var bunları inceleyebilirsin.
Teşekkürler ama ne işe yaradığını bilmediğim bir hash table implementasyonu olan TDictionary kullanmak istemiyorum.

Cümleten hakkınızı helal ediniz.
Cevapla
#15
İnsanın en iyi yardımı yine kendisinden alabileceğini kanıtlamış olduk. Biraz zor bir süreçti, farkındayım fakat bu, seni kaynak taramaya, araştırma yapmaya yönlendirmenin ve mesleki anlamda kendi ayakların üzerinde sağlam durabilmeni sağlamanın en hızlı yolu... Sonuca ulaşmış olmana sevindim.

Son bir tavsiye, her sorunun sadece tek bir çözümü yoktur...
P.Safa:Yaşlanarak değil, yaşayarak tecrübe kazanılır.Zaman insanları değil,armutları olgunlaştırır
C.Yücel:Toprak gibi olmalısın! Ezildikçe sertleşmelisin!Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı
S.Canan:Bildiğini zannettiğin an hiç bir şey öğrenemezsin
Bilgi uçar
WWW
Cevapla
#16
(07-10-2018, Saat: 18:32)uparlayan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.İnsanın en iyi yardımı yine kendisinden alabileceğini kanıtlamış olduk. Biraz zor bir süreçti, farkındayım fakat bu, seni kaynak taramaya, araştırma yapmaya yönlendirmenin ve mesleki anlamda kendi ayakların üzerinde sağlam durabilmeni sağlamanın en hızlı yolu... Sonuca ulaşmış olmana sevindim.

Son bir tavsiye, her sorunun sadece tek bir çözümü yoktur...
evet araştırma yapınca ve yazılanları okuyunca yazabildim.Bundan sonra yapmak istediklerimi hemen yapmaya kalkışmadan önce,
önce araştırma ve denemeler yapacağım.Örnek kod yazmadınız ama siz de iyi bir abiye benziyorsunuz.  Smile
Herkese teşekkür ederim.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Comport Haberleşme Nasıl Yapılır? glagher 2 97 13-10-2019, Saat: 21:32
Son Yorum: dicle_gsm
  Form içinde exe nasıl çalıştırılır? Cyb3r 2 448 04-07-2019, Saat: 09:53
Son Yorum: Cyb3r
  [Çözüldü] - Google Cloud Platformunda OAuth 2.0 ile Dinamik Token Nasıl Alınır? Fesih ARSLAN 14 1.736 21-05-2019, Saat: 13:11
Son Yorum: Bay_Y
  Bir query'i birden fazla yerde nasıl kullanırım ? boreas 4 369 24-04-2019, Saat: 12:27
Son Yorum: Abdullah ILGAZ
  Windows Oturumu Açılmadan Program Nasıl Çalışır theSinan 15 1.752 15-04-2019, Saat: 00:15
Son Yorum: theSinan



Konuyu Okuyanlar: 1 Ziyaretçi