Memo verisinin kendinden sonraki verilerle karşılaştırılması

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
kazimates
Üye
Mesajlar: 325
Kayıt: 30 Haz 2005 11:40
Konum: Kıbrıs
İletişim:

Memo verisinin kendinden sonraki verilerle karşılaştırılması

Mesaj gönderen kazimates » 08 Şub 2019 12:35

merhaba,

memo3 içerisinde aşağıdaki formatta klasör içerisinde bulunan resimlerin isim ve boyutlarını tutuyorum.
c:\fotograflar\11111111_001;567890
c:\fotograflar\11111112_001;567890
c:\fotograflar\11111115_001;567890
c:\fotograflar\11111116_001;668992
c:\fotograflar\11111117_001;668992
c:\fotograflar\11111118_001;567893
c:\fotograflar\11111119_001;567893
c:\fotograflar\11111120_001;567390
c:\fotograflar\11111122_001;567390

buarada line 1 de ; den sonraki dosya boyutu ile line2 yi karşılaştırıp (ilksatir=sonrakisatır) ikinci satırın dosya boyutu bir önceki satırla aynıysa 2nci satırındaki veriyi silmem veya bilgisini bir yerde geçici tutmam gerekiyor. sonra 1 ile 3 demem ve baktığımda birinci satır ile 4ncü farklı olduğunu göründe bu sefer 4ncü satırla sonraki satırları karşılaştırmam gerekiyor. ve en sonunda ise yapmak istediğim geçici dosyada tuttuğum filenameleri hard diskin ilgili klasöründen silmek olacak. bu konuda yardımlarını rica edeceğim.

Neticede c:\fotograflar\ klasörü altında sadece aşağıdakiler kalmış olacak.
c:\fotograflar\11111111_001
c:\fotograflar\11111116_001
c:\fotograflar\11111118_001
c:\fotograflar\11111120_001

Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1312
Kayıt: 07 May 2009 09:42
Konum: İstanbul
İletişim:

Re: Memo verisinin kendinden sonraki verilerle karşılaştırılması

Mesaj gönderen SimaWB » 11 Şub 2019 08:57

Memo içine eklerken bu kontrolü yapmak bence daha kolay
There's no place like 127.0.0.1

kazimates
Üye
Mesajlar: 325
Kayıt: 30 Haz 2005 11:40
Konum: Kıbrıs
İletişim:

Re: Memo verisinin kendinden sonraki verilerle karşılaştırılması

Mesaj gönderen kazimates » 13 Şub 2019 09:24

Aşağıda ki kodla c:\fotograflar klasöründeki dosya isimlerini ve dosya boyutlarını memoya listeleyebildim ama karşılaştırma işini bir türlü yapamadım. bu kodun geliştirilmesi ve clone jpg fileların memo5 de dosya adı ile listelenmesinin sağlanması için yardımınızı rica edeceğim.

Kod: Tümünü seç

procedure TForm1.BtnDosyaBoyutuBulucuClick(Sender: TObject);
var
  searchResult : TSearchRec;
  referansdosyaadi: string;
  referansdosyaboyutu: integer;
  dosyaveboyut: string;
  klasoryolu: string;

  toplamsatir: integer;
  x,y:integer;
  oncekidosyaboyutu: integer;
  sonrakidosyaboyutu: integer;

