Nedir bu "Strings" ?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
furkan_scream
Üye
Mesajlar: 10
Kayıt: 17 Oca 2020 11:52

Nedir bu "Strings" ?

Mesaj gönderen furkan_scream » 29 Oca 2020 12:47

Merhabalar, OpenDialog ile açtığım dosyaların isimlerini Memo'ya aktarıyorum, şöyle bir kod buldum:

Kod: Tümünü seç

if od1.Execute then
    begin
      with od1.Files do
      for i := 0 to Count-1 do
      begin
        Strings[i] := ExtractFileName(Strings[i]);  // uzantısı ile alır
     
      end;        
        Memo1.Lines.AddStrings(od1.Files);
    end;
ancak bu açılan dosyaların; uzantısı ile beraber ve uzantısı olmadan sadece ismini almam gerekiyor. Bunları bir dizide tutmak istiyorum ama bir türlü yapamadım.

Kod: Tümünü seç

 TStringList oluşturuyorum := Strings[i];
yapıyorum yine olmuyor. Bu for döngüsü içerisinde Strings den gelenleri farklı farklı alabileceğim bir şey yok mudur? Bu Strings ne oluyor tam olarak çözemedim bir sürü hata alıyorum Char hatası Abstract error vs.

cozturk
Üye
Mesajlar: 476
Kayıt: 15 Haz 2005 04:22

Re: Nedir bu "Strings" ?

Mesaj gönderen cozturk » 29 Oca 2020 02:42

Böyle çalışıyor:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  Strings: TStringlist;

begin
  Strings := TStringlist.Create;
  if od1.Execute then
    Strings.Text := od1.Files.Text;
  memo1.Text := Strings.Text;  // hepsini göster
 // memo1.Text := Strings[0];  // ilk dosyayı göster
end;

ertank
Üye
Mesajlar: 1281
Kayıt: 11 Eyl 2015 11:45

Re: Nedir bu "Strings" ?

Mesaj gönderen ertank » 29 Oca 2020 03:47

furkan_scream yazdı:
29 Oca 2020 12:47
Merhabalar, OpenDialog ile açtığım dosyaların isimlerini Memo'ya aktarıyorum, şöyle bir kod buldum:

Kod: Tümünü seç

if od1.Execute then
    begin
      with od1.Files do
      for i := 0 to Count-1 do
      begin
        Strings[i] := ExtractFileName(Strings[i]);  // uzantısı ile alır
     
      end;        
        Memo1.Lines.AddStrings(od1.Files);
    end;
ancak bu açılan dosyaların; uzantısı ile beraber ve uzantısı olmadan sadece ismini almam gerekiyor. Bunları bir dizide tutmak istiyorum ama bir türlü yapamadım.

Kod: Tümünü seç

 TStringList oluşturuyorum := Strings[i];
yapıyorum yine olmuyor. Bu for döngüsü içerisinde Strings den gelenleri farklı farklı alabileceğim bir şey yok mudur? Bu Strings ne oluyor tam olarak çözemedim bir sürü hata alıyorum Char hatası Abstract error vs.


Merhaba,

Hangi Delphi sürümünü kullanıyorsunuz belirtmemişsiniz.
Hem dosya eki ve hem dosya eki olmadan iki farklı bilgiyi nerede tutmak istiyorsunuz belirtmemişsiniz.

Delphi 10.3.3 ile çalışan aşağıdaki kodu kullanmanız mümkün olabilir.

Kod: Tümünü seç

uses
  System.IOUtils;
  
procedure TForm1.GetFilenames();
var
  I: Integer;
  List1: TStringList;
  List2: TStringList;
begin
  List1 := nil;
  List2 := nil;
  try
    List1 := TStringList.Create();
    List2 := TStringList.Create();
    for I := 0 to od1.Files.Count-1 do
    begin
      List1.Add(TPath.GetFileNameWithoutExtension(od1.Files[I]));  // dosya eki olmayan liste
      List2.Add(TPath.GetFileName(od1.Files[I]));  // dosya eki olan liste
    end;
    
    // bu noktada iki liste içinde istenilen bilgi mevcut. 
    // gerekli şekilde kullanılabilir.
  finally
    List1.Free();
    List2.Free();
  end;
  // Bu noktada artık listeler hafızadan silindiği için kullanılamaz.
end;

ertank
Üye
Mesajlar: 1281
Kayıt: 11 Eyl 2015 11:45

Re: Nedir bu "Strings" ?

Mesaj gönderen ertank » 29 Oca 2020 03:50

