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ı: 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ı: 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...
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla
#16
(07-10-2018, Saat: 18:32)uparlayan Adlı Kullanıcıdan Alıntı: İ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
#17
(05-10-2018, Saat: 17:06)PREDATOR Adlı Kullanıcıdan Alıntı: merhaba döngüleri genelde aşağıdaki gibi kullanıyorum.Böyle her türlü ARRAYi okuyabilecğim genel bir fonksiyon yazabilirmiiym.örnek kod yazarmısınız.
VAR
SAYILAR : ARRAY of integer;  i:integer;
BEGIN
  SetLength(SAYILAR,10);
  FOR i := 0 to 10-1 do
ShowMessage('i = '+IntToStr(i));
END;

Bağlantıdaki bilgiler faydalı olacaktır: https://docwiki.embarcadero.com/Librarie...ons.TArray
.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Uygulamaya responsive görünüm nasıl kazandırabilriz ? delphicim 0 218 04-01-2024, Saat: 15:24
Son Yorum: delphicim
  Delphi 7 ye göre MB Döviz kurları nasıl alırız maydin60 7 1.057 31-12-2023, Saat: 02:18
Son Yorum: maydin60
  ReadProcessMemory ile veri okuma nasıl yapılır eraendless 2 450 07-09-2023, Saat: 00:35
Son Yorum: veteran
  Yandex Disk üzerinden TIdWebDAV ile nasıl dosya alabilirim adelphiforumz 2 869 17-03-2023, Saat: 16:53
Son Yorum: adelphiforumz
  FastReport Nasıl Kurulur ? cemakkus 4 911 06-12-2022, Saat: 17:14
Son Yorum: cemakkus



Konuyu Okuyanlar: 1 Ziyaretçi