Yorumları: 24
Konuları: 4
Kayıt Tarihi: 25-10-2016
Rep Puanı: 142 Başlangıç
10-04-2020, Saat: 12:48
(Son Düzenleme: 11-04-2020, Saat: 14:32, Düzenleyen: TescilsizUzman.)
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;
Yorumları: 1.571
Konuları: 88
Kayıt Tarihi: 09-08-2016
Rep Puanı: 13.829 Üstad
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
Yorumları: 24
Konuları: 4
Kayıt Tarihi: 25-10-2016
Rep Puanı: 142 Başlangıç
delphi 2007 kullanıyorum. yavaş yavaş çözüme gidiyorum hocam hissediyorum
Yorumları: 1.657
Konuları: 20
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 18.974 Üstad
11-04-2020, Saat: 15:56
(Son Düzenleme: 11-04-2020, Saat: 15:57, Düzenleyen: mrmarman.)
Merhaba.
- Burada yardımcı olmak adına mantıken hatalı gördüğüm noktaları paylaşayım.
(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
Yorumları: 24
Konuları: 4
Kayıt Tarihi: 25-10-2016
Rep Puanı: 142 Başlangıç
11-04-2020, Saat: 16:36
(Son Düzenleme: 11-04-2020, Saat: 16:40, Düzenleyen: kofmaster.)
ü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.
Yorumları: 1.657
Konuları: 20
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 18.974 Üstad
11-04-2020, Saat: 16:53
(Son Düzenleme: 11-04-2020, Saat: 16:54, Düzenleyen: mrmarman.)
Ü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;
Saygılarımla
Muharrem ARMAN
Yorumları: 24
Konuları: 4
Kayıt Tarihi: 25-10-2016
Rep Puanı: 142 Başlangıç
üstad eline emeğine sağlık
|