Listviewde verileri ayırma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

Listviewde verileri ayırma

Mesaj gönderen Dostk »

Merhaba;

İki adet listview kullanıyorum birinde mevcut olan malzemeler diğerinde ise gidecek olan malzemeler var.
Drag and drop ile mevcuttan giden malzemelere aktarıyorum buraya kadar hiç bir sıkıntı yok, fakat drag and drop sırasında databaseye aynı anda insert işlemi yaptırmak istiyorum bunun için nasıl bir yol izlemeliyim? Datbaseye her alanı ayrı ayrı kaydetme gerekiyor bu nedenden listviewde taşınan satırdaki verileri nasıl ayıra bilirim????

Kod: Tümünü seç

procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  DragItem, DropItem, CurrentItem, NextItem: TListItem;
begin
  if Sender = Source then
    with TListView(Sender) do
    begin
      DropItem    := GetItemAt(X, Y);
      CurrentItem := Selected;
      while CurrentItem <> nil do
      begin
        NextItem := GetNextItem(CurrentItem, SdAll, [IsSelected]); // ???
        
        /////////////
        
         Close;
            SQL.Clear;
            SQL.Add('Insert Into GIDENMALZEME(SIRANO, TARIH, IDADI)');
            SQL.Add(' Values (:SR, :TR, :IA)');
            ParamByName('SR').AsInteger := ????
            ParamByName('ST').Value := ????
            ParamByName('IA').Value :=????
            ExecSQL;
        
        ////////
        
        if DropItem = nil then DragItem := Items.Add
        else
          DragItem := Items.Insert(DropItem.Index);
        DragItem.Assign(CurrentItem);
        CurrentItem.Free;
        CurrentItem := NextItem;
      end;
    end;
end;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Listviewde verileri ayırma

Mesaj gönderen freeman35 »

list view yerine neden dbgrid kullanmıyorsun?
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 !!!
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: Listviewde verileri ayırma

Mesaj gönderen adelphiforumz »

Selam Benim önerim
Eğer kayıtların çok fazla değil ise her seferinde veritabanından kayıtları tektek insert, delete yapmak yerine
bir varchar(max) olarak bir filed tanımla
bu field içerisine aşağıdaki yöntemle idleri yaz, sonrada fonksiyonla bunları kullanmanı öneririm.

Kod: Tümünü seç

function TdlgKisiselAyarlar.fn_MenuDurum:String;
var
  I : Integer;
  sTmp : String
begin
  sTmp    := '';
  for I := 0 to cbxUstMenu.Items.Count - 1 do
      sTmp := sTmp + IntToStr(cbxUstMenu.Items[I].Tag) + ';';
  result := sTmp;
end;

Kod: Tümünü seç

create function [dbo].[HVft_SplitStrToInt](@String nvarchar(4000), @Delimiter char(1))
	returns @results table (iReturnValue int)
	as
	begin
		   declare @index int
		   declare @slice nvarchar(4000)
		   declare @sno int
	 
		   select @index = 1
		   if @String is null return
	  
		   set @sno = 0
	 
		   while @index != 0
		   begin
				 select @index = charindex(@Delimiter, @String)
	       
				 if @index !=0
			   select @slice = left(@String, @index - 1)
			else
			   select @slice = @String
	           
			set @sno = @sno + 1
	       
				 insert into @results(iReturnValue) values(cast(@slice as int))
			select @String = right(@String, len(@String) - @index)
	 
			if len(@String) = 0
						break
		   end   
	      
		   return
	end
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Listviewde verileri ayırma

Mesaj gönderen ertank »

Merhaba,

Listview içindeki bilgileri paylaşmanız mümkün müdür? SıraNo, Tarih ve Id bilgilerinin tamamı bir TListViewItem içinde mi saklanıyor? SubItem kullanıyor musunuz?

Sorunuz ve içindeki kod kısmı ile hangi bilginin ne şekilde bulunması gerektiğini anlamak mümkün olmuyor.

Biraz daha detay bilgi paylaşmanızı rica ediyorum.
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

Re: Listviewde verileri ayırma

Mesaj gönderen Dostk »

freeman35 yazdı:list view yerine neden dbgrid kullanmıyorsun?
Dbgrid bence pek kullanışlı değil, drag drop yapılamıyor bildiğim kadarıyla...
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

Re: Listviewde verileri ayırma

Mesaj gönderen Dostk »

ertank yazdı:Merhaba,

Listview içindeki bilgileri paylaşmanız mümkün müdür? SıraNo, Tarih ve Id bilgilerinin tamamı bir TListViewItem içinde mi saklanıyor? SubItem kullanıyor musunuz?

Sorunuz ve içindeki kod kısmı ile hangi bilginin ne şekilde bulunması gerektiğini anlamak mümkün olmuyor.

Biraz daha detay bilgi paylaşmanızı rica ediyorum.
Listview içine henüz detayları eklemedim duruma göre karar gereceğim...
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Listviewde verileri ayırma

Mesaj gönderen ertank »

