|
Îåêßíçóå áðü ôï ìÝëïò evagelos. Τελευταία δημοσίευση από το μέλος Parhs88 στις 24-02-2013, 03:10. Υπάρχουν 19 απαντήσεις.
-
16-12-2012, 11:09
|
-
evagelos
-
-

-
Μέλος από τις 11-06-2012
-
Ιλιον
-
Δημοσιεύσεις 117
-
-
|
Γεια σας παιδιά, Σε μια σχολή που είμαι έχω φτιάξει μια εφαρμογή που καταχωρεί ο χειριστής μέσα απο μια win-form τις συνδρομές των μαθητών. Μου ζητήθηκε να φτιαχθεί κατι ώστε όταν μπαίνει ο μαθητής στην σχολή να το καταχωρεί καποιος για να ξέρουμε ποσες φορές έχει έρθει ο μαθητής ανα μηνα-χρονο κλπ Σκεφτηκα να πάρουμε ένα barcode scanner και να διαβάζει το barcode που θα έχει εκτυπωθει. Το θέμα είναι ότι δεν θέλω να είναι στην "οθόνης καταχώρησης συνδρομών" για να σκαναρει το barcode αλλα να πιανω το event εκτός της συγκεκριμένης οθόνης. Ειδα ότι το scanner μετά το barcode στέλνει και ένα enter. Μπορώ να το πιάσω αυτό. Εχει κανείς καμια ιδέα; Ευχαριστώ
|
|
-
17-12-2012, 09:17
|
|
Απ: barcode scanner - reader
Τα πάντα εξαρτώνται από το scanner, τον driver του και τα utilities που σου δίνει. Οι φθηνότεροι απλά εξομοιώνουν το αριθμητικό πληκτρολόγιο. Οι ακριβότεροι σου δίνουν API για να λαμβάνεις ανεξάρτητα events από το hardware, ακριβώς όπως ζητάς.
Θα πρέπει να ψάξεις το documentation που έχεις για το scanner ή να ψάξεις στο site του κατασκευαστή για να βγάλεις άκρη.
Μία αρκετά χοντροκομμένη λύση πάντως, ειδικά αν ο scanner είναι εντελώς "κινέζικος", είναι να τον ρυθμίσεις να στέλνει κάποιο συγκεκριμένο sequence πριν από κάθε scan. Συνήθως αυτό γίνεται είτε πειράζοντας dip switches (αν υπάρχουν πλέον) ή σκανάροντας συγκεκριμένους κωδικούς. Μετά θα πρέπει να ελέγχεις στο KeyDown/KeyPress της φόρμας μήπως πατήθηκε αυτή η αλληλουχία. Αν συμβεί αυτό, μεταφέρεις το focus στο entry box, ή απλά συνεχίζεις να κάνεις log τα keystrokes μέχρι να έρθει και το Enter. Θα πρέπει να προσέξεις να είναι ενεργοποιημένο το KeyPreview της φόρμας για να μπορεί να δει όλα τα keystrokes. Διαφορετικά τα key events σταματάνε στο event που τα σήκωσε
Οι πιο έξυπνοι λέγονται smart phones  ! Όλες σχεδόν οι εφαρμογές πο διαβάζουν QR codes και άλλα barcode formats βασίζονται σε βιβλιοθήκες όπως η ZXing. Μπορείς άνετα να χρησιμοποιήσεις αυτή τη βιβλιοθήκη, ή το port σε C#, για να σκανάρεις barcodes με τη webcam του laptop σου ή ακόμα και ένα απλό scanner. Άσε που κάπου θα υπάρχει σίγουρα ένα app το οποίο θα κάνει τη δουλειά από το κινητό και θα ειδοποιεί το Laptop σου. Αν χρειάζεται δηλαδή, γιατί ένα app μπορεί πλέον άνετα να κάνει τη δουλειά μίας έξυπνης ταμειακής. Δεν ξέρω βέβαια πως θα το πάρει ο καθηγητής .... 
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
17-12-2012, 12:14
|
-
KelMan
-
-
-
Μέλος από τις 03-11-2004
-
Planet Earth
-
Δημοσιεύσεις 2.851
-
-
|
Απ: barcode scanner - reader
Παναγιώτης Καναβός:
Οι πιο έξυπνοι λέγονται smart phones  ! Όλες σχεδόν οι εφαρμογές πο διαβάζουν QR codes και άλλα barcode formats βασίζονται σε βιβλιοθήκες όπως η ZXing. Μπορείς άνετα να χρησιμοποιήσεις αυτή τη βιβλιοθήκη, ή το port σε C#, για να σκανάρεις barcodes με τη webcam του laptop σου ή ακόμα και ένα απλό scanner. Άσε που κάπου θα υπάρχει σίγουρα ένα app το οποίο θα κάνει τη δουλειά από το κινητό και θα ειδοποιεί το Laptop σου. Αν χρειάζεται δηλαδή, γιατί ένα app μπορεί πλέον άνετα να κάνει τη δουλειά μίας έξυπνης ταμειακής.
Δεν ξέρω βέβαια πως θα το πάρει ο καθηγητής .... 
Απλά παίζει λίγο παραπάνω ρόλο ο φωτισμός και οι ρυθμίσεις της φωτό. Και αν μιλάμε για webcam οπωσδήποτε auto-focus γιατί αλλιώς κλάφτα.
Vir prudens non contra ventum mingit
|
|
-
17-12-2012, 16:10
|
-
evagelos
-
-

