Bantları seçerek zaman aralığıyla okunan verileri almak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Bantları seçerek zaman aralığıyla okunan verileri almak

Mesaj gönderen naturelmania »

Arkadaşlar daha önce bir fotometre programı yazmıştım ve seri porttan gelen veriyi alıp 1 saniye aralıklarla okuyup memoya yazabiliyordu.
Şimdi yapmak istediğim çeşitli bantları seçerek bunlardan sırayla veri almak. Yani toplamda 4 tane bant var U,B,V,R bantları (yanlış anlaşılmasın sadece seri porttan veri geliyor yani tek port ama önündeki filtreler değişiyor) Bunlar için checkboxlar yaptım. Yani diyelim ki U ve B bandını seçtim, 1 saniye arayla önce U bandı için gelen veriyi, sonra 1 saniye bekleyip bu sefer B bandından alsın ve tekrar U bandına geri dönsün ve döngü böylece durdurulana kadar sürsün.
Hemen kaynak kodlarımı yolluyorum. Ben bu şekilde düşündüm ama aynı anda 4 veriyi birden okuyo. ben bunların arasında 1 saniye beklemesini istiyorum.

Kod: Tümünü seç

procedure TForm1.Timer1Timer(Sender: TObject);
var
 Veri : String;
 Form3 : TForm3;
begin
     begin
      if Fotometre2.Form3.U.Checked = True then
        begin
          Comport.ReadStr(Veri,1);
          if Veri = '' then Veri := IntToStr(0);
          Memo1.Lines.Add(DateToStr(Date)+' '+TimeToStr(Time)+ '  U   '+ veri);
        end;
      if Fotometre2.Form3.B.Checked = True then
        begin
          Comport.ReadStr(Veri,1);
          if Veri = '' then Veri := IntToStr(0);
          Memo1.Lines.Add(DateToStr(Date)+' '+TimeToStr(Time)+ '  B   '+ veri);
        end;
      if Fotometre2.Form3.V.Checked = True then
        begin
          Comport.ReadStr(Veri,1);
          if Veri = '' then Veri := IntToStr(0);
          Memo1.Lines.Add(DateToStr(Date)+' '+TimeToStr(Time)+ '  V   '+ veri);
        end;
      if Fotometre2.Form3.R.Checked = True then
        begin
          Comport.ReadStr(Veri,1);
          if Veri = '' then Veri := IntToStr(0);
          Memo1.Lines.Add(DateToStr(Date)+' '+TimeToStr(Time)+ '  R   '+ veri);
        end; 
     end;

end;
işin içinden çıkamadım son çare buraya geldim arkadaşlar :oops:
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Memo1.lines.add satırlarından sonra sleep(1) komutunu kullanarak yapabilirsiniz. Ama bu pek sanatsal olmaz :idea:
Bence şöyle yapın

Kod: Tümünü seç

// siradaki, integer tipte global bir değişken olsun.
procedure TForm1.Timer1Timer(Sender: TObject);
var
 Veri : String;
 Form3 : TForm3;
begin

  if (if Fotometre2.Form3.U.Checked=False) and
     (if Fotometre2.Form3.B.Checked=False) and
     (if Fotometre2.Form3.V.Checked=False) and
     (if Fotometre2.Form3.R.Checked=False) Then siradaki:=0;
  
  if (siradaki=0) Then
  begin
    if Fotometre2.Form3.U.Checked Then siradaki:=1;
    if Fotometre2.Form3.B.Checked Then siradaki:=2;
    if Fotometre2.Form3.V.Checked Then siradaki:=3;
    if Fotometre2.Form3.R.Checked Then siradaki:=4;
  end;


  if (Fotometre2.Form3.U.Checked = True) and (siradaki=1);
  begin
    Comport.ReadStr(Veri,1);
    if Veri = '' then Veri := IntToStr(0);
    Memo1.Lines.Add(DateToStr(Date)+' '+TimeToStr(Time)+ '  U   '+ veri);
    if Fotometre2.Form3.B.Checked Then siradaki:=2;
    Else if Fotometre2.Form3.V.Checked Then siradaki:=3;
    Else if Fotometre2.Form3.R.Checked Then siradaki:=4;
    exit;
  end;

  if (Fotometre2.Form3.B.Checked = True) and (siradaki=2) then
  begin
    Comport.ReadStr(Veri,1);
    if Veri = '' then Veri := IntToStr(0);
    Memo1.Lines.Add(DateToStr(Date)+' '+TimeToStr(Time)+ '  B   '+ veri);
    if Fotometre2.Form3.V.Checked Then siradaki:=3;
    Else if Fotometre2.Form3.R.Checked Then siradaki:=4;
    Else if Fotometre2.Form3.U.Checked Then siradaki:=1;
    exit;
  end;

  if (Fotometre2.Form3.V.Checked) and (siradaki=3) then
  begin
    Comport.ReadStr(Veri,1);
    if Veri = '' then Veri := IntToStr(0);
    Memo1.Lines.Add(DateToStr(Date)+' '+TimeToStr(Time)+ '  V   '+ veri);
    if Fotometre2.Form3.R.Checked Then siradaki:=4;
    Else if Fotometre2.Form3.U.Checked Then siradaki:=1;
    Else if Fotometre2.Form3.B.Checked Then siradaki:=2;
    exit;
  end;

  if (Fotometre2.Form3.R.Checked) and (siradaki=4) then
  begin
    Comport.ReadStr(Veri,1);
    if Veri = '' then Veri := IntToStr(0);
    Memo1.Lines.Add(DateToStr(Date)+' '+TimeToStr(Time)+ '  R   '+ veri);
    if Fotometre2.Form3.U.Checked Then siradaki:=1;
    Else if Fotometre2.Form3.B.Checked Then siradaki:=2;
    Else if Fotometre2.Form3.V.Checked Then siradaki:=3;
    exit;
  end;

end;
Kolay gelsin.
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Mesaj gönderen naturelmania »

Ulu coder hakkten de nickin gibi uluymuşsun helal walla ya. Aklımın ucundan bile geçmemişti bu. Süpper bi kod olmuş hemen yazıyorum mükemmel bi çözüm ya. Ben de kendime programcı diyordum. Bu programlamadan sonra yanımda bi çukur kazıp atliim içine :oops:

Şaka bi yana bu problemimi çözdü tekrar teşekkür ediyorum :lol:
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

işinize yaramasına sevindim fakat ulu, yüce anlamında değil, böyle bir şey haddim de olamaz :roll:

Soru çok güzeldi, tebrik ediyorum:)

Dualarınızı eksik etmeyin.
Cevapla