İki Listviewi karşılaştırma ?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
spectermun
Üye
Mesajlar: 36
Kayıt: 06 Ara 2014 07:17

İki Listviewi karşılaştırma ?

Mesaj gönderen spectermun »

Arkadaşlar nerden başlayacağımı bilmediğim için konuyu açmak istedim belki bilen arkadaşlar bana yol gösterebilirler. Forma iki tane listview koydum ve

Listview1 de sırası ile

Column1 Column2 Column3

1 elma 2
2 armut 1
3 çilek 0
4 kivi 2
5 portakal 2



Listview2 de sırası ile

Column1 Column2 Column3

1 çilek 0
2 armut 1
3 patlican 2
4 kivi 2
5 salatalık 1


iki listview arasında column 2 lerden eşit olanları bulup eşit olanlardan listview 2 deki column3 ü listbox1 e nasıl aktarabilirim hafif matematikde küme işlemlerine benzedi :)
kirve
Üye
Mesajlar: 64
Kayıt: 03 Nis 2008 12:40

Re: İki Listviewi karşılaştırma ?

Mesaj gönderen kirve »

merhabalar
şyle bir algoritma yazabilirsiniz.
3 boyutlu bir dizi tanımlayın önce
1-listview1 deki ürünün adet sayısı kadar döngü kurun ve bu döngünün içerisinde
2-listview2 deki ürünün adet sayısı kadar döngü kurun
3-eğer listview1 den aldıgınız elamanın aynısını listview2 de bulursanız sıra,ürünadı,adet olarak dizinize listview1 deki adet ile listview2 deki adeti toplayarak yazın
4 eğer listbiew1 den aldığınız eleman listview2 de yok ise dizimize sırano,ürün,adet sırası ile listview1 deki adet kısmını ekleyeniz
5 dizinin icindeki elemanları listview aktarın

karışık olmadı umarım.
iyi çalışmalar.
bundan daha hızlı çalışan algoritmalar geliştirilebilir bu arada.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: İki Listviewi karşılaştırma ?

Mesaj gönderen mrmarman »

Çok uzağa gitmeyin. iç içe iki tane FOR döngüsüne bakar...

Kod: Tümünü seç

Var
  i,j:Integer;
begin
  for i := 0 to ListView1.Items.Count - 1 do
  begin
    for j := 0 to ListView2.Items.Count - 1 do
    begin
      if ListView1.Items[i].SubItems[1] = ListView2.Items[j].SubItems[1]
      then ListBox1.Items.Add( ListView2.Items[j].SubItems[2] );
    end;
  end;
Resim
Resim ....Resim
spectermun
Üye
Mesajlar: 36
Kayıt: 06 Ara 2014 07:17

Re: İki Listviewi karşılaştırma ?

Mesaj gönderen spectermun »

mrmarman hocam yazdığın kodu denedim buttona verdim kodları butona bastığım zaman List index out of bounds (2) hatası verdi. bir yerde bir hata var sanırsam bir de mesela bu hata neyi ifade ediyor hataları da açıklarsan en azından öğrenmiş olurum bir daha böle bir durumla karşılaştığımda halledebilirim geliştirme açısından.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: İki Listviewi karşılaştırma ?

Mesaj gönderen mrmarman »

ListView kullanımını eksik öğrenmişsin. Bu eksiğini tamamladığında bu kodu da çözümleyebilirsin. :idea:
Başarılar.
Resim
Resim ....Resim
spectermun
Üye
Mesajlar: 36
Kayıt: 06 Ara 2014 07:17

Re: İki Listviewi karşılaştırma ?

Mesaj gönderen spectermun »

Hocam Allah razı olsun senden

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
Var
  i,j:Integer;
begin
  for i := 0 to ListView1.Items.Count - 1 do
  begin
    for j := 0 to ListView2.Items.Count - 1 do
    begin
      if ListView1.Items[i].SubItems[0] = ListView2.Items[j].SubItems[0]
      then ListBox1.Items.Add( ListView2.Items[j].SubItems[1] );
    end;
  end;