cozturk yazdı:
29 Oca 2020 02:42
Böyle çalışıyor:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  Strings: TStringlist;
begin
  Strings := TStringlist.Create();
  if od1.Execute then
    Strings.Text := od1.Files.Text;
  memo1.Text := Strings.Text;  // hepsini göster
 // memo1.Text := Strings[0];  // ilk dosyayı göster
end;
Merhaba,

Paylaştığınız kod hafıza kaçağına sebep oluyor. Strings "create" edilmiş ancak "free" edilmemiş. Bu tür create ile kullanılan nesneleri try..finally blokları kullanarak free ettiğinize emin olmalısınız. Kodunuzun hafıza kaçağı olmayan şekli aşağıdaki gibi yazılabilir:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  Strings: TStringList;
begin
  Strings := TStringlist.Create;
  try
    if od1.Execute then
      Strings.Text := od1.Files.Text;
    memo1.Text := Strings.Text;  // hepsini göster
    // memo1.Text := Strings[0];  // ilk dosyayı göster
  finally
    Strings.Free();
  end;
end;

furkan_scream
Üye
Mesajlar: 10
Kayıt: 17 Oca 2020 11:52

Re: Nedir bu "Strings" ?

Mesaj gönderen furkan_scream » 29 Oca 2020 07:04

ertank yazdı:
29 Oca 2020 03:47
furkan_scream yazdı:
29 Oca 2020 12:47
Merhabalar, OpenDialog ile açtığım dosyaların isimlerini Memo'ya aktarıyorum, şöyle bir kod buldum:

Kod: Tümünü seç

if od1.Execute then
    begin
      with od1.Files do
      for i := 0 to Count-1 do
      begin
        Strings[i] := ExtractFileName(Strings[i]);  // uzantısı ile alır
     
      end;        
        Memo1.Lines.AddStrings(od1.Files);
    end;
ancak bu açılan dosyaların; uzantısı ile beraber ve uzantısı olmadan sadece ismini almam gerekiyor. Bunları bir dizide tutmak istiyorum ama bir türlü yapamadım.

Kod: Tümünü seç

 TStringList oluşturuyorum := Strings[i];
yapıyorum yine olmuyor. Bu for döngüsü içerisinde Strings den gelenleri farklı farklı alabileceğim bir şey yok mudur? Bu Strings ne oluyor tam olarak çözemedim bir sürü hata alıyorum Char hatası Abstract error vs.


Merhaba,

Hangi Delphi sürümünü kullanıyorsunuz belirtmemişsiniz.
Hem dosya eki ve hem dosya eki olmadan iki farklı bilgiyi nerede tutmak istiyorsunuz belirtmemişsiniz.

Delphi 10.3.3 ile çalışan aşağıdaki kodu kullanmanız mümkün olabilir.

Kod: Tümünü seç

uses
  System.IOUtils;
  
procedure TForm1.GetFilenames();
var
  I: Integer;
  List1: TStringList;
  List2: TStringList;
begin
  List1 := nil;
  List2 := nil;
  try
    List1 := TStringList.Create();
    List2 := TStringList.Create();
    for I := 0 to od1.Files.Count-1 do
    begin
      List1.Add(TPath.GetFileNameWithoutExtension(od1.Files[I]));  // dosya eki olmayan liste
      List2.Add(TPath.GetFileName(od1.Files[I]));  // dosya eki olan liste
    end;
    
    // bu noktada iki liste içinde istenilen bilgi mevcut. 
    // gerekli şekilde kullanılabilir.
  finally
    List1.Free();
    List2.Free();
  end;
  // Bu noktada artık listeler hafızadan silindiği için kullanılamaz.
end;
Hocam Delphi XE7 kullanıyorum kodlarda ufak bir değişiklik ile işe yaradı çok teşekkür ederim.

Kod: Tümünü seç

List1.Add(ChangeFileExt(ExtractFileName(od1.Files[I]), ''));  // dosya eki olmayan liste
List2.Add(ExtractFileName(od1.Files[I]));  // dosya eki olan liste
cozturk yazdı:
29 Oca 2020 02:42
Böyle çalışıyor:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  Strings: TStringlist;

begin
  Strings := TStringlist.Create;
  if od1.Execute then
    Strings.Text := od1.Files.Text;
  memo1.Text := Strings.Text;  // hepsini göster
 // memo1.Text := Strings[0];  // ilk dosyayı göster
end;
Çok teşekkür ederim hocam.

Cevapla