-
Μέλος από τις 11-06-2012
-
Ιλιον
-
Δημοσιεύσεις 117
-
-
|
Απ: barcode scanner - reader
και που θα βρω αυτήν την ρύθμιση του autofocus Ειναι στις ρυθμίσεις της καμερας; Εφτασα στο σημείο να βλέπω το barcode απο το laptop αλλά δεν το διαβάζει. Το κινητό το βλέπει μια χαρά.
|
|
-
17-12-2012, 16:20
|
-
KelMan
-
-
-
Μέλος από τις 03-11-2004
-
Planet Earth
-
Δημοσιεύσεις 2.851
-
-
|
Απ: barcode scanner - reader
Πρέπει να υποστηρίζεται από το h/w, θα πρέπει να το αφέρει ως δυνατότητα στα specs. Γενικά, οι φθηνές δεν το έχουν...
Vir prudens non contra ventum mingit
|
|
-
18-12-2012, 14:10
|
-
Libra Storm
-
-

-
Μέλος από τις 28-01-2011
-
Χαϊδάρι
-
Δημοσιεύσεις 142
-
-
|
Απ: barcode scanner - reader
Γιά να "πιάνεις" keystrokes ανεξάρτητα από το αν η εφαρμογή έχει focus ή όχι μπορείς να χρησιμοποιήσεις την SetWindowsHookEx function. Αυτό σε περίπτωση που ο Scanner στέλνει keys.
Αν ο Scanner αναγνωρίζεται ως Device από το λειτουργικό μπορείς να χρησιμοποιήσεις την Βιβλιοθήκη Microsoft POS for .NET. Αυτή αναγνωρίζει τα POS Devices του συστήματος και σηκώνει το DataEvent σε περίπτωση που σκανάρεις κάτι.
|
|
-
18-12-2012, 14:24
|
|
Απ: barcode scanner - reader
Γι αυτό μιλάς? Ή υπάρχει κάτι πιο πρόσφατο? Θα πρέπει πάντως ο scanner να υποστηρίζει το UPOS για να χρησιμοποιηθεί από το POS for .NET
Χμμμ, καιρός να δούμε τις εξελίξεις στα φτηνά barcode scanners ...
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
18-12-2012, 14:36
|
-
Libra Storm
-
-

-
Μέλος από τις 28-01-2011
-
Χαϊδάρι
-
Δημοσιεύσεις 142
-
-
|
Απ: barcode scanner - reader
Ναι, δυστυχώς δεν γνωρίζω αν υπάρχει πιό πρόσφατη έκδοση. Αν δεν υποστηρίζει UPOS δεν θα παίζει θα είναι "Κινέζικος"  .
Δεν μας είπε τελικά ο Evagelos τι scanner έχει.
|
|
-
19-12-2012, 11:51
|
-
evagelos
-
-

-
Μέλος από τις 11-06-2012
-
Ιλιον
-
Δημοσιεύσεις 117
-
-
|
Απ: barcode scanner - reader
δεν έχω ακόμα. Σκέφτομουν κάτι απο εδώ : http://www.ics.gr/index.php?target=categories&category_id=50 αλλά θέλω να είμαι σίγουρος πριν πάρω κάτι. Οσον αφορά το SetWindowsHookEx Μέχρι στιγμής έχω φτάσει εδώ: UserActivityHook actHook;
void MainFormLoad(object sender, System.EventArgs e)
{
actHook = new UserActivityHook(); // crate an instance with global hooks
// hang on events
//actHook.OnMouseActivity+=new MouseEventHandler(MouseMoved);
actHook.KeyDown+=new KeyEventHandler(MyKeyDown);
//actHook.KeyPress+=new KeyPressEventHandler(MyKeyPress);
//actHook.KeyUp+=new KeyEventHandler(MyKeyUp);
}
public void MyKeyDown(object sender, KeyEventArgs e)
{
//LogWrite("KeyDown - " + e.KeyData.ToString());
string value = "";
if (e.KeyValue >= ((int)Keys.NumPad0) && e.KeyValue <= ((int)Keys.NumPad9))
{ // numpad
value = Convert.ToInt16(e.KeyValue - ((int)Keys.NumPad0)).ToString();
}
else if (e.KeyValue >= ((int)Keys.D0) && e.KeyValue <= ((int)Keys.D9))
{ // regular numbers
value = Convert.ToInt16(e.KeyValue - ((int)Keys.D0)).ToString();
}
if (chkNumber(value) == true)
myval = myval + value;
else
myval = "";
if (myval.Length == 13)
{
textBox1.Text = myval;
myval = "";
}
}
private bool chkNumber(string chk)
{
double number;
CultureInfo culture = CultureInfo.CreateSpecificCulture("el-GR");
NumberStyles style = NumberStyles.Number;
if (Double.TryParse(chk, style, culture, out number))
return true;
else
return false;
} Κάνω έλεγχο αν πατησε ο χρήστης ένα χαρακτήρα και αν πάτησε "μηδενίζω" το string μου. Μπορώ να βάλω κάποιο έλεγχο για την διαρκεια πουθ πάτησε τα 2 νούμερα; πχ αν πάτησε 2 νούμερα ε διάστημα 1 δευτερολέπτου το ένα απο το άλλο, είναι σίγουρο ότι δεν το έστειλε το barcode, αλλα τα πάτησε ο χρήστης
|
|
-
19-12-2012, 23:46
|
-
Libra Storm
-
-