begin
  oncekidosyaboyutu:=0;
  sonrakidosyaboyutu:=0;
  toplamsatir:=0;
  x:=0;
  y:=0;
  // Try to find regular files matching Unit1.d* in the current dir
  Memo3.Lines.Clear;
  Memo4.Lines.Clear;
  klasoryolu:=Edit3.Text;
  if findfirst(klasoryolu+'\'+'*.jpg', faAnyFile, searchResult) = 0 then
  begin
    repeat
 
      Memo3.Lines.add(klasoryolu+'\'+(searchResult.Name));
      Memo4.Lines.Add(InttoStr(searchResult.Size));

    until FindNext(searchResult) <> 0;

    // Must free up resources used by these successful finds
    FindClose(searchResult);

    toplamsatir:=Memo3.Lines.Count;
    showmessage('Memo3 Toplam Satir Sayisi ='+ inttostr(toplamsatir));

  end;


end;

kazimates
Üye
Mesajlar: 325
Kayıt: 30 Haz 2005 11:40
Konum: Kıbrıs
İletişim:

Re: Memo verisinin kendinden sonraki verilerle karşılaştırılması

Mesaj gönderen kazimates » 24 Şub 2019 10:57

Bu konuya yardımcı olabilecek birileri varmı acaba. Burada takıldım kaldım ve bir türlü bu işi toparlayamadım. Yardımcı olabilirseniz çok memnun olacağım.

Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2150
Kayıt: 12 Haz 2003 03:05
Konum: merkez camii yanı

Re: Memo verisinin kendinden sonraki verilerle karşılaştırılması

Mesaj gönderen freeman35 » 24 Şub 2019 10:24

Neden memo ya alman gerekiyor? TStringList kullan
TStringList.NameValueSeparator:= ';' ama "=" defaolt olması daha mantıklı. name ve value ile değerleri alman kolaylaşır.
iç içe dongü kur. Bu for döngülerinin öğretilmesinde anlatılır.
for I:=0 to count-1 do for J:= I +1 to Count-2......
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!

3ddark
Üye
Mesajlar: 69
Kayıt: 14 Eyl 2010 09:55
Konum: İstanbul

Re: Memo verisinin kendinden sonraki verilerle karşılaştırılması

Mesaj gönderen 3ddark » 06 May 2019 07:29

Açıklamalı olarak aynı boyutlu olan kayıtları bulmayı yazdım. Dosya silme işlemini de siz eklersiniz.

Kod: Tümünü seç

uses
  System.StrUtils;
  
procedure TForm3.btnSilClick(Sender: TObject);
var
  n1: Integer;
  vReferansBilgi, vReferansSize, vSize: string;
  vPosNoktaliVirgul: Integer;
begin
  mmoSilinenler.Clear;
  for n1 := 0 to mmoListe.Lines.Count-1 do
  begin
    vReferansBilgi := mmoListe.Lines.Strings[n1]; //n1 inci satırdaki bilgiyi al
    vPosNoktaliVirgul := Pos(';', vReferansBilgi)+1;  //noktali virgül hangi karakterde bu bizim ayraç bilgimiz.
    if n1 = 0 then
      vReferansSize := MidStr(vReferansBilgi, vPosNoktaliVirgul, Length(vReferansBilgi)); //artık boyut bilgisi referans değişkenimizde

    //bundan sonraki satılardan boyut bilgisini alıp bir önceki referans ile kontrol edeceğiz.
    if n1 > 0 then
    begin
      vSize := MidStr(vReferansBilgi, vPosNoktaliVirgul, Length(vReferansBilgi)); //ilk satırdan sonraki boyut bilgisi vSize değişkenimizde
      if vReferansSize = vSize then
      begin
        mmoSilinenler.Lines.Add(mmoListe.Lines.Strings[n1]);  //boyuları aynı olan kayıtlar silinenler memoya aktarıldı.
        //burada artık silinecek olan satırlar mmoSilinenler isimli memoya dolduruluyor
        //buradan sonra istediğiniz işlemi yapabilirsiniz.
      end
      else if vReferansSize <> vSize then
      begin
        vReferansSize := vSize; //farklı ise referans size bilgisine eşitlendi. Her zaman vReferansSize ile karşılaştırma yapılıyor.
      end;
    end;
  end;
end;
PostgreSQL - Delphi - Linux :!:

kazimates
Üye
Mesajlar: 325
Kayıt: 30 Haz 2005 11:40
Konum: Kıbrıs
İletişim:

Re: Memo verisinin kendinden sonraki verilerle karşılaştırılması

Mesaj gönderen kazimates » 16 May 2019 01:16

vReferansSize := MidStr(vReferansBilgi, vPosNoktaliVirgul, Length(vReferansBilgi)); //artık boyut bilgisi referans değişkenimizde

Midstr için undeclared identifier hatası alıyorum. daha önce bununla ilgili deklare edilen bir bildi yok diye sorun veriyor.

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

Re: Memo verisinin kendinden sonraki verilerle karşılaştırılması

Mesaj gönderen ertank » 09 Haz 2019 10:07

3ddark yazdı:
06 May 2019 07:29
Açıklamalı olarak aynı boyutlu olan kayıtları bulmayı yazdım. Dosya silme işlemini de siz eklersiniz.

Kod: Tümünü seç

uses
  System.StrUtils;
  
procedure TForm3.btnSilClick(Sender: TObject);
var
  n1: Integer;
  vReferansBilgi, vReferansSize, vSize: string;
  vPosNoktaliVirgul: Integer;
begin
  mmoSilinenler.Clear;
  for n1 := 0 to mmoListe.Lines.Count-1 do
  begin
    vReferansBilgi := mmoListe.Lines.Strings[n1]; //n1 inci satırdaki bilgiyi al
    vPosNoktaliVirgul := Pos(';', vReferansBilgi)+1;  //noktali virgül hangi karakterde bu bizim ayraç bilgimiz.
    if n1 = 0 then
      vReferansSize := MidStr(vReferansBilgi, vPosNoktaliVirgul, Length(vReferansBilgi)); //artık boyut bilgisi referans değişkenimizde

    //bundan sonraki satılardan boyut bilgisini alıp bir önceki referans ile kontrol edeceğiz.
    if n1 > 0 then
    begin
      vSize := MidStr(vReferansBilgi, vPosNoktaliVirgul, Length(vReferansBilgi)); //ilk satırdan sonraki boyut bilgisi vSize değişkenimizde
      if vReferansSize = vSize then
      begin
        mmoSilinenler.Lines.Add(mmoListe.Lines.Strings[n1]);  //boyuları aynı olan kayıtlar silinenler memoya aktarıldı.
        //burada artık silinecek olan satırlar mmoSilinenler isimli memoya dolduruluyor
        //buradan sonra istediğiniz işlemi yapabilirsiniz.
      end
      else if vReferansSize <> vSize then
      begin
        vReferansSize := vSize; //farklı ise referans size bilgisine eşitlendi. Her zaman vReferansSize ile karşılaştırma yapılıyor.
      end;
    end;
  end;
end;
Merhaba,

İstenileni doğru anladı isem yukarıdan aşağıya doğru seçim yapılmak isteniliyor. Yani en üstteki kalacak, altındaki aynı değere sahip olanlar silinecek. Sizin örnek kodunuz bunun tam tersini yapıyor.

Ayrıca istenilen nihai liste içinde sadece dosya adı olması, boyut ve ayraç karakteri olmaması şeklinde. Sizin örnek kodunuz dosya adı ve boyutunu olduğu gibi diğer listeye kopyalıyor.

Bilginize,
Ertan

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

Re: Memo verisinin kendinden sonraki verilerle karşılaştırılması

Mesaj gönderen ertank » 09 Haz 2019 10:07

kazimates yazdı:
16 May 2019 01:16
vReferansSize := MidStr(vReferansBilgi, vPosNoktaliVirgul, Length(vReferansBilgi)); //artık boyut bilgisi referans değişkenimizde

Midstr için undeclared identifier hatası alıyorum. daha önce bununla ilgili deklare edilen bir bildi yok diye sorun veriyor.
MidStr() fonksiyonu StrUtils ünitesi içindedir.

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

Re: Memo verisinin kendinden sonraki verilerle karşılaştırılması

Mesaj gönderen ertank » 09 Haz 2019 10:09

kazimates yazdı:
08 Şub 2019 12:35
merhaba,

memo3 içerisinde aşağıdaki formatta klasör içerisinde bulunan resimlerin isim ve boyutlarını tutuyorum.
c:\fotograflar\11111111_001;567890
c:\fotograflar\11111112_001;567890
c:\fotograflar\11111115_001;567890
c:\fotograflar\11111116_001;668992
c:\fotograflar\11111117_001;668992
c:\fotograflar\11111118_001;567893
c:\fotograflar\11111119_001;567893
c:\fotograflar\11111120_001;567390
c:\fotograflar\11111122_001;567390

buarada line 1 de ; den sonraki dosya boyutu ile line2 yi karşılaştırıp (ilksatir=sonrakisatır) ikinci satırın dosya boyutu bir önceki satırla aynıysa 2nci satırındaki veriyi silmem veya bilgisini bir yerde geçici tutmam gerekiyor. sonra 1 ile 3 demem ve baktığımda birinci satır ile 4ncü farklı olduğunu göründe bu sefer 4ncü satırla sonraki satırları karşılaştırmam gerekiyor. ve en sonunda ise yapmak istediğim geçici dosyada tuttuğum filenameleri hard diskin ilgili klasöründen silmek olacak. bu konuda yardımlarını rica edeceğim.

Neticede c:\fotograflar\ klasörü altında sadece aşağıdakiler kalmış olacak.
c:\fotograflar\11111111_001
c:\fotograflar\11111116_001
c:\fotograflar\11111118_001
c:\fotograflar\11111120_001
Merhaba,

Ekte Delphi 10.3.1 ile uyumlu projeyi bulabilirsiniz.
Dosya ekleri
memo filesize compare.7z
(51.45 KiB) 11 kere indirildi

Cevapla