Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

String srch problem C#

[es] :: .NET :: .NET Desktop razvoj :: String srch problem C#

[ Pregleda: 1387 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

tiksi1
Tihomir Makuljević
Bor

Član broj: 59991
Poruke: 197
79.101.169.*



Profil

icon String srch problem C#18.09.2008. u 17:43 - pre 189 meseci
Pozdrav! Imam mali problem..
Ideja aplikacije je:
U textBox se unese nekoliko linija "koda" na osnovu kojeg se: brojevi salju na COM port, a slova setuju neka stanja..
NPR: B 234
F 23
F 123
B 5
........ itd.
Evo koda::


========================================

========================================
private void CodeSetter()
{
string s = tbKod.Text; // sav text ubaci u promenljivu s
try
{ foreach (char c in s) // svaki od karaktera u stringu uporedjuje
{
switch (c)
{
case ('F'): { chbFWD.Checked = true;chbBWD.Checked = false; comm.RTSSet = true; comm.DirectionSteps(); } break;
case ('B'): { chbBWD.Checked = true; chbFWD.Checked = false; comm.RTSSet = false; comm.DirectionSteps(); } break;
case ' ': { tbPoslao.Text += c;} break;
case '\n': { SendSteps(); } break; // kad zavrsi red salje brojeve na COM port
default: { tbPoslao.Text +=c;} break;
}

}
//U slucaju da nema koda
catch { MessageBox.Show("Nije unet kod"); }
}
PITANJE GLASI: Kako da kroz string setam lagano karakter po karakter (npr. on_timer_tick)???
Sa ovim kodom u delicu sekunde se izvrsi sve do zadje linije, a nista od podataka se ne posalje na Port

Unapred hvala
 
Odgovor na temu

marko1981
Marko Nikolic
Beograd

Član broj: 123059
Poruke: 144
*.BVCOM.NET.



Profil

icon Re: String srch problem C#18.09.2008. u 21:00 - pre 189 meseci
Cini mi se da ne parsiras dobro brojeve u stringu (ili ja nisam dobro pogledao tvoj kod).

Citat:

PITANJE GLASI: Kako da kroz string setam lagano karakter po karakter (npr. on_timer_tick)???


Ako vec imas vise redova u stringu iz multiline TextBox-a, onda mozes da ih split-ujes stringom "\r\n" pa da red po red obradjujes, pa onda gledas da li je forward/backward naredba, pa onda procitas broj, a pre toga proveravas sintaksu.


Moguce resenje:

Dodaj Timer kontrolu u formu, postavi property Interval na onoliko milisekundi koliko mislis da je dovoljno mnogo. Ovoj kontroli dodaj handler metodu na dogadjaj Tick.

Code:

this.myTimer.Tick += new System.EventHandler(this.myTimer_Tick);
this.myTimer.Interval = 1000; 


Mozes da u projekat dodas klasu CodeSetter koja bi izgledala nesto poput:

Code:

public class CodeSetter
  {
    private static string[] splitter = { "\r\n" };

    private int position = 0;
    private string[] commands;

    public CodeSetter(string comm)
    {
      this.position = 0;
      this.commands = comm.Split(CodeSetter.splitter, StringSplitOptions.RemoveEmptyEntries);  
    }

    public bool Advance()
    {
      if ((this.commands != null) && (this.position < this.commands.Length))
      {
        string currentCommand = this.commands[this.position];

        // proveri sintaksu
        // vidi koja je naredba u pitanju
        // uradi sta treba sa njom

        return (++this.position < this.commands.Length);
      }
      else
      {
        return false;
      }
    }
  }


Zatim u tekucoj formi treba da napravis instancu klase CodeSetter koju inicijalizujes kada god treba da obradis tekst, pretpostavljam na neki button_Click a ujedno startujes i Timer.

Code:

this.codeSetter = new CodeSetter(tbKod.Text);
this.myTimer.Start();


A metoda myTimer_Tick bi izgledala nesto poput:

Code:

private void myTimer_Tick(object sender, EventArgs e)
{
  if (!this.codeSetter.Advance())
  {
    this.myTimer.Stop();
  }
}



Nisam probao do kraja ovaj kod, ali to je to sto si hteo.


Ako bi citao karakter po karakter preko Timer-a, zakomplikovao bi parsiranje komandi, a i bespotrebno bi se cekalo izmedju svaka 2 karaktera da prodje Interval.

Ovako pravis pauzu samo izmedju 2 naredbe, pa ako je tu uzrok problema, ovo ce da ga resi.


Pozdrav.
 
Odgovor na temu

tiksi1
Tihomir Makuljević
Bor

Član broj: 59991
Poruke: 197
77.46.248.*



Profil

icon Re: String srch problem C#20.09.2008. u 10:53 - pre 189 meseci
Hvala marko 1981.
Evo sta sa sam uradio:

Klasa:
Code:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace MojCodeMenager
{
    class CodeSetterMenager
    {  
        #region Menager Promenljive

        private static string[] splitter = { "\r\n" };
        private int position = 0;
        private string[] commands;

        #endregion;

        #region Menager Konstruktori
        /// <summary>
        /// Konstruktor koji omogucava upis Komandi iz textBoxa
        /// u menager klasu
        /// </summary>
        /// <param name="Komande"></param>
        public CodeSetterMenager (string Komande)
        {
         position = 0;
         commands = Komande.Split(CodeSetterMenager.splitter, StringSplitOptions.RemoveEmptyEntries);  
        }
        /// <summary>
        /// Konstruktor koji setuje string na nulu <na nista :-) >
        /// </summary>
        public CodeSetterMenager()
        { commands = null; } // Setuje string niz na null
        #endregion

        #region ProcesData ?!?!
        /// <summary>
        /// Logika za rad i testiranje
        /// </summary>
        /// <returns></returns>

        public bool ProcesData()
        {    
            if ((commands != null) && (position < commands.Length))
            {
             
                string currentCommand = commands[position];

                // proveri sintaksu
                // vidi koja je naredba u pitanju
                // uradi sta treba sa njom
                return (++position < commands.Length);
            }
            else
            {   
               
                 MessageBox.Show("obradio podatke"); //Ubaceno samo radi testa da li zaustavlja timer
                 return false;
            }
        }
        #endregion
    }
}
         
 


Inplementacija:
Code:

 using MojCodeMenager;
 //Ovako sam inplementirao klasu CodeSetterMenager u Formu
 public partial class Form1 : Form
    {  
        // Objekti mojih klasa
        KomunikacioniMenager comm = new KomunikacioniMenager();
        CodeSetterMenager CodeSetter = new CodeSetterMenager();
      
        public Form1()
        {
            InitializeComponent();
        }

 
 private void btExecute_Click(object sender, EventArgs e)
        {
            try 
            {   //ako je puna prazni tbPosalji
                tbPoslao.Text = "";
                //Klasa...
                CodeSetter = new CodeSetterMenager(tbKod.Text);
                timer2Code.Enabled=true;   
            }
            // U slucaju greske izbaci poruku
            catch
            { MessageBox.Show("Code not executed!"); }
        }
        private void timer2Code_Tick(object sender, EventArgs e)
        {
               if (!(CodeSetter.ProcesData()==true))
                  { timer2Code.Enabled=false; }
        }

// PROBLEM: Na Buton klik (kada je TextBox prazan ) NE ZAUSTAVLJA timer vec stalno izbacuje poruku..
// Kada je u textBoxu unet string, nista se ne dogadja ( ne izbacuje poruku, kao da nikad ne dolazi do kraja stringa)
// Probao sam i metode .Start() i Stop() na timeru ali bezuspesno..
//STA RADIM POGRESNO?! Da nisam nozda pogresno implementirao klasu CodeSetterMenager, ili objekte te klase???

 
Odgovor na temu

marko1981
Marko Nikolic
Beograd

Član broj: 123059
Poruke: 144
*.BVCOM.NET.



Profil

icon Re: String srch problem C#20.09.2008. u 14:10 - pre 189 meseci
Citat:

// PROBLEM: Na Buton klik (kada je TextBox prazan ) NE ZAUSTAVLJA timer vec stalno izbacuje poruku..
// Kada je u textBoxu unet string, nista se ne dogadja ( ne izbacuje poruku, kao da nikad ne dolazi do kraja stringa)
// Probao sam i metode .Start() i Stop() na timeru ali bezuspesno..


Ovo se desava zato sto si ubacio MessageBox.Show() u ProcesData() koji se poziva iz obrade dogadjaja Tick(), a to je uvek nova nit u izvrsavanju, pa se naredba "return false" u

Code:

MessageBox.Show("obradio podatke"); //Ubaceno samo radi testa da li zaustavlja timer
return false;


ne izvrsava dok ne kliknes na "OK", a samim tim ni disable-ovanje Timer-a koje posle sledi. A novi MessageBox izlece cim istekne timer2Code.Interval milisekundi.

Izbaci ovaj MessageBox.Show() poziv, a ubaci ga u

Code:

private void timer2Code_Tick(object sender, EventArgs e)
    {
      if (!(CodeSetter.ProcesData() == true))
      { 
        timer2Code.Enabled = false;
        MessageBox.Show("obradio podatke"); // <============================
      }
    }


Dakle, osim ovoga kod je korektan i sigurno ce da prodje kroz sve naredbe, samo sto ti nacin detektovanja da je prosao kroz sve nije bio dobar.

Postavi breakpoint-e na par mesta pa u debug-u detaljno pogledaj, videces da ti je kod OK.

Takodje, predlazem da radis sa Start() i Stop() (mada i sa Enable radi ok), a i proveri da li si postavio timer2Code.Interval koliko ti odgovara, inicijalno je 100 milisekundi.
 
Odgovor na temu

tiksi1
Tihomir Makuljević
Bor

Član broj: 59991
Poruke: 197
77.46.248.*



Profil

icon Re: String srch problem C#21.09.2008. u 14:06 - pre 189 meseci
Hvala! Ovo sam i ja provalio 5 min. nakon sto sam postovao problem :)

Probacu sa breakpoint-ima da detaljnije analiziram kod.. Ukoliko bude problema postovacu, a natavno i ako proradi postovacu resenje.. mozda nekom zatreba. Pozz.

P.S Da li u klasi da kreiranje konstruktora ostavim ovako:
Code:

 public CodeSetterMenager()
        { commands = null; } // Setuje string niz na null


Ili je mozda pametnije da to bude prazna funkcija:
Code:

 public CodeSetterMenager()
        {  }      // Prazan konstruktor klase
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: String srch problem C#

[ Pregleda: 1387 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.