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.
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.
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.
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.
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;
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:
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.
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.
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.
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 03:42
Böyle çalışıyor: