Memo araya satır ekleme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
kodcuminik
Üye
Mesajlar: 140
Kayıt: 11 Oca 2009 10:25

Memo araya satır ekleme

Mesaj gönderen kodcuminik »

Bir projemde html kodlarını replace ile değiştirip
Ftp ye gönderiyorum

Yanlız kimi zaman çok satırlı ekleme yapmam gerekiyor
Birden fazla memoyu birleştirerek işimi görüyorum ama
Bu sayı arttıkca işkence olacak

Memo1.text içeriği

Ali
Hasan
Hüseyin
Zeynep
İstanbul
Ankara
İzmir
Samsun

Böyle bir içerikte ben yeni isim eklediğimde
Zeynepten sonra eklenmesini istiyorum

Döngüye sokacağım ama araya satır eklemeyi nasıl yaparım
bilmezler bilmediklerinide bilmezler ama kendilerini bilir sanırlar
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Memo araya satır ekleme

Mesaj gönderen SimaWB »

Memo1.Lines.Insert()
There's no place like 127.0.0.1
seci20

Re: Memo araya satır ekleme

Mesaj gönderen seci20 »

Söyle bir kod işinize yarıyacağını düşünüyorum.

Kod: Tümünü seç

var
i:integer;
aranan,eklenecek:string;
begin
aranan:='zeynep';
eklenecek:='mesut';
for i := 0 to memo1.Lines.Count -1 do
begin
if  pos(uppercase(aranan),uppercase(memo1.lines[i]))>0 then
memo1.Lines[i+1]:=eklenecek;
end;


end;
kodcuminik
Üye
Mesajlar: 140
Kayıt: 11 Oca 2009 10:25

Re: Memo araya satır ekleme

Mesaj gönderen kodcuminik »

Teşekkürler ama bu durumda aynı isimden
Veya aynı tutardan rakam denk geldiğinde sorun olmazmı
bilmezler bilmediklerinide bilmezler ama kendilerini bilir sanırlar
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: Memo araya satır ekleme

Mesaj gönderen ertank »

Merhaba,

Aşağıdaki kod içinde birden fazla sorun var.
seci20 yazdı: 04 Nis 2018 10:36 Söyle bir kod işinize yarıyacağını düşünüyorum.

Kod: Tümünü seç

var
i:integer;
aranan,eklenecek:string;
begin
aranan:='zeynep';
eklenecek:='mesut';
for i := 0 to memo1.Lines.Count -1 do
begin
if  pos(uppercase(aranan),uppercase(memo1.lines[i]))>0 then
memo1.Lines[i+1]:=eklenecek;
end;


end;
Öncelikle her bir programlama dili kendisine özel zorunlu olmayan ancak kod okumayı kolaylaştırıcı bir kullanım standarda sahiptir. Pascal dili için bunlardan bazıları;
- Blok içinde kalan kodlar (begin..end, try..finally..end, vb.) okumayı kolaylaştırması adına en az iki karakter içeriden yazılır. (Değişken tanımı yapılan bölüm de blok olarak düşünülmelidir)
- Değişken isimlerinde kelimelerin ilk harfleri büyük yazılır. (Birden fazla kelime için de durum aynıdır).

Kod ile ilgili potansiyel hatalar aşağıdaki gibidir:
1- Eğer Memo içinde 10 satır var ise ve aranan bilgi 10. satırda ise bu kod hata verecektir.
2- Aşağıdaki satır her zaman için aranıp bulunan kelimenin bir sonraki satır bilgisinin üzerine yazacak ve veri kaybına sebep olacaktır.

Kod: Tümünü seç

memo1.Lines[i+1]:=eklenecek;
Bunun dışında;
- Eğer Delphi sürümü 2009 ve sonrası ise büyük harf dönüşümü için Türkçe karakterlerde (özellikle küçük ı harfi için) sorun olmaması adına helper fonksiyon ToUpper() kullanılmalıdır. UpperCase() fonksiyonu 7bit ASCII tablo kullanarak büyük harf dönüşümü yapar. ToUpper() helper fonksiyonu ise işletim sistemi "locale" bilgisine göre dönüşüm yapar.
- Pos() fonksiyonu burada gerekli değil. Soruda belirtildiği kadarıyla aranılan kelime tam olarak biliniyor.

Bu açıklamalar doğrultusunda Delphi 2009 ve sonrası için aşağıdaki gibi bir kod yazılabilir.

Kod: Tümünü seç

procedure InsertAfter(List: TStrings; const Searching: string; const ValueToInsert: string);
var
  I: Integer;
  Line: string;