-
Μέλος από τις 28-01-2011
-
Χαϊδάρι
-
Δημοσιεύσεις 142
-
-
|
Απ: barcode scanner - reader
"Μπορώ να βάλω κάποιο έλεγχο για την διαρκεια πουθ πάτησε τα 2 νούμερα;" "πχ αν πάτησε 2 νούμερα ε διάστημα 1 δευτερολέπτου το ένα απο το άλλο, είναι σίγουρο ότι δεν το έστειλε το barcode, αλλα τα πάτησε ο χρήστης" Ναι μπορείς, με timespan struct ή με την system.enviroment.tickCount property και "κράτα" την διαφορά χρόνου μεταξύ 2 διαδοχικών keydown events, αλλά αν γιά παράδειγμα ο Χρήστης πχ γράψει πολύ γρήγορα ή απλά πατήσει το ίδιο πλήκτρο συνέχεια θα νομίζει το πρόγραμμα ότι έστειλε event ο Scanner. Θα σου πρότεινα Όταν φτιάξεις τα barcode πρόσθεσε στην αρχή κάποιο αναγνωριστικό ή αν ο scanner έχει ρυθμίσεις , ένα νούμερο ή κάποιους ASCII characters και μετά εφόσον ο σκάνερ στείλει Carriage Return ή οτιδήποτε άλλο έχει ρυθμιστεί να στέλνει τότε κάνε parse το string. Φτιάξε τα λοιπόν τα Barcodes σου, βάλε το αναγνωριστικό σου σε αυτά σε συνδυασμό με το ID του Μαθητή και αν γίνει το parse valid γράψε το στην βάση.
|
|
-
20-12-2012, 11:20
|
|
Απ: barcode scanner - reader
Libra Storm:Ναι μπορείς, με timespan struct ή με την system.enviroment.tickCount property και "κράτα" την διαφορά χρόνου μεταξύ 2 διαδοχικών keydown events,
Επαυξάνω για τα υπόλοιπα, έτσι κι αλλιώς πρέπει να ρυθμίσεις το scanner να σου στείλει κάποιους χαρακτήρες στην αρχή για να καταλάβεις ότι πρόκειται για το scanner και όχι για το χρήστη.
Όσον αφορά τους φτηνούς scanners, έριξα μία γρήγορη ματιά σε αυτούς του 40άρικου και βλέπω ότι παίζουν απλά σαν πληκτρολόγια.
Πλατειάζοντας λίγο, βρήκα αυτό το blog post του Stephen Toub (γνωστότατος για το Task Parallel Library, Async programming) για Keyboard Hooks το οποίο συνοδεύει το άρθρο του για debugging με το Visual Studio στο MSDN Magazine του Μαΐου 2006. Βρήκα και άλλες υλοποιήσεις που "τυλίγουν" αυτό τον κώδικα σε μία κλάση που σηκώνει events και αναρωτιέμαι, γιατί events που είναι η "παλιά μόδα" και όχι Tasks που είναι ο σύγχρονος τρόπος προγραμματισμού? Αν ο καθηγητής δεν έχει επιβάλλει τη χρήση .NET 3.5-, άνετα μπορείς να γράψεις το hook με Tasks ή (σε .ΝΕΤ 4.5/4 με προϋποθέσεις) με async/await. Έτσι δεν θα κολλάει το UI όσο η εφαρμογή διαβάζει/επεξεργάζεται τα keystrokes, ούτε θα υπάρχει κίνδυνος να χαθούν keyboard events επειδή το UI thread έτρεχε κάτι άλλο.
Η συμπεριφορά της εφαρμογής θα είναι απείρως καλύτερη και θα εντυπωσιάσει και τον καθηγητή 
Υ.Γ. Αυτό εξελίσσεται σε πολύ ενδιαφέρον thread ...
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
20-12-2012, 11:26
|
|
Απ: barcode scanner - reader
Υ.Υ.Γ Και γιατί όχι και σε Silverlight ... Το Silverlight 5 υποστηρίζει P/Invoke, ενώ με το Microsoft.Bcl.Async package μπορείς να προσθέσεις υποστήριξη για async/await σε .NET 4 και Silverlight 4
Παναγιώτης Καναβός, Freelancer Twitter: http://www.twitter.com/pkanavos
|
|
-
20-12-2012, 23:06
|
-
evagelos
-
-

-
Μέλος από τις 11-06-2012
-
Ιλιον
-
Δημοσιεύσεις 117
-
-
|
Απ: barcode scanner - reader
όπως είπα και στην αρχή θα πρέπει να παίξω μέσα απο τοι υπάρχον πρόγραμμα που έχω φτιάξει. Αυτό είναι σε .net 3.5 Οσον αφορά το ποστ που έδωσες πιο πάνω ομολογώ δεν καταλαβα τι πρέπει να κάνω για να το ενσωματώσω στο "δικό" μου. Εκτος και αν φτιάξω μια άλλη εφαρμογή που θα ανοίγει ξεχωριστά και θα κάνει hook. Οταν βρει αυτό που πρέπει να βρει, θα συνδέεται στην mysql για να κάνει το insert στους πίνακες που θέλω using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;
class InterceptKeys
{
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private static LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
public static void Main()
{
_hookID = SetHook(_proc);
Application.Run();
UnhookWindowsHookEx(_hookID);
}
private static IntPtr SetHook(LowLevelKeyboardProc proc)
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
GetModuleHandle(curModule.ModuleName), 0);
}
}
private delegate IntPtr LowLevelKeyboardProc(
int nCode, IntPtr wParam, IntPtr lParam);
private static IntPtr HookCallback(
int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
Console.WriteLine((Keys)vkCode);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook,
LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
}
|
|
-
02-01-2013, 01:16
|
-
evagelos
-
-

