Bir Editte Birden fazla arama yapmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Commandx
Üye
Mesajlar: 151
Kayıt: 01 Oca 2008 05:34

Bir Editte Birden fazla arama yapmak

Mesaj gönderen Commandx » 27 Şub 2020 02:50

Merhaba Arkadaşlar. Delphi7 Kullanıyorum
Bir editte arama yapacağım zaman 1. kişinin adsoyadını yazıp 2. kişinin adısoyadını 3. kişinin adısoyadını yazıp ...... x kadar kişinin advesoyadlarını yazıp Noktalı virgül (veya bir seperatör, örn Noktalı virgül) kullanarak Noktalı virgül ile ayırdığım kişileri azından Listboxta listelemek istiyorum.
Biraz string parse işi yapılması gerek bir türlü başaramadım.

Bunun için kod örneği varmı
Böyle bir örneği internette aradımsada bulamadım yardımcı olursanız sevinirim.
Daha önce bu tür bir ihtiyaç olmamıştı.

Amacım , ComboboxaÖrneğin ;Ali CAN;Murat KAYA;.... gibi yazdığım zaman NOKTALI VİRGÜL seperatörü ile Noktalı virgül ile belirlediğim kişileri Listboxa alt alta gelecek şekilde Sıralamak.


Resim
En son Commandx tarafından 28 Şub 2020 03:29 tarihinde düzenlendi, toplamda 4 kere düzenlendi.
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
Function PARSE( text, ilk, son:String ): String; // Çok Lazım oluyor da :)=
begin
Delete(Text, 1, pos(ilk, Text) + Length(ilk)-1);
Result := Copy(Text, 1, Pos(Son, Text)-1);
end;

Resim

Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 10:22
İletişim:

Re: Bir Editte Birden fazla arama yapmak

Mesaj gönderen esistem » 27 Şub 2020 03:53

Firebird içinde Stored Procedurde aşağıdaki şekilde kullanıyorum sizinde işinizi görür
ARANAN VARCHAR(1024) şeklinde bir input alıp bunun Replace ile sorgusunu oluşturup kullanıyorum.
SARA variant tanımlı bu arada. ASCII_CHAR (44) virgül oluyor, ASCII_CHAR (59) noktalı virgül oluyor, virgül ile ayrılmış gelirse AND diğeri olursa OR oluyor

Kod: Tümünü seç

SARA = '';
IF (ARANAN<>'')
   THEN BEGIN
