Basit bir memo problemi ..

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
gloryboy
Üye
Mesajlar: 26
Kayıt: 21 Eki 2006 10:40

Basit bir memo problemi ..

Mesaj gönderen gloryboy »

Cok basit bir sorunum var biraz ugrastim ama cozemedim. memnonun bir satiri veya editbox ta yazilan bir yazinin olup olmadigini kontrol ettirmek istiyorum.

Ornegin;

Editbox ta "bugun sabah okula erken gittim" cumlesi var

ben sunu istiyorum

if edit1de sabah ve okul ve git kelimeleri varsa then
x := true
else
x := false ;


:shock:
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Aslında cevabı kendin yazmışsın ama şöyle dyebilirsin.

Edit için;

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var x:boolean;
begin
if edit1.Text='bugun sabah okula erken gittim' then
begin
   x:=True;
end
else
begin
 x:=False;
end;

end;

Memo için;

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
var x:boolean;
begin
if memo1.Lines.Strings[0]='bugun sabah okula erken gittim' then
begin

//Memonun ilk satırı için o değeriyle
//Dğer satırlarında arıyorsan ona göre numara vermelisin
   x:=True;
end
else
begin
 x:=False;
end;

end;

Kolay Gelsin.
gloryboy
Üye
Mesajlar: 26
Kayıt: 21 Eki 2006 10:40

Mesaj gönderen gloryboy »

yanlış anlattım sanırım :shock:

şimdi cümle bu

"bugun sabah okula erken gittim"

fakat eğer editte bu cümle varsa demicem editteki yazıların arasında sabah, okul ve git kelimeleri varsa true olacak :?

yani örneğin editte

dün sabah okula geç gittim cümleside tru değerini döndürmeli sanırım şimdi anlatabildim :?
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

DFM dosyası:

Kod: Tümünü seç

object Form1: TForm1
  Left = 192
  Top = 166
  Width = 696
  Height = 480
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Edit1: TEdit
    Left = 104
    Top = 24
    Width = 241
    Height = 21
    TabOrder = 0
    Text = 'bugun sabah okula erken gittim'
  end
  object Button1: TButton
    Left = 192
    Top = 80
    Width = 257
    Height = 73
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
  end
  object ArananKelime: TEdit
    Left = 368
    Top = 24
    Width = 121
    Height = 21
    TabOrder = 2
  end
end

Pas dosyası

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    ArananKelime: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
X:Boolean;
    Sonuc:integer;
begin
Sonuc:=AnsiCompareText(ArananKelime.Text,Edit1.Text);
if sonuc>0 then
begin
   x:=False;
   ShowMessage('Aradığınız Kelime Burada Bulunmuyor');
end
else
begin
    x:=True;
   ShowMessage('Aradığınız Kelime Edit1 in içinde Var');
end;

end;

end.
Kolay Gelsin.
gloryboy
Üye
Mesajlar: 26
Kayıt: 21 Eki 2006 10:40

Mesaj gönderen gloryboy »

boşluk bırakıp edite birşey yazıncada var diyor bu :?
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Mesaj gönderen NewMember »

Kusura bakma az öncekini olasılıklara karşı denememiştim.Sanırım bu çalışıyor.

Pas dosyasını aşağıdakiyle değiştirrisen olurç
Kolay Gelsin.

Kod: Tümünü seç

unit Unit1; 

interface

uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls; 

type 
  TForm1 = class(TForm) 
    Edit1: TEdit; 
    Button1: TButton;
    ArananKelime: TEdit;
    procedure Button1Click(Sender: TObject); 
  private 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); 
var
X:Boolean;
    Sonuc:integer;
begin
Sonuc:=AnsiPos(ArananKelime.Text,Edit1.Text);
if sonuc<>0 then
begin
   x:=true;
   ShowMessage('Aradığınız Kelime Burada var');
end
else  if sonuc=0 then
begin
    x:=false;
   ShowMessage('Aradığınız Kelime Edit1 in içinde yok');
end;

end;

end.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@gloryboy

- Sorunun çözümü için hem aranacak metin hem de aranan metin içeriği ayrı ayrı kelimelere bölünecek ve birer karşılaştırma listesine alınacak.

- Sonra bu iki liste iç içe döngü ile kelimesi kelimesine karşılaştırılıp saydırılacak. Kaynak metin içerisinde aranan metnin tüm kelimeleri varsa, sayaçlardan bulunan kelimeler = aranan kelimeler olacağından sonucu TRUE döndürebilirsin. Sanırım istedin de bu.