-
Μέλος από τις 11-06-2012
-
Ιλιον
-
Δημοσιεύσεις 117
-
-
|
Απ: barcode scanner - reader
με τα πολλά: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
| public void MyKeyDown(object sender, KeyEventArgs e)
{
string value = "";
if (e.KeyValue >= ((int)Keys.NumPad0) && e.KeyValue <= ((int)Keys.NumPad9))
{ // numpad
value = Convert.ToInt16(e.KeyValue - ((int)Keys.NumPad0)).ToString();
}
else if (e.KeyValue >= ((int)Keys.D0) && e.KeyValue <= ((int)Keys.D9))
{ // regular numbers
value = Convert.ToInt16(e.KeyValue - ((int)Keys.D0)).ToString();
}
if (chkNumber(value) == true)
{
myval = myval + value;
if (myval.Length == 1)
myTimeStart = DateTime.Now;
}
else
{
myval = "";
myTimeStart = DateTime.Now;
}
if (myval.Length == barLength)
{
myTimerStop = DateTime.Now;
TimeSpan span = myTimerStop - myTimeStart;
if (this.OpenConnection() == true)
{
try
{
if (loadtrdrObj(myval) == true)
{
if (span.TotalMilliseconds < 100)
{
if (SaveData() == 1)
{
RemTB.Text = "Μαθητής: " + myCustomer.Name + Environment.NewLine +
"Level: " + myCustomer.Level + Environment.NewLine +
"Σχόλια: " +myCustomer.Remarks + Environment.NewLine +
"Ωρα: " + DateTime.Now + Environment.NewLine +
"Τελ. Ημ/νία Πληρωμής: " + myCustomer.LastPayDate;
positioncontrols();
this.Activate();
onePing();
}
}
myval = "";
}
else
{
MessageBox.Show("Δεν βρέθηκε μαθητής με αυτό το Barcode\n\n" + myval, "Λάθος", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (MySqlException ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
this.CloseConnection();
}
}
else
{
MessageBox.Show("Δεν υπάρχει σύνδεση!!!");
}
}
} |
Ψάχνω μονο για νούμερα οταν φτάσει στο επιθυμητό μήκος το string (Γραμμή 27) βλέπω σε πόσο χρόνο πληκτρολογήθηκε (Γραμμή 30) Ψάχνω να βρω αν υπάρχει ο μάθητής στην βάση (Γραμμή 36) Αν ο χρόνος που χρειάστηκε να πληκτρολογηθεί το νούμερο είναι λιγότερο απο 100ms πάει να πει ότι το διάβασε το barcode scanner (Γραμμή 38) Αποθηκεύω τα δεδομένα (Γραμμή 40) Εμφανίζω στην φόρμα μου τις πληροφορίες (Γραμμή 42) Βάζω στο κέντρο της οθόνης την αφαρμογή μου (Γραμμή 48) Την φέρνω μπροστά απο κάθε άλλο ανοιχτό παράθυρο στα windows (Γραμμή 49) Κάνω ένα beep (Γραμμή 50) Μηδενίζω το string μου (Γραμμή 53) Οι υπόλοιπες functions: private void positioncontrols()
{
Rectangle rect = Screen.PrimaryScreen.WorkingArea;
//Divide the screen in half, and find the center of the form to center it
this.Top = (rect.Height / 2) - (this.Height / 2);
this.Left = (rect.Width / 2) - (this.Width / 2);
}
private bool chkNumber(string chk)
{
double number;
CultureInfo culture = CultureInfo.CreateSpecificCulture("el-GR");
NumberStyles style = NumberStyles.Number;
if (Double.TryParse(chk, style, culture, out number))
return true;
else
return false;
}
private bool loadtrdrObj(string barcode)
{
bool found = false;
string SQLtrdr = "select t.company, t.trdr, t.name, ifnull(t.epipedo, 0)level, " +
"(select date from trans where trdr = t.trdr and type=2 order by date desc limit 1) trndate, " +
"ifnull(t.remarks,'') remarks "+
"from trdr t " +
"where t.barcode = @barcode";
MySqlCommand cmd = new MySqlCommand(SQLtrdr, connection);
cmd.Parameters.AddWithValue("@barcode", barcode);
DataTable dt = new DataTable();
MySqlDataReader dataReader = cmd.ExecuteReader();
dt.Load(dataReader);
if (dt.Rows.Count > 0)
{
Customer myCust = new Customer
(
Convert.ToInt16(dt.Rows[0]["company"]),
Convert.ToInt32(dt.Rows[0]["trdr"]),
dt.Rows[0]["name"].ToString(),
Convert.ToInt16(dt.Rows[0]["level"]),
Convert.ToDateTime(dt.Rows[0]["trndate"]),
dt.Rows[0]["remarks"].ToString()
);
myCustomer = myCust;
found = true;
}
else
{
found = false;
}
//close Data Reader
dataReader.Close();
dt.Dispose();
return found;
}
private int SaveData()
{
string SQLtrdr = "";
int r = 0;
SQLtrdr = "insert into trans(company, date, trdr, type, insdate, upddate) values (@company, @date, @trdr, @type, @insdate, @upddate)";
MySqlCommand myCommand = new MySqlCommand();
myCommand.Parameters.AddWithValue("@company", myCustomer.Company);
myCommand.Parameters.AddWithValue("@date", DateTime.Now);
myCommand.Parameters.AddWithValue("@trdr", myCustomer.Trdr);
myCommand.Parameters.AddWithValue("@type", 999);
myCommand.Parameters.AddWithValue("@insdate", DateTime.Now);
myCommand.Parameters.AddWithValue("@upddate", DateTime.Now);
myCommand.CommandText = SQLtrdr;
myCommand.Connection = connection;
r = myCommand.ExecuteNonQuery();
if (r > 0)
{
return 1;
}
else
{
return 0;
}
}
public void onePing()
{
SystemSounds.Asterisk.Play();
} Και επειδή με ευρος 0-100 έχω 0 στον προγραμματισμό, αν μπορείτε να με διορθώσετε όπου μπορεί να κάνω λάθος ή διορθώσεις ... Ευχαριστώ και συγνώμη
|
|
-
04-01-2013, 01:37
|
-
Libra Storm
-
-

-
Μέλος από τις 28-01-2011
-
Χαϊδάρι
-
Δημοσιεύσεις 142
-
-
|
Απ: barcode scanner - reader
public void MyKeyDown(object sender, KeyEventArgs e) // <- DeviceKeyDown ή DeviceCallBack ή ότι άλλο θες, προτείνω όχι my.
{
string value = "";
// <- Κενό
if (e.KeyValue >= ((int)Keys.NumPad0) && e.KeyValue <= ((int)Keys.NumPad9))
{ // numpad <- Θα ξεμείνεις από χαρτί στον εκτυπωτή;
value = Convert.ToInt16(e.KeyValue - ((int)Keys.NumPad0)).ToString(); // Convert.ToInt16;
}
else if (e.KeyValue >= ((int)Keys.D0) && e.KeyValue <= ((int)Keys.D9))
{
// regular numbers
value = Convert.ToInt16(e.KeyValue - ((int)Keys.D0)).ToString();
}
else // Έχεις ήδη φιλτράρει μόνο γιά νούμερα.
{
myval = ""; // αν είναι private εγώ βάζω _myval.
myTimeStart = DateTime.Now; // _
return;
}
// Δεν χρειάζεται αυτός ο έλεγχος, θα γίνει return αν δεν είναι νούμερο στο else που βάλαμε,
// από την στιγμή που το barcode έχει μόνο Νούμερα.
//if (chkNumber(value) == true)
//{
// myval = myval + value;
// if (myval.Length == 1)
// myTimeStart = DateTime.Now;
//}
//else
//{
// myval = "";
// myTimeStart = DateTime.Now;
//}
myval = myval + value; // myval += value;
if (myval.Length == 1)
{
myTimeStart = DateTime.Now;
}
else if (myval.Length == barLength)
{
myTimerStop = DateTime.Now;
TimeSpan span = myTimerStop - myTimeStart; // ή stopwatch όπως σωστά ανέφερε ο Παναγιώτης.
if (this.OpenConnection() == true) // if (this.OpenConnection())
{
try
{
if (loadtrdrObj(myval) == true) // if (loadtrdrObj(myval))
{
if (span.TotalMilliseconds < 100)
{
if (SaveData() == 1) // if (SaveData() > 0), αλλιώς αν θέλεις 0 ή 1 τότε γύρνα bool.
{
RemTB.Text = "Μαθητής: " + myCustomer.Name + Environment.NewLine +
"Level: " + myCustomer.Level + Environment.NewLine +
"Σχόλια: " + myCustomer.Remarks + Environment.NewLine +
"Ωρα: " + DateTime.Now + Environment.NewLine +
"Τελ. Ημ/νία Πληρωμής: " + myCustomer.LastPayDate;
// RemTB; txtStudent.Text (textBox), lblStudent.Text (label), cmd or btn (Button) κλπ.
//positioncontrols();
//this.Activate(); // γιατί μόνο σε αυτό this;
//onePing();
// είτε
this.positioncontrols();
base.Activate(); // ή this
this.onePing();
}
}
myval = "";
}
else
{
// /n/n ?. /n = Unix, /r = Old MacOS /r/n = Windows.
MessageBox.Show("Δεν βρέθηκε μαθητής με αυτό το Barcode\n\n" + myval,
"Λάθος",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
catch (MySqlException ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
this.CloseConnection();
}
}
else
{
MessageBox.Show("Δεν υπάρχει σύνδεση!!!");
}
}
}
private void positioncontrols() // <- PositionControls() ή καλυτερα CenterForm()
{
Rectangle rect = Screen.PrimaryScreen.WorkingArea;
//Divide the screen in half, and find the center of the form to center it
this.Top = (rect.Height / 2) - (this.Height / 2); // this.Top = (rect.Height - this.Height) / 2;
this.Left = (rect.Width / 2) - (this.Width / 2);
}
private bool chkNumber(string chk) // <- CheckNumber ή IsNumber (string checkString)
{
double number;
CultureInfo culture = CultureInfo.CreateSpecificCulture("el-GR"); // γιατί el-GR; Εγώ έχω en-US δεν θα μου κάνει σωστή μετατροπή.
NumberStyles style = NumberStyles.Number;
//if (Double.TryParse(chk, style, culture, out number))
// return true;
//else
// return false;
return Double.TryParse(chk, style, culture, out number);
}
private bool loadtrdrObj(string barcode) // Τα ονόματα των functions πρέπει να είναι κατανοητά.
{
bool found = false;
string SQLtrdr = "select t.company, t.trdr, t.name, ifnull(t.epipedo, 0)level, " +
"(select date from trans where trdr = t.trdr and type=2 order by date desc limit 1) trndate, " +
"ifnull(t.remarks,'') remarks " +
"from trdr t " +
"where t.barcode = @barcode";
// Caps προτείνω
string SQLtrdrCAPS = "SELECT t.company, t.trdr, t.name, IFNULL(t.epipedo, 0) level, " +
"(SELECT date FROM trans WHERE trdr = t.trdr AND type = 2 ORDER BY date DESC limit 1) trndate, " +
"IFNULL(t.remarks,'') remarks " +
"FROM trdr t " +
"WHERE t.barcode = @barcode";
MySqlCommand cmd = new MySqlCommand(SQLtrdr, connection);
cmd.Parameters.AddWithValue("@barcode", barcode);
DataTable dt = new DataTable(); // ή Using
MySqlDataReader dataReader = cmd.ExecuteReader();
dt.Load(dataReader);
if (dt.Rows.Count > 0)
{
Customer myCust = new Customer
(
(Int16)(dt.Rows[0]["company"]), // cast εφόσον δεν έχει DBNull. Αν έχει System.DBNull.Value ως τιμή ακόμα και το Convert.ToInt16 θα σκάσει.
Convert.ToInt32(dt.Rows[0]["trdr"]), // Το ίδιο
dt.Rows[0]["name"].ToString(), // << >>
Convert.ToInt16(dt.Rows[0]["level"]),
Convert.ToDateTime(dt.Rows[0]["trndate"]),
dt.Rows[0]["remarks"].ToString()
);
myCustomer = myCust;
found = true;
}
//else
//{
// found = false; // Ok αλλά είναι ήδη false
//}
//close Data Reader // πλεονασμός
dataReader.Close(); // το βλέπουμε τι κάνει
dt.Dispose(); // end using
return found; // bFound
}
/*
* Το πιό σημαντικό είναι ότι πρέπει να απομονώσεις τελείως τις συναρτήσεις που έχουν να κάνουν με το ADO (SaveData, CloseConnection κλπ).
* Φτιάξε ένα DLL και βάλε εκεί ότι έχει να κάνει με την βάση.
* Έτσι θα φτιάξεις μία βιβλιοθήκη που θα χρησιμοποιείς σε κάθε project και θα κάνεις την δουλειά σου καλύτερα και γρήγορα.
* Επίσης μην ξεχνάς ότι το ADO σου δίνει την δυνατότητα να το διαχειρίζεσαι μέσα από τα Interfaces που σου δίνει.
* π.χ IDbConnection, IDbCommand κλπ.
* Έτσι θα μπορείς να παραμετροποιείς τις εφαρμογές που θα φτιάξεις στο μέλλον με τέτοιον τρόπο που θα μπορείς να
* κάνεις connect σε όλες τις βάσεις δεδομένων, MySQL, SQL, Oracle κλπ χρησιμοποιώντας τον ίδιο κώδικα.
*/
private int SaveData()
{
string SQLtrdr = "";
// int r = 0;
SQLtrdr = "INSERT INTO trans(company, date, trdr, type, insdate, upddate) VALUES (@company, @date, @trdr, @type, @insdate, @upddate)";
MySqlCommand myCommand = new MySqlCommand();
myCommand.Parameters.AddWithValue("@company", myCustomer.Company);
myCommand.Parameters.AddWithValue("@date", DateTime.Now);
myCommand.Parameters.AddWithValue("@trdr", myCustomer.Trdr);
myCommand.Parameters.AddWithValue("@type", 999);
myCommand.Parameters.AddWithValue("@insdate", DateTime.Now);
myCommand.Parameters.AddWithValue("@upddate", DateTime.Now);
myCommand.CommandText = SQLtrdr;
myCommand.Connection = connection; // Το connection είναι συνέχεια ανοικτό;
// Αν ναι σου προτείνω να το ανοίγεις και να το κλείνεις κάθε φορά.
// r = myCommand.ExecuteNonQuery();
return myCommand.ExecuteNonQuery();
//if (r > 0)
//{
// return 1;
//}
//else
//{
// return 0;
//}
// Να χρησιμοποιείς ένα στυλ σε τέτοιες περιπτώσεις όπως π.χ.
// στο αν θα βάζεις Curly Brackets σε conditions με μία πρόταση στο if ή στο else
// γιατί πριν λες:
//if (Double.TryParse(chk, style, culture, out number))
// return true;
//else
// return false;
}
public void onePing() // ή και public static void αν χρησιμοποιείται και από αλλού.
{
SystemSounds.Asterisk.Play();
} Και τέλος, δεν είναι δύσκολο να περάσεις σε framework 4.0, επίσης υπάρχουν variable length barcode formats που αναγνωρίζουν και ASCII τα οποία είναι πιό βολικά και αναγνώσιμα από νούμερα όπως το 128B.
Καλή επιτυχία στο project σου.
|
|
Σελίδα 1 από 2 (20 εγγραφές)
1
|
|
|