Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Memo bileşeni Duplicate veya Put hakkında yardım
#1
iyi günler, herkese selamlar.


yapımına devam ettiğim bir projede bir yerde takıldım. memo bileşeninin duplicate veya put özelliği olmadığından yada varsa ben bilmiyorum projeyi devam ettiremedim.

yapımına uğraştığım şeyde birden fazla memo bileşenine gelen veriyi ayıklayıp listbox itemine güncellenerek ve item indexi bozulmadan yazmak istiyorum.

örnek olarak verirsek; saniyede yada daha kısa sürelerde memo bileşenine gelen 10'larca veri
bu veriler şu şekilde gelmektedir.


123,456,Murat
456,654,Yakup
1586,620,Mehmet
1478,2548,Turhan
[b]133,426,Murat[/b]
[b]1245,699,Yakup[/b]
[b]1186,1630,Mehmet
478,248,Turhan[/b]
vs. vs. vs.


bu gelen verileri isimden ayırt ediyorum. çünkü isimler sabit, değerler daima farklı olacaktır. ve bunun gibi onlarca farklı isim olabilir.

şimdi asıl olay burda başlıyor. bu isimden ayırdığım verileri listbox eklerken alt alta değil, her bir isimin bir itemindex'e sahip olması ve değişen değerleri listbox 'ta kendi itemindexinde değişmeli. yani

listbox içeriği
itemindex 0 123,456, murat -> memo1 changed , 133,426,murat
itemindex 1 456,654,yakup -> memo1 changed , 1245,699, yakup
vs.vs.

umarım açıklayıcı olmuştur. yardımlarınızı bekler sağlıklı günler dilerim.



edit, buraya kadar ilerledim ilk değerde sıkıntı yok. ama ikinci veya daha fazla değerlerde listbox'da sürekli Yok mesajı gelip alt alta yazmakta.
var
FindName : Integer = 0;
FriendName : array of string;

Procedure TForm1.LiveReader(Komut : string);
var
Liste : TStringList;
Veri, Name : string;
i, ilk, son : Integer;
begin
Liste := TStringList.Create;
Liste.Add(Komut);
for I := 0 to Liste.Count -1 do
begin
Veri := Liste.Strings[0];
   ilk := StrToInt( copy( Veri, 1, Pos(',', Veri)-1) );
        system.Delete(Veri, 1, Pos(',', Veri));
   son := StrToInt( copy( Veri, 1, Pos(',', Veri)-1) );
        system.Delete(Veri, 1, Pos(',', Veri));
Name := Trim(Veri);
SetLength(FriendName, FindName + 1);
if (Pos(Name, FriendName[i]) <> 0) then
listbox1.Items.Strings[i] := Name
else
begin
listbox1.Items.Add('Yok ' +Name);
FriendName[FindName] := Name;
Inc(FindName);
end;
Break;
end;
Liste.Free;
end;
Cevapla
#2
Delphi'deki System.Generics.Collections'ı araştırmanızı öneririm. Orada işinize yarayacak bir çok sınıf bulacaksınız. Özellikle TDictionary işinizi görür gibi...
There's no place like 127.0.0.1
WWW
Cevapla
#3
delphi 2007 kullanıyorum. yavaş yavaş çözüme gidiyorum hocam hissediyorum Smile
Cevapla
#4
Merhaba.

- Burada yardımcı olmak adına mantıken hatalı gördüğüm noktaları paylaşayım. Idea

(1) Memo'ya değerler alındı ve topluca LiveReader procedure'e gönderildi diyelim 
  • Bu durumda   Liste.Add(Komut) değil Liste.Text := Komut; olmalıydı.
  • Aksi durumda satır satır veri akıyor ise Liste isimli TStringList'e hiç gerek yoktur, string parametre yeterli olur.
(2) Deneme / yanılma ile yürürken en sona bir BREAK koymuşsunuz. Bu da döngüyü kessin anlamına gelir, döngü oluşabilseydi dahi ilk satırı okuyup dururdu.

(3) Liste.Add(Komut)  deyince tüm veri bu StringList'in ilk elemanına geldiğini fark etmiş olmalısınız ki, dönemeyen döngü içerisinde Veri := Liste.Strings[0]  şeklinde direk hali hazırda tek olan ilk ITEM'e odaklanmışsınız. Ancak bu item içinde MEMO'dan toplu veri geldiğinden satırlar dolusu veri var olduğu bir gerçek. Yukarıda buna ilişkin örnek vermişsiniz.