SARA = ' AND ADI CONTAINING '''||ARANAN;
SARA = Replace(:SARA,ASCII_CHAR (44),''' AND ADI CONTAINING ''');
SARA = Replace(:SARA,ASCII_CHAR (59),''' OR ADI CONTAINING ''');
SARA = :SARA||'''';
        END
//// kullanımıda aşağıda        
execute statement
    'SELECT KOD, ADI
    FROM STOK
    WHERE KOD>0'||:SARA
    into .....

Kullanıcı avatarı
Commandx
Üye
Mesajlar: 151
Kayıt: 01 Oca 2008 05:34

Re: Bir Editte Birden fazla arama yapmak

Mesaj gönderen Commandx » 28 Şub 2020 07:09

Üstat, string parse ile yapmam lazım
En azından İsimlerin bulunduğu comboboxtaki Noktalı virgül ile belirlenilen isimleri parse ederek listboxa atarsam SQL tarafını kendim halledecem.
Comboboxtaki isimlerin ayraçlanmış halinden listboxa altalta gelecek şekilde yapmam gerek.
En son Commandx tarafından 28 Şub 2020 03:30 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
Function PARSE( text, ilk, son:String ): String; // Çok Lazım oluyor da :)=
begin
Delete(Text, 1, pos(ilk, Text) + Length(ilk)-1);
Result := Copy(Text, 1, Pos(Son, Text)-1);
end;

Resim

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

Re: Bir Editte Birden fazla arama yapmak

Mesaj gönderen ertank » 28 Şub 2020 02:32

Merhaba,

Kullandığınız Delphi sürümü nedir?
Sorunlu kod paylaşabilir misiniz?

Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 10:22
İletişim:

Re: Bir Editte Birden fazla arama yapmak

Mesaj gönderen esistem » 28 Şub 2020 02:36

Commandx yazdı:
28 Şub 2020 07:09
Üstat, SQL ile yapmam lazım
En azından İsimlerin bulunduğu comboboxtaki Noktalı virgül ile belirlenilen isimleri parse ederek listboxa atarsam SQL tarafını kendim halledecem.
Comboboxtaki isimlerin ayraçlanmış halinden listboxa altalta gelecek şekilde yapmam gerek.
tamam işte verdiğim örnekteki gibi StringReplace ile yapabilirsiniz.

Kullanıcı avatarı
Commandx
Üye
Mesajlar: 151
Kayıt: 01 Oca 2008 05:34

Re: Bir Editte Birden fazla arama yapmak

Mesaj gönderen Commandx » 28 Şub 2020 03:17

Kod: Tümünü seç

Function TersCevir(no:String):String;
var
    Cevrilen:String;
    i:Integer;
Begin
    i:= 0;
    Cevrilen := '';
    For i := length(no) DownTo 1 Do
    Begin
        Cevrilen := Cevrilen + no[i];
    End;
    Result := Cevrilen;
End;

Function ARADANSEC( text, ilk, son:String ): String;
begin
   Delete(Text, 1, pos(ilk, Text) + Length(ilk)-1);
   Result := Copy(Text, 1, Pos(Son, Text)-1);
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var
  PARSED, Str,Ad,SoyAd:String;
    i,k:Integer;
  begin
    Str := TersCevir(combobox1.Text);
    For i := 1 to Length(Str) do
    Begin
        if Str[i] = ';' Then
        Begin
            For k := Length(Str) downto i do
            Begin
                Ad := Ad + Str[k];
            End;
            Break;
        End;
        SoyAd := SoyAd + Str[i];
    End;
 PARSED:=ARADANSEC(AD,';',';');
 EDIT3.Text:=PARSED;
 LISTBOX1.Items.Add(EDIT3.Text);
 

// IF (';'+PARSED+';')=COMBOBOX1.Text THEN BEGIN
// COMBOBOX1.Clear;
// END;
 
end;
Delphi7 eski sürüm kullanıyorum
Bu fonksiyonları kullanıyorum, Bir yere kadar gelebildim
1.ismi Listboxa atıyor fakat ikinci ismi Listboxa attığımda bayağı bir satır ekliyor onunda combobox1 onchange eventinde döngüye bağlı olmayacak şekilde result edilmesi gerekiyor.
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
Function PARSE( text, ilk, son:String ): String; // Çok Lazım oluyor da :)=
begin
Delete(Text, 1, pos(ilk, Text) + Length(ilk)-1);
Result := Copy(Text, 1, Pos(Son, Text)-1);
end;

Resim

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

Re: Bir Editte Birden fazla arama yapmak

Mesaj gönderen 3ddark » 28 Şub 2020 07:21

Bir mantık kurarak bu işi koordineli bir şekilde yapmalısınız.

Ve işlemi için &&
Veya işlemi için ||
Like yani içeren ile başlayan ile biten için *
Birebir aynı ise =

işaretlerini kullanın. Ayrıca parantez de olmalı bu parantezler işlem önceliğini belirler.

Örnek
(isim AL* || isim=VELİ) && isim *UZUN

İsim AL ile başlayan veya isim VELİ olan ve isim UZUN ile biten kayıtları getirir.

Biraz Excel formül mantığında ve çok basit bir mantıkla excel veya logic mantığı bilen rahatlıkla yapar.
PostgreSQL - Delphi - Linux :!:

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

Re: Bir Editte Birden fazla arama yapmak

Mesaj gönderen ertank » 29 Şub 2020 06:57

Commandx yazdı:
28 Şub 2020 03:17
Delphi7 eski sürüm kullanıyorum
Öncelikle, en son Delphi sürümüne geçiş yapmanızı ne kadar tavsiye etsem azdır. Kullandığınız sürüm ile en son sürüm arasında birçok programlama dili ve özellik eklendi. Kaldı ki 4-5 ay içinde çıkacak yeni sürümde beklenen geliştirmeler büyük projeler ile çalışmayı, kod yazma esnasındaki donma sorunlarına köklü çözümler getirmesi bekleniyor.

Bilmeyenler için; Delphi Community Edition adında bir sürüm yayınladı. En son versiyonu ücretsiz kullanma imkanı sunuyor. Eğer yıllık $5000 altında kazanca ve 5 kullanıcıdan az kullanıcıya sahip gerçek veya tüzel kişi iseniz ücretsiz olarak kullanılabilirsiniz. Aşağıdaki bağlantıdan üye olduğunuzda 1 sene geçerli KEY e-mail adresinize gönderiliyor. Normalde tek sürüm ile çalışıyor bu KEY. Süresi bittikten sonra (bitmeden önce değil, bittikten en erken 1 gün sonra) yeniden talep ettiğinizde yeni KEY gönderiliyor.
https://www.embarcadero.com/products/delphi/starter

Delphi Community Edition ile "Delphi Professional" özelliklerine sahip oluyorsunuz. Sadece veritabanı erişimleri yerel veritabanları ile sınırlı. Bunu aşmak için Firebird'e özel FIBPlus veya profesyonel Devart firması UniDAC gibi bileşen setleri kullanımı yeterli oluyor.

Sorunuza gelince, Delphi 7 ile belli bir karakter kullanarak string -> TStrings ayırma işlemini belli koşullara uyarak aşağıdaki kod ile yapabilirsiniz. Ancak yeni sürümlerde bu koşullara gerek kalmayacak şekilde yapmanız mümkün.

Kod: Tümünü seç

procedure SplitToStrings(const Value: string; const Splitter: Char; List: TStrings);
var
  I: Integer;
  LList: TStringList;
begin
  if not Assigned(List) then Exit;
  LList := TStringList.Create();
  try
    LList.Delimiter := Splitter;
    LList.DelimitedText := Value;
    List.Clear;
    for I := 0 to LList.Count-1 do
      List.Add(LList[I]);
  finally
    LList.Free();
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SplitToStrings(ComboBox1.Text, ';', ListBox1.Items);
end;
Tasarım ekranınız yukarıdaki ilk sorunuzda paylaştığınız ekran şeklinde düşünebilirsiniz. Burada tek dikkat etmeniz gereken konu boşluk karakterleri. Normalde Delphi 7 "TStringList.StrictDelimiters" özelliğini içermiyor. Bu daha sonraki Delphi sürümlerinde gelen bir özellik. Dolayısıyla boşluk karakterlerini de her zaman ayraç olarak algılıyor. Boşluk karakterinin ayraç olmasını engellemek için girilen bilerilerin aşağıdaki şekilde çift tırnak içinde olması gerekiyor.

Kod: Tümünü seç

"ALİ CAN";"MEHMET KAYA";"KENAN AY";"SUAT DAĞ"

Kullanıcı avatarı
Commandx
Üye
Mesajlar: 151
Kayıt: 01 Oca 2008 05:34

Re: Bir Editte Birden fazla arama yapmak

Mesaj gönderen Commandx » 05 Mar 2020 01:10

ertank yazdı:
29 Şub 2020 06:57
Commandx yazdı:
28 Şub 2020 03:17
Delphi7 eski sürüm kullanıyorum
Öncelikle, en son Delphi sürümüne geçiş yapmanızı ne kadar tavsiye etsem azdır. Kullandığınız sürüm ile en son sürüm arasında birçok programlama dili ve özellik eklendi. Kaldı ki 4-5 ay içinde çıkacak yeni sürümde beklenen geliştirmeler büyük projeler ile çalışmayı, kod yazma esnasındaki donma sorunlarına köklü çözümler getirmesi bekleniyor.

Bilmeyenler için; Delphi Community Edition adında bir sürüm yayınladı. En son versiyonu ücretsiz kullanma imkanı sunuyor. Eğer yıllık $5000 altında kazanca ve 5 kullanıcıdan az kullanıcıya sahip gerçek veya tüzel kişi iseniz ücretsiz olarak kullanılabilirsiniz. Aşağıdaki bağlantıdan üye olduğunuzda 1 sene geçerli KEY e-mail adresinize gönderiliyor. Normalde tek sürüm ile çalışıyor bu KEY. Süresi bittikten sonra (bitmeden önce değil, bittikten en erken 1 gün sonra) yeniden talep ettiğinizde yeni KEY gönderiliyor.
https://www.embarcadero.com/products/delphi/starter

Delphi Community Edition ile "Delphi Professional" özelliklerine sahip oluyorsunuz. Sadece veritabanı erişimleri yerel veritabanları ile sınırlı. Bunu aşmak için Firebird'e özel FIBPlus veya profesyonel Devart firması UniDAC gibi bileşen setleri kullanımı yeterli oluyor.

Sorunuza gelince, Delphi 7 ile belli bir karakter kullanarak string -> TStrings ayırma işlemini belli koşullara uyarak aşağıdaki kod ile yapabilirsiniz. Ancak yeni sürümlerde bu koşullara gerek kalmayacak şekilde yapmanız mümkün.

Kod: Tümünü seç

procedure SplitToStrings(const Value: string; const Splitter: Char; List: TStrings);
var
  I: Integer;
  LList: TStringList;
begin
  if not Assigned(List) then Exit;
  LList := TStringList.Create();
  try
    LList.Delimiter := Splitter;
    LList.DelimitedText := Value;
    List.Clear;
    for I := 0 to LList.Count-1 do
      List.Add(LList[I]);
  finally
    LList.Free();
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SplitToStrings(ComboBox1.Text, ';', ListBox1.Items);
end;
Tasarım ekranınız yukarıdaki ilk sorunuzda paylaştığınız ekran şeklinde düşünebilirsiniz. Burada tek dikkat etmeniz gereken konu boşluk karakterleri. Normalde Delphi 7 "TStringList.StrictDelimiters" özelliğini içermiyor. Bu daha sonraki Delphi sürümlerinde gelen bir özellik. Dolayısıyla boşluk karakterlerini de her zaman ayraç olarak algılıyor. Boşluk karakterinin ayraç olmasını engellemek için girilen bilerilerin aşağıdaki şekilde çift tırnak içinde olması gerekiyor.

Kod: Tümünü seç

"ALİ CAN";"MEHMET KAYA";"KENAN AY";"SUAT DAĞ"

Üstat Örnek Çok güzel fakat iki cümle arasında Boşluk oldu mu yani Ad ve Soyad ı yazınca ad dan hemen sonra Soyadı alt satıra geçiriyor
Ali
CAN
Mehmet
KAYA
....
....
gibi
http://www.delphibasics.co.uk/RTL.asp?Name=DaysBetween
Function PARSE( text, ilk, son:String ): String; // Çok Lazım oluyor da :)=
begin
Delete(Text, 1, pos(ilk, Text) + Length(ilk)-1);
Result := Copy(Text, 1, Pos(Son, Text)-1);
end;

Resim

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

Re: Bir Editte Birden fazla arama yapmak

Mesaj gönderen ertank » 05 Mar 2020 01:54

Merhaba,

Açıklamaları okumamışsınız. Son kısmında özellikle bu sorun ile karşılaşmamak için çözüm önermiştim.

Delphi 7 içindeki TStringList boşluk karakterini *her zaman* ayraç kabul eder. Bunu önlemek için ayraç olmayacak boşluk karakteri içeren ifadeleri çift tırnak içine almalısınız.

Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 353
Kayıt: 05 Oca 2012 12:55

Re: Bir Editte Birden fazla arama yapmak

Mesaj gönderen xozcanx » 06 Mar 2020 02:27

Kod: Tümünü seç

Procedure Ayikla(Kaynak:String; Const Ayrac:Char; Hedef:TListBox);
Var
  i,a:integer;
Begin
  a:=1;
  for I := 1 to Length(Kaynak) do
    if Kaynak[i]=Ayrac then
    Begin
      if a=1 Then  Hedef.items.Add(Copy(Kaynak,a,i-1))
      Else Hedef.Items.Add(Copy(Kaynak,a,i-a));
      a:=i+1;
    End;
  Hedef.Items.Add(Copy(Kaynak,a,i-a));
End;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Ayikla(Edit1.Text,',',ListBox1);
end;
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..

Cevapla