Edit1 to Edit3 do

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
çakal
Üye
Mesajlar: 8
Kayıt: 12 Oca 2004 10:51

Edit1 to Edit3 do

Mesaj gönderen çakal »

SA.
Arkadaşlar Formda gördüğüm bir kodu aşağıdaki gibi derledim. Lakin
For Sayac := Edit1 to Edit3 do satırında
(incopatible types: 'Integer' and 'String' ) gibi bir hata veriyor.
ilgilenirseniz memnun olurum. Teşekkürler


Kod: Tümünü seç

unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, StdCtrls, Grids, DBGrids;

type
  TForm3 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Label2: TLabel;
    Label1: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit5: TEdit;
    Label5: TLabel;
    Edit6: TEdit;
    Label8: TLabel;
    Query1: TQuery;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label6: TLabel;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure SorguYap(Edit1, Edit2, Edit3: String);
    procedure Edit3Change(Sender: TObject);// bu prpsedürü ekliyoruz
    private

   { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation
 uses unit1;
{$R *.dfm}

procedure TForm3.Edit1Change(Sender: TObject);
begin
SorguYap(Edit1.Text, Edit2.Text, Edit3.Text);
 end;

procedure TForm3.Edit2Change(Sender: TObject);
begin
SorguYap(Edit1.Text, Edit2.Text, Edit3.Text);
end;

Procedure TForm3.SorguYap(Edit1, Edit2, Edit3: String);
 Var
  Sayac       : Integer;
  Yazi        : String;
  WhereSatiri : Integer;
begin
  // Dinamiktir Edit sayısı artsa da fonksiyon sabittir. Parametre girişi değişecektir.
  Query1.Active := False;
  Query1.SQL.Clear;
  Query1.SQL.Add('Select * from giris');

  For Sayac := Edit1 to Edit3 do ( ************HATA **********)
  begin
    Yazi := Trim( TEdit( FindComponent( Format('%s%d', [Edit1, Sayac]) ) ).Text );
    If Yazi <> '' then
    begin
       If Pos('Where', Query1.SQL.Text) <= 0 then
       begin // Sadece bir kere bu şarta düşecektir. Çünkü şimdi Where koyucaz.
         Query1.SQL.Add('Where');
         WhereSatiri := Query1.SQL.Count;
       end;

       If Query1.SQL.Count > WhereSatiri // OR Koyalım mı Koymayalım mı ?
       then Query1.SQL.Add(' OR (LOWER(Oda) Like LOWER("%'+Yazi+'%" ))')
       else Query1.SQL.Add('    (LOWER(AdiSoyadi) Like LOWER("%'+Yazi+'%" ))');
    end;
  end;
  Query1.Active := True;


end;


procedure TForm3.Edit3Change(Sender: TObject);
begin
SorguYap(Edit1.Text, Edit2.Text, Edit3.Text);
end;

end.
[/code][/quote]
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

A.S.

for döngüleri için Integer tipte sayılar vermen lazım.

for i:=0 to 5 do

gibi. Eğer Edit'lerin içine sayı girip bunu kullanmak istiyorsan, StrToInt dönüşümü yapman lazım.

for i:=StrToInt(Edit1.Text) to StrToInt(Edit2.Text) do

gibi. Ama çok geçerli bir nedeniniz yoksa böyle kullanmayın. Kullanıcı edit'lere sayı haricinde birşeyler de girebilir.

Kolay gelsin.
loxka
Üye
Mesajlar: 214
Kayıt: 18 Ağu 2003 01:10

Mesaj gönderen loxka »

Bu kod için çözüm ne olmalırıd hocam
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Editlerin onkeypress eventına şu kod yazılarak sayı harici bir değer girilmesi önlenebilir.

Kod: Tümünü seç

  if not(key in ['0'..'9',#13,#9,#8]) then key := #0;
çakal
Üye
Mesajlar: 8
Kayıt: 12 Oca 2004 10:51

Mesaj gönderen çakal »

hayır yanlış anlaşıldı.. ben sayı girilmesin demiyorum..
meselenin özü şu aslında; arama formumda 3 adet editim var ve herbiri ayrı birer field için arama yapmalı ama arama yaparkende aynı zamanda filtrelemeli. Yani.. Edit1'e (yada edit 2,edit 3'e) kriter yazıldığı zaman o istenen veri gelsin ama kriter silinmeden edit 3'e (yada Edit 1. Edit 2) başka bir kriter girildiğinde onuda o gelen verinin içinden süzsün .offf:))
------ velhasılı
ADI ahmet olan (edit1) 30 tane veri varsa ,,Ahmet lerin içinden YASI 40 (Edit2) olanları ve bunların içindende KEL (edit 3) olanları bulmalı...
Yardımlarınızı bekliyor ve çok teşekkür ediyorum
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

dianmik sorgu oluşturmak için

Mesaj gönderen aslangeri »

sanırım dinamik bir sql oluşturmaya çalışıyorsun.
dinamik bir sql için dinamik dizileri biraz araştır.
eğer işine yararsa aşağıya bir bak derim. ufak tefek yazim hatalari olabilir eğer dinamik sql için uğraşıyorsan eminimki onları düzeltebilirsin.(olup olmadığından emin değilim çünkü delphi bu makinede yüklü değil ve bu editör delphinin editörü gibi kullanışlı değil.)
kolay gelsin.

type kısmına
strarray=array of string; //ekle

Kod: Tümünü seç

Procedure TForm3.SorguYap(alanadi,kosul:strarray,editcount:byte); 
Var 
  Sayac       : Integer; 
  Yazi        : String; 
  WhereSatiri : Integer; 
begin 
  // Dinamiktir Edit sayısı artsa da fonksiyon sabittir. Parametre girişi değişecektir. 
//editcount ile hallettik(prametre olayını)
  Query1.Active := False; 
  Query1.SQL.Clear; 
  Query1.SQL.Add('Select * from giris'); 
  yazi:='';
  //For Sayac := Edit1 to Edit3 do ( ************HATA **********) 
  for sayac:=0 to editcount-1 do
  begin 
  if yazi<>'' then yazi :=yazi+' and ';
  yazi:='LOWER('+ALANADI[SAYAC]+') LIKE LOWER(''%'+KOSUL[SAYAC]+'%'')');
  {Yazi := Trim( TEdit( FindComponent( Format('%s%d', [Edit1, Sayac]) ) ).Text ); 
    If Yazi <> '' then 
    begin 
       If Pos('Where', Query1.SQL.Text) <= 0 then 
       begin // Sadece bir kere bu şarta düşecektir. Çünkü şimdi Where koyucaz. 
         Query1.SQL.Add('Where'); 
         WhereSatiri := Query1.SQL.Count; 
       end; 

       If Query1.SQL.Count > WhereSatiri // OR Koyalım mı Koymayalım mı ? 
       then Query1.SQL.Add(' OR (LOWER(Oda) Like LOWER("%'+Yazi+'%" ))') 
       else Query1.SQL.Add('    (LOWER(AdiSoyadi) Like LOWER("%'+Yazi+'%" ))'); }
   query1.sql.add(yazi);
    end; 
  end; 
  Query1.Active := True; 


end
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Kabaca soyle bir kod yazmaniz lazim : Mevcut bir koddan sadelestirmeye calisarak gonderdim. Dogruadan calisan bir kod degil tabi ki. Mantigi anlayarak benzerini yazabilirsiniz. Kolay gelsin....

Kod: Tümünü seç

    with Query1 do
  begin
    SQL.Clear;
    DatabaseName:='DBEMLAX';
    EKLENECEK_SQL:='';
    if not (Edit1.Text='') then
      EKLENECEK_SQL:=EKLENECEK_SQL+' and EMLAK_KODU='+Edit1.Text;
    if not (Edit2.Text='') then
      EKLENECEK_SQL:=EKLENECEK_SQL+' and EMLAX_EMLAK_KAYIT_NO='+Edit2.Text;
    EKLENECEK_SQL:=Copy(EKLENECEK_SQL,5, Length(EKLENECEK_SQL));// cümle içindeki ilk and ayiklaniyor....
    SQL.Add('select * ');
    SQL.Add('from EMLAK E');
    if EKLENECEK_SQL<>'' then
      SQL.Add('where '+EKLENECEK_SQL);
    SQL.Add('Order by EMLAK_KODU');
    Close;
    Prepare;
    Open;
  end;
çakal
Üye
Mesajlar: 8
Kayıt: 12 Oca 2004 10:51

Mesaj gönderen çakal »

Cevaplarınıza ve ilginize teşekkürler
Cevapla