(4) FriendName ARRAY içerisinde hiç arama yapmadan gelen NAME'i direkt array'e eklemişsiniz. Biliniz ki aynı isimden üç kere veri gelirse ARRAY'e ekleme yapılmaması gerekiyor. O array'in eleman sayısı olan index'teki ListBox Iteminin güncellenmesi gerekecek referans olacaktır.


bu liste uzayıp gider.

Öncelikle şunu paylaşır mısınız ? memo'lara gelen onlarca veri birikiyor dediniz.
Memo(lar)a eklenen her satır veri için ilgili MEMO'nun MemoOnChange tetikleniyordur. LiveReader' buralarda mı ? tetiklendiği andaki son satırı Livereader'a gönderiyorsunuz yoksa OnChange eventini kullanmıyor da timer veya elle MEMO'ların TEXT property'si ile kümülatif bir yollama mı tercih ediyorsunuz ? Bu sorunun cevabı, LiveReader procedure'ünüzün ilk satırına ilişkin yapıyı belirleyecektir.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#5
üsttad bazı düznelemeler yaptım  liveread kısmında, öncelikle ilk gelen veri kullanıcı adı olsun onu belirleyelim dedim.

ilk gelen veri isim olduğundan bunu sabit değişken le bir artırarak friendname kısmına array of string içerisine aldım.


var
birekle : integer = -1;
livereader kısmı
if pos('@' , komut) <> 0 then
begin
inc(birekle)
friendname[birekle] = komut
end;

friendname ilk satırına ilk kullanıcı ekledim. bu bir socket uygulaması olduğundan ilk bağlantı verisi her zaman isim olacak. ondan sonra 123,456,yakup gibi veriler gelecek.

istediğim şeyi yaptım ama işimi görmediğinden komple o kısımları değiştirmek zorunda kaldım. dolayısıyla burada yardım istediğim şey artık işime yaramıyor. şuan friendname deki isim tablom ile gelen veriyi ayıklamakla uğraşıyorum. verileri kimlerin yolladığını bilmek gerekiyo.

zaman ayıran arkadaşlara teşekkür eder iyi günler dilerim.
Cevapla
#6
Üzerinde çalıştığın konudun bahsettiğim kriterler göre düzenlenmiş hali şu şekilde.

var
  FindName    : Integer = 0;
  FriendName  : array of string;

Procedure TForm1.LiveReader(Komut : string);
var
 Liste : TStringList;
 Veri, Name : string;
 i, j, ilk, son : Integer;
 bulundu : boolean;
begin
 Liste := TStringList.Create;
 try
   Liste.Text := Komut;
   for i := 0 to Liste.Count -1 do
   begin
     Veri := Liste.Strings[i];
      ilk := StrToInt( copy( Veri, 1, Pos(',', Veri)-1) );
           system.Delete(Veri, 1, Pos(',', Veri));
      son := StrToInt( copy( Veri, 1, Pos(',', Veri)-1) );
           system.Delete(Veri, 1, Pos(',', Veri));
     Name := Trim(Veri);

  // FriendName Array içinde arama
     j       := 0;
     bulundu := false;
     while ( j < FindName ) and (NOT bulundu)
     do if FriendName[j] = Name
        then bulundu := True  // "j" değeri değişmeden True ile while döngüden çıkar.
        else inc(j);

     if bulundu
       then // "j" değeri aynı zamanda FriendName'in ListBox ItemIndex değeridir.
         ListBox1.Items.Strings[j] := Format( '%s : %d, %d', [ Name, ilk, son ] )
       else begin // Bulunamamış. Array'a yeni ismi ekliyoruz.
         SetLength(FriendName, FindName + 1);
         FriendName[FindName] := Name;
         Inc(FindName);

         ListBox1.Items.Add( Format( '%s : %d, %d', [ Name, ilk, son ] ) );
       end;
   end;
 finally
   Liste.Free;
 end;
end;



Bu da geliştirilmiş başka bir versiyonu.
Procedure LiveReader_Gelismis(Komut : string; ListBox : TListBox);
const
{$j+}
 FFriendName     : array of string = [];
{$j-}
 Tab = #9;
var
 aListe,
 aSplit          : TStringList;
 i, j            : Integer;
 aVar            : Boolean;
 aTemp           : String;