begin
  // Soruyu soran kişi belirtmemiş. Eğer boş listeye kayıt eklenmemeli ise aşağıdaki "if" bloğu olduğu gibi silinebilir
  if List.Count = 0 then
  begin
    List.Add(ValueToInsert);
    Exit();
  end;

  for I := 0 to Pred(List.Count) do
  begin
    Line := List[I];
    if Searching.ToUpper() = Line.ToUpper() then
    begin
      if Succ(I) < List.Count then
        List.Insert(Succ(I), ValueToInsert)
      else
        List.Add(ValueToInsert);
      Exit();
    end;
  end;
end;
Kullanımı şöyle olacaktır:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  InsertAfter(Memo1.Lines, 'zeynep', 'fatma');
end;
Bununla birlikte, orjinal soru açıkça anlaşılır değil. TMemo nesneleri binlerce satır bilgiyi rahatlıkla hafızalarında tutabilirler. Normal koşullarda bir taneden fazla TMemo kullanımına gerek yoktur. Dolayısıyla soruna özel çözüm önerisi sunulabilmesi adına örnekler ve sorun ile ilgili daha detaylı bilgi verilmesinde fayda var.
seci20

Re: Memo araya satır ekleme

Mesaj gönderen seci20 »

ertank yazdı: 04 Nis 2018 11:47 Merhaba,

Aşağıdaki kod içinde birden fazla sorun var.
seci20 yazdı: 04 Nis 2018 10:36 Söyle bir kod işinize yarıyacağını düşünüyorum.

Kod: Tümünü seç

var
i:integer;
aranan,eklenecek:string;
begin
aranan:='zeynep';
eklenecek:='mesut';
for i := 0 to memo1.Lines.Count -1 do
begin
if  pos(uppercase(aranan),uppercase(memo1.lines[i]))>0 then
memo1.Lines[i+1]:=eklenecek;
end;


end;
Öncelikle her bir programlama dili kendisine özel zorunlu olmayan ancak kod okumayı kolaylaştırıcı bir kullanım standarda sahiptir. Pascal dili için bunlardan bazıları;
- Blok içinde kalan kodlar (begin..end, try..finally..end, vb.) okumayı kolaylaştırması adına en az iki karakter içeriden yazılır. (Değişken tanımı yapılan bölüm de blok olarak düşünülmelidir)
- Değişken isimlerinde kelimelerin ilk harfleri büyük yazılır. (Birden fazla kelime için de durum aynıdır).

Kod ile ilgili potansiyel hatalar aşağıdaki gibidir:
1- Eğer Memo içinde 10 satır var ise ve aranan bilgi 10. satırda ise bu kod hata verecektir.
2- Aşağıdaki satır her zaman için aranıp bulunan kelimenin bir sonraki satır bilgisinin üzerine yazacak ve veri kaybına sebep olacaktır.

Kod: Tümünü seç

memo1.Lines[i+1]:=eklenecek;
Bunun dışında;
- Eğer Delphi sürümü 2009 ve sonrası ise büyük harf dönüşümü için Türkçe karakterlerde (özellikle küçük ı harfi için) sorun olmaması adına helper fonksiyon ToUpper() kullanılmalıdır. UpperCase() fonksiyonu 7bit ASCII tablo kullanarak büyük harf dönüşümü yapar. ToUpper() helper fonksiyonu ise işletim sistemi "locale" bilgisine göre dönüşüm yapar.
- Pos() fonksiyonu burada gerekli değil. Soruda belirtildiği kadarıyla aranılan kelime tam olarak biliniyor.

Bu açıklamalar doğrultusunda Delphi 2009 ve sonrası için aşağıdaki gibi bir kod yazılabilir.

Kod: Tümünü seç

procedure InsertAfter(List: TStrings; const Searching: string; const ValueToInsert: string);
var
  I: Integer;
  Line: string;
begin
  // Soruyu soran kişi belirtmemiş. Eğer boş listeye kayıt eklenmemeli ise aşağıdaki "if" bloğu olduğu gibi silinebilir
  if List.Count = 0 then
  begin
    List.Add(ValueToInsert);
    Exit();
  end;

  for I := 0 to Pred(List.Count) do
  begin
    Line := List[I];
    if Searching.ToUpper() = Line.ToUpper() then
    begin
      if Succ(I) < List.Count then
        List.Insert(Succ(I), ValueToInsert)
      else
        List.Add(ValueToInsert);
      Exit();
    end;
  end;
end;
Kullanımı şöyle olacaktır:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  InsertAfter(Memo1.Lines, 'zeynep', 'fatma');
end;
Bununla birlikte, orjinal soru açıkça anlaşılır değil. TMemo nesneleri binlerce satır bilgiyi rahatlıkla hafızalarında tutabilirler. Normal koşullarda bir taneden fazla TMemo kullanımına gerek yoktur. Dolayısıyla soruna özel çözüm önerisi sunulabilmesi adına örnekler ve sorun ile ilgili daha detaylı bilgi verilmesinde fayda var.
Hocam sizin gibi usta olamadık daha acemi işi bizimkisi :D
Cevapla