Delphi'de Dosya Adından Boşluk ve Parantez Silme

Windows'un güncel sürümlerinde bulunan güzel bir dosya adlandırma özelliği var. Kullanabilmek için birden fazla dosyayı seçip sonra sağ tıklayıp Yeniden Adlandır'ı seçiyoruz.

Daha sonra bir dosya ismi yazıyoruz.

Windows dosyalara otomatik olarak aşağıdaki gibi isimler veriyor.

Biz web sitesi sahipleri bu dosya isimlerinden çok memnun olmuyoruz çünkü web sitelerinde boşluk karakteri sıkıntı çıkarabilir. Dosya isimlerinde boşluk ve parantezlerden kurtulmak için ne yapıyoruz, hemen Delphi'de bir program yazıyoruz :)

Programımız şu şekilde çalışsın, adı değiştirilecek dosyaları programımıza sürükleyelim, sonra bir düğmeye bastığımızda dosya adınan boşluk ve parantezler silinsin.

Programı yazmak için Delphi'de yeni bir VCL Form Application projesin oluşturuyoruz. Ekrana gelen forma bir tane TButton bileşeni koyup özellikerini şu şekilde ayarlıyoruz:

  object btnAdlandir: TButton
    Align = alTop
    Caption = 'Adlandır'

Yukarıdan da anlaşılacağı gibi düğmeminizin adını btnAdlandir yaptık, Align özelliğini alTop yaptık. Align özelliğine bu değeri vermemiz sayesinde düğmemiz formun boyutları ne olursa olsun her zaman formun üst kısmını kaplayacak.

Forma bir tane de TMemo bileşeni kyouyoruz ve onun özelliklerini de şu şekilde ayarlıyoruz.

  object mmoDosyalar: TMemo
    Align = alClient

Burada da mmoDosyalar'ın Align özelliğine alClient değerini atadığımız için, formda TButton'dan kalan tüm alanı mmoDosyalar kaplayacak.

Formumuza Delphi dışından, Windows gezgininden dosya sürükleyeceğimiz işin içine Windows Api'leri giriyor, bu yüzden uses kısmına ShellApi'yi ekliyoruz.

uses ShellApi;

Sürükle bırak olaylarını yönetebilmek için private bölümünde aşağıdaki gibi bir alt program tanımlıyoruz:

    procedure AppMessage(var Msg: Tmsg; var Handled: Boolean);

Bu alt programı aşağıdaki gibi yazıyoruz:

procedure TForm1.AppMessage(var Msg: Tmsg; var Handled: Boolean);
const
   BufferUzunlugu: DWORD = 511;
var
   SuruklenenDosyaAdi: string;
   DosyaSirasi: DWORD;
   SuruklenenDosyaSayisi: DWORD;
   diziSuruklenenDosyaAdi: array [0..511] of Char;
   SuruklenenDosyaUzunlugu: DWORD;
begin
   if Msg.message = WM_DROPFILES then
   begin
     DosyaSirasi := $FFFFFFFF;
     SuruklenenDosyaSayisi := DragQueryFile(Msg.WParam, DosyaSirasi, diziSuruklenenDosyaAdi, BufferUzunlugu);
     for DosyaSirasi:=0 to (SuruklenenDosyaSayisi - 1) do
     begin
       SuruklenenDosyaUzunlugu:=DragQueryFile(Msg.WParam, DosyaSirasi, diziSuruklenenDosyaAdi, BufferUzunlugu);
       SuruklenenDosyaAdi:=StrPas(diziSuruklenenDosyaAdi);
       if Pos(SuruklenenDosyaAdi, mmoDosyalar.Text)=0 then
         mmoDosyalar.Lines.Add(SuruklenenDosyaAdi);
     end;
     DragFinish(Msg.WParam);
     Handled := true;
   end;
end;

Yukarıdaki kodda 19. satırdaki kontrol sürüklenip bırakılan dosyaların TMemo'da tekrar etmesini engelliyor.

Sürükle bırakın çalışması için Form'un Create olayına aşağıdaki kodları ekliyoruz. Burada TMemo'nun bazı özelliklerini de ayarlıyoruz.

procedure TForm1.FormCreate(Sender: TObject);
begin
  mmoDosyalar.Text:='';
  mmoDosyalar.WordWrap:=False;
  mmoDosyalar.ScrollBars:=ssVertical;
  DragAcceptFiles(mmoDosyalar.Handle, True);
  Application.OnMessage:=AppMessage;
end;

3. satır, TMemo'nun içeriğini siliyor. 4. satır satırların kaymasını önlüyor, 5. satır TMemo'da dikey kaydırma çubuğunun görünmesini sağlıyor. Diğer satırlar ise sürükle bırakın çalışması için gerekli.

Bir dosya isminden sayıyı ayıklayacak bir fonksiyona ihtiyacımız var. Bu fonksiyonu da şu şekilde yazıyoruz.

function SayiyiBul(metin: string): string;
var
  i: integer;
  sonuc: string;
begin
  for i:=1 to length(metin) do
    if metin[i] in ['0'..'9'] then
      sonuc:=sonuc+metin[i];
  result:=sonuc;
end;

Son olarak işi yapacak olan düğmemize şu kodları yazıyoruz.

procedure TForm1.btnAdlandirClick(Sender: TObject);
var
  sayi, eskiad, yeniad: string;
  i: integer;
begin
  for i:=0 to mmoDosyalar.Lines.Count-1 do
  begin
    if length(ExtractFileExt(mmoDosyalar.Lines[i]))<0 then
      exit;
    sayi:=SayiyiBul(mmoDosyalar.Lines[i]);
    eskiad:=mmoDosyalar.Lines[i];
    yeniad:=StringReplace(eskiad, ' ('+sayi+')',sayi,[rfReplaceAll, rfIgnoreCase]);
    mmoDosyalar.Lines[i]:=yeniad;
    RenameFile(eskiad, yeniad);
  end;
end;

Kodun 6. satırında TMemo'daki satır sayısı kadar bir döngü oluşruyoruz. Eğer satırdaki dosya isminde uzantı yoksa dikkate alınmamasını 8. satırdaki koşul ile sağlıyoruz. 10. satırda dosya adındaki sayıyı tespit ediyoruz. 12. satırda StringReplace fonksiyonu ile dosyamızın adını boşluk ve paranez içermeyecek şekilde oluşturuyoruz. 14. satırdaki RenameFile fonksiyonu ile dosyamızın adını değiştiriyoruz.

Programın exe'sine buradan ulaşabilirsiniz.

Programın kodlama sürecini buradan video olarak izleyebilirsiniz.

01.01.2017 01:01:01


Etiketler: delphi fonksiyonları

Yorumlar

Bu yazıya henüz yorum yapılmamış.

Yazı hakkında yorum yapmak için, buraya tıklayın.

Kategoriler :

Arşiv :

Etiketler :

Bağlantılar :