begin
 ListBox.Font.Name := 'Courier New'; // formatlı görünsün diye sabit genişlikli font
 ListBox.TabWidth  := 45;

 aListe := TStringList.Create;
 aSplit := TStringList.Create;
 try
   // Parse işlemini otomatik yapar...
   aSplit.Delimiter        := ',';
   aSplit.StrictDelimiter  := True;

   aListe.Text             := Komut;
   for i := 0 to pred(aListe.Count) do
   begin
     aSplit.DelimitedText := Trim( aListe[i] );
     // ilk := aSplit[0]; // son := aSplit[1]; // Name:= aSplit[2];

     // Arama kısmıdır ... Bulunursa (j) index'i verir....
     j     := low(FFriendName);
     aVar  := False;
     while ( j <= high(FFriendName) ) AND (NOT aVar) do
     begin
       if FFriendName[j] = aSplit[2]
         then aVar := true
         else inc(j);
     end;

     if not aVar then
     begin
       // FFriendName Array'de Yokmuş...Yenisi eklenecek...
       if high(FFriendName) < 0  // -1 ise array boş demektir.
         then SetLength( FFriendName, 1 )
         else SetLength( FFriendName, 1 + high(FFriendName)+1 );

       FFriendName[ high(FFriendName) ] := aSplit[2];
       ListBox.Items.Add(  Format( '%s '+Tab+' First Value  : %5s, %5s', [ aSplit[2], aSplit[0], aSplit[1] ] ) );
     end else
     begin
       // FFriendName Array'de Bulundu...
       // "j" değişkeninde while döngüsünde bulunan FFriendName index'i var...

       // Bu da bonus // "Değerlerin (Değişim Tekrarı)"
         aTemp := ListBox.Items[j];
         if pos( 'Changed', aTemp) > 0 then
         begin
           system.Delete(aTemp, 1, Pos('Changed(', aTemp) + Length('Changed(')-1 );
           aTemp := Copy(aTemp, 1, Pos(')', aTemp)-1);
           aTemp := IntToStr( StrToInt(aTemp) + 1 );
         end else aTemp := '1';

       ListBox.Items[j] :=Format( '%s '+Tab+' Changed(%3s) : %5s, %5s', [ aSplit[2], aTemp, aSplit[0], aSplit[1] ] );
     end;
   end;
 finally
   aListe.Free;
   aSplit.Free;
 end;
end;

Memo'nun onChange Eventi
procedure TForm1.Memo1Change(Sender: TObject);
begin // Memo'nun OnChange Event'i
//Yeni veri satırı eklendi... Eklenen son satırı gönderiyoruz...
 LiveReader_Gelismis( Memo1.Lines[ pred(Memo1.Lines.Count) ], ListBox1 );
end;
Bu da test kondisyonu

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Memo1.Lines.Clear;
  Memo1.Lines.Add( '999,1999,Muharrem      ');
  Memo1.Lines.Add( '123,456,Murat          ');
  Memo1.Lines.Add( '456,654,Yakup          ');
  Memo1.Lines.Add( '1586,620,Mehmet        ');
  Memo1.Lines.Add( '1478,2548,Turhan       ');
  Memo1.Lines.Add( '133,426,Murat          ');
  Memo1.Lines.Add( '1245,699,Yakup         ');
  Memo1.Lines.Add( '1186,1630,Mehmet       ');
  Memo1.Lines.Add( '1000,2000,ARMAN        ');
  Memo1.Lines.Add( '478,248,Turhan         ');
  Memo1.Lines.Add( '1576,621,Murat         ');
  Memo1.Lines.Add( '1577,622,Murat         ');
  Memo1.Lines.Add( '1578,623,Murat         ');
  Memo1.Lines.Add( '1579,624,Murat         ');
end;



jo99oiowvwerkqe13ji1.png
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#7
üstad eline emeğine sağlık
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Üretim planlama hakkında boreas 2 180 19-06-2020, Saat: 11:25
Son Yorum: uparlayan
  Memo font rengi değiştirme Haydar 3 264 05-06-2020, Saat: 16:12
Son Yorum: cinarbil
  Exe veya Dll'yi Unit haline dönüştürmek carsoft 4 482 12-05-2020, Saat: 00:39
Son Yorum: carsoft
Lightbulb Delphi Proje Yardım ThePixeL 18 1.781 29-04-2020, Saat: 02:28
Son Yorum: ThePixeL
  Thread Socket (Yardım) hkeskin 0 195 27-04-2020, Saat: 00:43
Son Yorum: hkeskin



Konuyu Okuyanlar: 1 Ziyaretçi