end;



Kodu bu şekilde değiştirdim düzeldi doğru diyorsun listview de subitem ve itemlerin sıralamasında eksiğim varmış sayende o eksik kapandı saolasın
spectermun
Üye
Mesajlar: 36
Kayıt: 06 Ara 2014 07:17

Re: İki Listviewi karşılaştırma ?

Mesaj gönderen spectermun »

Arkadaşlar

Kod: Tümünü seç

procedure TForm1.Button3Click(Sender: TObject);
Var
  i,j:Integer;
  s,:string;
  meyve1:string;
begin 
s:='armut';


for j := 0 to ListView1.Items.Count - 1 do
begin
if s = ListView1.Items[j].SubItems[0]  then

meyve1 := ListView1.Items[j].Caption;

if ListView1.Items[j].Caption = meyve1 then
begin
  ListView1.Items[j].SubItems.Strings[0] := '22';
  ListView1.Items[j].SubItems.Strings[1] := '33';
end;
end;
end;

bu kod ile list view de string e atadığım kelimeyi bulup onun column larını değiştirebiliyorum ama birden fazla değişim yaptırmak istiyorum beceremedim :(

Yazdığım kod bu

Kod: Tümünü seç

procedure TForm1.Button3Click(Sender: TObject);
Var
  i,j:Integer;
  s,x:string;
  meyve1,meyve2:string;
begin
s:='armut';
x:='elma';

for j := 0 to ListView1.Items.Count - 1 do
begin
if (s = ListView1.Items[j].SubItems[0]) and (x = ListView1.Items[j].SubItems[0]) then

meyve1 := ListView1.Items[j].Caption;
meyve2 := ListView1.Items[j].Caption;

if (ListView1.Items[j].Caption = meyve1) and (ListView1.Items[j].Caption = meyve2) then
begin
  ListView1.Items[j].SubItems.Strings[0] := '22';
  ListView1.Items[j].SubItems.Strings[1] := '33';
end;
end;
end;

Kodu bu şekilde kullandığımda etki etmiyor yada 3 tane 5 tane birden değiştirmek istediğimde olmuyor hatayı nerede yapıyorum acaba ?
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: İki Listviewi karşılaştırma ?

Mesaj gönderen thelvaci »

Kod: Tümünü seç

program pTavsiye;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TConverter = record
  public
    class function IsEqual(const Value1 : TBytes; const Value2 : TBytes) : Boolean; static;
  end;

var
  YourStatus : TBytes;
  YourMessage: String = '';

{ TConverter }

class function TConverter.IsEqual(const Value1 : TBytes; const Value2 : TBytes) : Boolean;
var
  N           : Integer;

  PLen        : PInteger;
  Size        : Integer;
begin
  N := 0;

  PLen := @Value1[0];
  Dec(PLen);
  Size := PLen^;

  while (N < Size) and (TBytes(Value1)[N] = TBytes(Value2)[N]) do Inc(N);

  Result := N = Size;
end;


var
  cStatus,
  cMessage  : TBytes;

  pCurrent,
  pLast     : PByte;
begin

  try
    cStatus := TBytes.Create($41, $43, $45, $4d, $49);
    cMessage:= TBytes.Create($4f, $4e, $43, $45, $20, $4f, $47, $52, $45, $4e, $20, $53, $4f, $4e, $52, $41, $20, $4b, $4f, $44, $4c, $41);

    YourStatus := TEncoding.ASCII.GetBytes('ACEMI');

    if TConverter.IsEqual(YourStatus, cStatus) then
    begin
      pCurrent := @cMessage[Low(cMessage)];
      pLast    := @cMessage[High(cMessage)];

      while pCurrent <= pLast do
      begin
        YourMessage := YourMessage + Chr(pCurrent^);

        Inc(pCurrent);
      end;

      Writeln(YourMessage);
      Readln;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Cevapla