Taşınacak malzemeler ile ilgili verilerin (database alanlarının) tamamını TListView içinde saklamaya gerek olmadığını düşünüyorum. İstenilen işlem için birden fazla yöntemde çözüm elde etmek mümkün olacaktır. Fikir vermesi açısından aklıma gelen yöntemleri paylaşayım:

1- Taşınması gereken mevcut malzemeler için kullanıcının kolay anlayacağı açıklama vb bilgileri TListView içinde göstererek ve database işlemleri için gerekli KEY alanların verilerini TStringList içinde saklayarak (TListView içindeki indeks değeri ile TStringList içindeki indeks değeri aynı olacak şekilde); drag&drop zamanında hangi TListView indeksi taşınıyor ise database içinden bulmak adına TStringList içindeki aynı indeks verilerini kullanabilirsiniz.

Birden fazla database alanı KEY olaak tanımlı ise bir ayraç karakteri belirleyerek her alanı arka arkaya ayraç karakteri ile yine aynı TStringList indeksi içine kaydedebilirsiniz (örn: "tarih;saat" gibi). Okumak gereken noktada "geçici" bir TStringList oluşturarak TStringList.Delimiter karakteri ve TStringList.DelimitedText özellikleri ile her bir alanı kolayca okumak mümkün olacaktır.

Mevcut malzemeler içinden taşınan bilgiler TListView içinden ve TStringList içinden silinecektir. Aynı mantık ile taşınacak malzemeler içine geri getirilen bilgiler her iki listeye de eklenecektir.

2- Mevcut malzemelerverilerinin tamamını veya bir kısmını hafızada oluşturulacak bir tablo içinde tutabilirsiniz. KEY alanlar dahil herşey bu hafıza tablosunda olacağı için istenilen alanın bilgisi aranabilir/okunabilir/değiştirlebilir veya silinebilir olacaktır. Hafızada oluşturulacak tabloda ekstradan (mevcut malzemeler içinde olmayan) bir KEY alan ekleyerek TListView ile ilişkilendirmek mümkün olacaktır. Mevcut malzemeler içinden taşınan ürünler için hafıza tablosundan ürün bilgilerini çıkarmak Delete() prosedürünü çağırmak kadar kolay olacaktır. Ya da hafıza tablosuna ek alan tanımlayarak (örn: tasindi isminde bir alan) Edit() ve Post() ile taşınan verileri taşındı olarak işaretlemekte mümkündür.

Delphi ile kullanılabilecek birden fazla MemoryTable bileşeni mevcuttur. Bu anlamda en yaygın olarak bilinen ve ücretsiz versiyonu oldukça yeterli Components 4 Developers üretimi kbmMemTable tavsiye edebileceğim bir bileşendir. Bu ürün ile dizayn zamanında tablo alanlarını, indeks alanlarını, vb. belirleyebilirsiniz. Bu anlamda daha az kod yazarak kullanması mümkün bir bileşendir. Daha detaylı bilgi için: http://news.components4developers.com/p ... Table.html

3- TListView içinde her bir taşınacak malzeme başına bir artan rakam ekleyerek (örn: "1- a malzemesi") taşınacak malzemelerin sadece KEY alanlarını saklayıp (yine gerekli ise belirlenmiş bir ayraç karakteri ile birden fazla alan tek bir string değer olarak kaydedilerek) fare taşıması esnasında ayrılarak ve SQL yardımı ile kaynak tablo içinden bilgileri okunup hedef tablo içine kaydedilebilir. Listede ilk açıldığında 10 taşınacak malzeme var ise taşımalar ardından bu sayı 7'ye düştü ise ve bir malzemenin taşınmasından vazgeçildi ve taşınacak malzemeler listesine geri alınacak ise bu kez geri gelen malzeme başına 11 rakamı (başa eklenen rakamlar sürekli artacak şekilde) eklenebilir. Bu kez TStringList içinde indeks numarası değil her bir verinin başındaki rakamlar kullanılarak eşleştirme yapılabilir.

4- Yukarıda açıklanmaya çalışılan 3 Numaralı yöntem ile 1 numaralı yöntem birleştirlerek kullanılabilir. Kullanıcı anlamlı ve açıklayıcı verileri ekranda görür, değerlerin başlarındaki rakamlar ile TStringList ile eşleştirme yapılabilir.

Yukarıdaki yöntemler dışında birçok farklı yöntem geliştirilebilir. Bu noktada mevcut malzeme listesinin büyüklüğü, yapılacak SQL işlemlerinin çokluğu, uygulamanın database sunucuya erişim şekli, uygulamanın çalışacağı bilgisayarın/bilgisayarların muhtemel özellikleri, fare ile taşıma işleminin ne kadar hızlı bir şekilde kullanıcıya görsel/duyusal cevap vermesi gerektiği ve daha sıralanabilecek her bir gereklilik seçilecek yöntemin belirlenmesinde rol oynayacaktır.

Bu anlamda soru sorulduğu anda mümkün olduğunca fazla detay verilmesi alınacak cevapların kullanılabilirlik ve uygulanabilirlik derecesini de artıracaktır.
Cevapla