edit islemi (belli bir karakterden öncekileri silmek)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
gloryboy
Üye
Mesajlar: 26
Kayıt: 21 Eki 2006 10:40

edit islemi (belli bir karakterden öncekileri silmek)

Mesaj gönderen gloryboy »

şimdi

d:\deneme\..\yeni\

yaziyor edit1 de. beni butona basınca edit1 kutumda sadece yeni\ yazsın. bu örnek ama heryerde işleyebiliyor olmalı mesela

c:\merhaba\..\delphiturkiye\..\..\forum\

atıyorum edit kutumda yukarıdaki gibi birşey varsa da bunu forum\ olarak değişitrsin. sondan ikinci \ yi alsın ve sol tarafını silsin yani :?

nasıl yaparız :oops:
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Basit string operasyon fonksiyonları vardır.

- Delete fonksiyonunu sıkça kullanırım.. Basit bir While döngüsü ile bunu başarırsın... Şöyle..

Kod: Tümünü seç

Function SonHedef( Kaynak:String ): String;
begin
  // Sağındaki solundaki boşluklardan arındırıyoruz...
  Kaynak := Trim(Kaynak);
  If Kaynak <> '' then begin // içerik varsa işleme alınacak
    // Birden fazla '\' bile bitse, sondakileri siliyoruz...
    While Kaynak[Length(Kaynak)] = '\' do Delete(Kaynak, Length(Kaynak), 1);
    // Şimdi de baştan sona kadar adım adım
    // tüm '\' bulunana kadar olan kısımları siliyoruz...
    While Pos('\', Kaynak) > 0 do Delete(Kaynak, 1, Pos('\', Kaynak));
  end;
  // Ürün hazır..
  Result := Kaynak;
end;
Kullanımı..

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := SonHedef(Edit1.Text) + '\';
end;
- İncele, geliştir, kullan :lol:
Resim
Resim ....Resim
gloryboy
Üye
Mesajlar: 26
Kayıt: 21 Eki 2006 10:40

Mesaj gönderen gloryboy »

evet benim dediğime göre sizin verdiğiniz kod oldu çok teşekkürler fakat yapmak istediğimin birazcık farklı olduğunu anladım şimdi :(

c:\merhaba\..\delphiturkiye\..\forum\deneme\xxx\..\..\yyy\

örneğin kodum bu ise

bu kendini şu şekilde işlemeli

\..\ den önce \ bu bölüme kdr gelen yeri silecek ve soldan sağa bu şekilde devam edecek

yani ilk \..\ bu merhaba yı silecek ikinci \..\ bu delphiturkiye yi silecek yani yukarıdaki yazının işlenmiş hali şöyle olmalı

c:\forum\yyy\ olrk kalması gerekiyor bunu nasıl yaparım :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops:
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Hocam burada kod siparişi olmuyor malesef.. Sana verdiğim, mantık ve kavram oluşsun diye idi. :oops:

- Aynı mantık geçerli... \ değil de \..\ araması yapılacak.. adım adım bulunan yerere kadar olanlar bir başka değişkende bir araya getirilip, ana değişkenden silinerek bir sonraki adıma geçilecek. Taa ki tüm karakterler tükenene kadar..
Resim
Resim ....Resim
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

Mesaj gönderen kahraman1285 »

@mrmarman hocam çok güzel bir örnek vermiş aradığın "\" yada "forum" için 'pos' metoduyla arama yaparak bulabilirsin.
gloryboy
Üye
Mesajlar: 26
Kayıt: 21 Eki 2006 10:40

Mesaj gönderen gloryboy »

hocam sipariş gibi algılama ya :(

buraya yazmadan önce uğraşıyorum olmayınca yazıyorum :( bu son isteiğim son kez yardımcı olursan sevinirim çok :oops: :oops: :oops:
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Kod: Tümünü seç

Function SonHedef( Kaynak:String ): String;
Var
  i,j : Integer;
begin
  Kaynak := Trim(Kaynak);
  Result := '';
  If Kaynak <> '' then begin
    While  Pos('\'  , Kaynak) > 0 do begin
      i := Pos('\'  , Kaynak);
      j := Pos('\..', Kaynak);
      If i = j
        then Delete(Kaynak,1, i+3) else begin
          If Copy(Kaynak, 1, i) <> '..\'
            then Result := Result + Copy(Kaynak, 1, i);
          Delete(Kaynak, 1, i );
        end;
    end;
  end;
end;
:idea: peki öyle olsun...
Resim
Resim ....Resim
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Ben de alternatif bir yöntem önereyim. Hem Stack kullanımına da örnek olur.

Önce verilen ifadeyi \ karakterinin olduğu yerlerden bölelim. Bu ExtractStrings prosedürünü veya TStringList sınıfının DelimitedText özelliğini kullanarak yapabilirsiniz.

Örneğin "C:\A\B\..\..\C\..\D" stringi bölündüğü zaman elimizde şöyle bir liste olacak.

Kod: Tümünü seç

C:
A
B
..
..
C
..
D
".." stringden farklı her stringi sırayla stack'e push ediyoruz. Her ".." stringi ile karşılaştığımızda stackteki son elamanı çekiyoruz (pop).

Kod: Tümünü seç

C:  (push) Stack : C:
A   (push) Stack : C:, A
B (push) Stack: C:,A,B
.. (pop) Stack: C:,A
.. (pop) Stack: C:
C (push) Stack: C:,C
.. (pop) Stack: C:
D (push) Stack: C:,D
Delphi için örnek kod

Kod: Tümünü seç

uses contnrs;
Function Sadelestir(const Str: String):String;
var
  Strs : TStringList;
  Stack : TStack;
  i : integer;
begin
  Strs := TStringList.Create;
  Stack := TStack.Create;
  try
     Strs.Delimiter := '\';
     Strs.DelimitedText := Str;
     for i := 0 to strs.Count-1 do
       if Strs[i] <> '..' then
         stack.Push(PAnsiChar(Strs[i]))
       else
         stack.Pop;
     while stack.Count > 0 do
       Result := PAnsiChar(stack.Pop) + '\' + Result;
  finally
    Strs.Free;
    Stack.Free;
  end;
end;
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Sonucu bir test edeyim dedim ama şunun farkına vardım...

Verdiğin örnek aşağıdaki

Kod: Tümünü seç

c:\merhaba\..\delphiturkiye\..\forum\deneme\xxx\..\..\yyy\
istediğin sonuç

Kod: Tümünü seç

c:\forum\yyy\
Yazdığım fonksiyonun sonucu

Kod: Tümünü seç

c:\forum\deneme\yyy\
t-hex'in fonksiyonun sonucu ise

Kod: Tümünü seç

c:\forum\yyy\\
- Şimdi fakettim de yazdığım fonksiyon zaten senin istediğini karşılamıyormuş.. Sorunu yanlış değerlendirmişim.
Resim
Resim ....Resim
gloryboy
Üye
Mesajlar: 26
Kayıt: 21 Eki 2006 10:40

Mesaj gönderen gloryboy »

tesekkurler yardim eden herkeze :)

arman hocam verdigin kod tam olarak istedigimdi bu sefer kesin oldu yani yanlşlıklık yok :) çok teşekkürler :D
Cevapla