- Kelime ayrıştırmadan önce dikkat edilecek hususlar,

* Noktalama imleri varsa bunlar boşluk karakterine dönüştürülecek
* Çift boşluklar teke indirgenecek.

- Kelimeleri karşılaştırırken mükerrer kelime ihtimali de göz ardı edilmeyecek, skoru yanlışlıkla yükseltmeyecek.

- "bu gün bu eve erken geldim" metninde yapılan "bu gün eve erken geldim" aramasında "bu" kelimesi iki puan değeri taşımamalı herhalde. :o
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Biraz vaktim vardı sana bayram hediyesi olarak fonksiyon haline dönüştürdüm. Afiyet olsun. :o

Kod: Tümünü seç

Function TumKelimelerVar( Yazi, Aranan : String):Boolean;
  Procedure KelimelereBol( Yazi:String; Var Liste:TStringList);
  Var
    aYazi : String;
  begin
    Liste.Clear;
    aYazi  := UpperCase(Trim(Yazi));
    // Noktalama imleri boşluğa dönüştürülür.
    aYazi  := StringReplace( aYazi, '.', ' ', [rfReplaceAll]);
    aYazi  := StringReplace( aYazi, ',', ' ', [rfReplaceAll]);
    // Son olarak Çift boşluk varsa veya dönüşümde oluşmuşsa teke indirilir.
    aYazi  := StringReplace( aYazi, '  ', ' ', [rfReplaceAll]);
    aYazi  :=aYazi + ' '; // en sona bir tane boşluk koyalım ki son kelime döngü dışı kalmasın.
    While Pos(' ', aYazi) > 0 do begin
      Liste.Add( Copy(aYazi, 1, Pos(' ', aYazi)) );
      Delete(aYazi, 1, Pos(' ', aYazi));
    end;
  end;

Var
  aKelimeler,
  bKelimeler : TStringList;
  aSayac, bSayac,
  BuluntuSay : Integer;
begin
  BuluntuSay := 0;
  aKelimeler := TStringList.Create;
  bKelimeler := TStringList.Create;
  KelimelereBol( Yazi,   aKelimeler );
  KelimelereBol( Aranan, bKelimeler );
  For aSayac := 0 to aKelimeler.Count-1 do
    For bSayac := 0 to bKelimeler.Count-1 do
      If AnsiUpperCase(aKelimeler[aSayac]) = AnsiUpperCase(bKelimeler[bSayac]) then
      begin // Kelimeler uyuşuyor
        Inc(BuluntuSay);
        // Dilersen burada bir listeye alarak bulunmuş kelimeleri elde edersin.
      end;
  // dilersen buradaki rakamları aşağıdaki şekilde orantılı mesaj yazdırabilirsin.
  // ShowMessageFmt('%d / %d  oranında eş kelime var.', [BuluntuSay, aKelimeler.Count]);
  Result := Boolean( bKelimeler.Count = BuluntuSay );
  bKelimeler.Free;
  aKelimeler.Free;
end;
- Kullanımı da şöyle:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  If TumKelimelerVar( Memo1.Lines[0], Edit1.Text )
      then ShowMessage('Tümü Ok')
      else ShowMessage('Uyuşmayan Kelimeler var...');
end;
- Çalışmalarında başarılar...
Resim
Resim ....Resim
gloryboy
Üye
Mesajlar: 26
Kayıt: 21 Eki 2006 10:40

Mesaj gönderen gloryboy »

#mrmarman bey cok tesekkur ederim. sadece ufak bir problemim kaldı. Şimdi örneğin

memo1.line da "ben bugun eve geldim" cümlesi var

ben edite "ben gel ev bug" yazdigimdada var demeli :?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Kodu incelemediğini kendi ağzınla bildirdin ve kınıyorum. :lol:

Kod: Tümünü seç

      If AnsiUpperCase(aKelimeler[aSayac]) = AnsiUpperCase(bKelimeler[bSayac]) then 
yazan satırı

Kod: Tümünü seç

      If Pos( Trim(AnsiUpperCase(bKelimeler[bSayac])), Trim(AnsiUpperCase(aKelimeler[aSayac])) ) > 0 then
yaparsan istediğin olur. Yani aranan kelimeler, text'in içindeki kelimeler tarafından içeriliyorsa sayac var kabul edilir. Önceki halde eşitlik durumunda var kabul ediliyordu.
Resim
Resim ....Resim
gloryboy
Üye
Mesajlar: 26
Kayıt: 21 Eki 2006 10:40

Mesaj gönderen gloryboy »

:D Oldu tesekkurler :D
Cevapla