[Tutorial] Graphic User Interface (GUI)

kidpro1412

Trứng gà
ok e cảm ơn anh hehe e sẽ cố gắng tìm hiểu thấm chút nào hay chút ấy vậy có gì khó lại làm phiền anh vậy hehe :-d
 

kidpro1412

Trứng gà
Anh ơi anh có biết host free nào tốt cho emoncms ko
cài ở localhost thì không nhận phần đồ thị mặc dù em dùng rất nhiều như appserv vỉtrigo hay xampp...
Trên mạng dùng thử host byethost thì báo lỗi phần request đẩy lên web
e đang dùng tạm http://vis.openenergymonitor.org/emoncms3/
Nhưng e muốn tự cài và sử đổi
với cả nếu ko đẩy lên web thì đồ thị chạy mượt nhưng đẩy lên nó xử lý nhiều chạy rất co giật cái nyaf có phải do máy e yêu ko
Máy e ram có 512 :)
 

Lee

Cố Vấn CLB
Staff member
Từ đó tới giờ anh chỉ xài mỗi byethost, thấy khá tốt. :d
 

kidpro1412

Trứng gà
Tại sao phương thức truyền của em byethost lại không nhận nhỉ
Có khi nào do bản 3 hay không nhỉ hic
hxua e dùng byethost nhiều giwof bỏ web gần 2 năm rồi ^^
 

nguyenquoctrung-hhk

Thành Viên PIF
- đọc từ dòng của file cần truyền ( sử dụng streamreader --> có thể tham khảo bài xuất nhập ra file) ra 1 biến string
nếu mình đọc nội dung của một file :

StreamReader sr = new StreamReader ("Data.txt");
String s;
s = sr.Realine();
_em không rõ là biến s theo kiểu string này sẽ lưu được với kích thước là bao nhiêu, ở dạng mảng hay dạng chuỗi ? nếu kích thước file của mình quá lớn
_em tham khảo thì trong C# nó có 2 lớp : String và StringBuilder. thì đối với ứng dụng em đang sử dụng thì nên dùng lớp nào là thuận tiện cho việc lập trình.
_ý của em xây dựng giao thức kermit như sau :

/*sending*/
B1 : đọc nội dung của file cần truyền (theo như anh nói là dùng StreamReader nhưng em vẫn còn thắc mắc nêu ở phần trên)
B2 : đọc kích thước của file cần truyền
B3 : quy định kích thước của một khung cần truyền
B4 : tao ra một chuỗi tạm thời có kích thước bằng kích thước của khung quy định
B5 : chia nhõ file thành nhiều chuỗi con có kích thước bằng với kích thước của khung quy định.
B6 : gán các chuỗi con cho chuỗi tạm
B7 : chèn thêm số thứ tự khung, ký tự khởi đầu 1 khung, ký tự kết thức một khung, giá trị kích thước khung, mã sửa sai
B8 : dùng seriport truyền các khung này theo thứ tự cho đến khi hết khung truyền.

/*Recevie*/
B1 : Đọc data từ seriport và sửa sai.
B2 : tạo ra hai biến String (giả sử S1 , S2), S1 là biến lưu giá trị nội dung, S2 là biến tạm. Sau đó tách data ra khỏi khung và lưu vào biến tạm
B3 : ghép biến S1 với biến S2 cho đến khi đủ số lượng khung.
B4 : ghi biến S1 vào trong file .txt

trước tiên là cứ cho truyền đúng chưa tính đến việc bị mất gói data hay sửa sai không được báo lại cho phía phát.
các hàm : chèn chuỗi, tách lấy một chuỗi con, ghép nối nhiều chuỗi lại với nhau, đọc kích thước của chuỗi, .... em cũng có tìm được một vài hàm nhưng chưa đủ để sử dụng các cách thức nếu ở trên, và cũng chưa rõ cách khai báo thư viện, cú pháp mình viết nó ra sao, mong anh chỉ dẫn thêm, em xin cám ơn
 

tungbk

Cố Vấn CLB
Staff member
Em kích chuột phải vào chữ string trong dòng khai báo: string mStr; chẳng hạn, rồi chọn Go to definition (phím tắt F12) nó sẽ cho ra 1 list các property cũng như method tác động được lên đối tượng myStr kèm theo chú thích chức năng của nó. Trong đó 1 số như:
+ public static int Compare(string strA, string strB);
+ public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count);
....Nói chung là đọc phần giải thích của hàm rồi chọn cái nào mình muốn.
Vd :
PHP:
        static void Main(string[] args)
        {
            string s = "Hello World";
            string s1 = " I am PIFer!";
            Console.WriteLine(s.Length);    // tinh do dai chuoi
            Console.WriteLine(s.Substring(0,5)); // Tach lay 5 ki tu bat dau tu ki tu thu 0
            Console.WriteLine(s + s1);      // ghep 2 chuoi don gian dung dau '+'
            Console.ReadKey();
        }
 

kidpro1412

Trứng gà
Từ đó tới giờ anh chỉ xài mỗi byethost, thấy khá tốt. :d
A lee có thể nói rõ hơn cách đẩy lên web theo tcp client ở project của a dc ko
dùng như code e thì ko hiểu thằng byethost ko dc
E thử dùng cho thằng byethost a
 

nguyenquoctrung-hhk

Thành Viên PIF
ở lệnh ghi vào COM : Com.write(s). Thì kiểu truyền này đưa 1 chuỗi ký tự vào để truyền.
còn bây giờ dữ liệu em muốn đưa vào là một mảng byte, em tham khảo thì thấy có lệnh Write(Byte[] buffer,int offset, int count), em nghĩ có thể là nó. nhưng chưa hiểu cú pháp như thế nào mong anh Lee, giải thích thêm cho em. em xin cám ơn
 

Lee

Cố Vấn CLB
Staff member
Èo ! Cái này dễ mà.

Khi không biết cụ thể 1 hàm nào, thì em viết cái hàm đó ra trên Visual Studio, rồi nhần F1, nó ra help online. Giải thích rất cụ thể và có cho ví dụ.

Cố gắng nhé em.
 

bumbum1291

Trứng gà
cho em hỏi trong bài 8 cái hàm delegate có tác dụng như thế nào? em chưa hiểu lắm
 

Lee

Cố Vấn CLB
Staff member
Delegate và event rất hấp dẫn. Để hiểu nó thì em cần hiểu kỹ lưỡng hơn về lập trình hướng đối tượng, các thuật ngữ như class, object, instance... phải phân biệt được 1 cách rõ ràng. :D.

Đại loại vầy, anh A và anh B thuộc lớp "con_trai", chị C thuộc lớp "con_gai". Anh A và anh B đều có 1 method là "cho_ban_gai". Chị C nhờ anh A chở đi học, nhưng anh A không thích, thế là nhờ anh B chở đi giùm. Cái việc nhờ đó chính là delegate, hay nói cách khác là "đùn đẩy cho nhau". Hehe.

Delegate giống như là con trỏ hàm trong C, nó sẽ trỏ đến 1 method ở 1 đối tượng nào đó. Khi ta gọi nó, tức là gọi đến method đó. Trong ví dụ trên, anh A gọi method của anh B.

Delegate không quan tâm đến tên hàm mà nó sẽ trỏ tới, mà nó chỉ quan tâm hàm đó có bao nhiều parametter, kiểu gì và giá trị trả về của hàm đó.

Hàm mà nó sẽ trỏ tới phải có số lượng(kiểu) tham số và giá trị trả về như khai báo delegate.

VD : delegate void Cho_ban_gai (string Ten_ban_gai) chỉ có thể trỏ đến hàm void Cho (string name), chứ không thể trỏ đến int Cho (string name) hay void Cho (string ban_gai_1,string ban_gai_2) hay voi Cho (int ban_gai)

Để hiểu rõ hơn mấy thằng này, em có thể tham khảo tại http://vubka.blogspot.com/2010/01/delegate-va-event-trong-c.html

Vụ này rất hấp dẫn, để hiểu tại sao trong bài 8 lại cần cái delegate đó thì em hiểu cái này trước, sau đó là thread. :D. Chắc mệt đây.

Chúc may mắn.
 

nguyenquoctrung-hhk

Thành Viên PIF
delegate là một phương thức dịch ra tiếng việt có nghĩa là "ủy quyền". bây giờ mình lấy ví dụ thực tế cho bạn hiểu một cách thoáng đi, đừng quan tâm tới hướng đối tượng gì cả khi nào hiểu cái này thì bạn sẽ liên tưởng vào trong C# với phương thức delegate.
giả sử tôi là một người kỹ sư xây dựng, tôi nhận được một công trình khá quy mô. cho nên tôi không thể nào quản lý hết nổi một đống công việc, dưới tôi là một số người cộng tác, thì tôi sẽ là người nắm chủ chốt hết công việc và giao cho từng người quản lý 1 mảng nhỏ. riêng tôi cũng phụ trách một phần công việc. nhưng công việc tôi đang làm thì bị lý do gì đó tôi có việc bận phải gặp đối tác, mà trong việc tôi làm thì có 4 phần công việc, sợ chậm tiến độ công trình, tôi phải nhờ một kỹ sư khác và chuyển nhượng bàn giao hết 2 phần công việc cho anh ta làm giúp.
Như vậy việc chuyển nhượng bàn giao cho anh kỹ sư khác làm giúp, thì tôi không cần biết việc tôi giao cho anh ta làm như thế nào, mà tôi chỉ cần biết kết quả anh ta mang lại có tốt hay ko. thì cái đó gọi là ủy quyền.

trước khi học C# bạn nên có một cách nhìn khái quát về nó trước khi bạn nhảy vào "múa" code. C# là họ xây dựng theo mô hình Structure. có nghĩa là cấu trúc, phát triển từ C cổ điển. bạn học C nếu bạn học kỹ và hiểu được chương Struct thì bạn sẽ hiểu được C#.
Cái thứ hai bạn phải hiều được từ "đối tượng" là cái gì ? ví dụ nhà bạn có 4 nhân khẩu, số nhà 123 nằm trong phường A, quận B, tỉnh thành C. Bây giờ tôi đưa cho một người đưa thư cho bạn, trên thư chỉ ghi tên của bạn ==> người đưa thư sẽ nói tôi bị khùng nặng!! sau đó tôi ghi thêm là bạn ở thành phố C, rồi người đưa thư sẽ nói : " tui đâu có siêng để mà đi rạo hết tìm số nhà, mấy cái phường, kiếm hết mấy cái quận trong thành phố C"
Do đó bạn hình dung bạn là một đối tương, tôi là người đang tham chiếu tới bạn. vì thế tôi sẽ ghi như sau :
===> thành phố C.quận B.phường A.số nhà 123.tên bạn
ở trên có thể tôi không nói hết toàn bộ được về C#, nhưng hi vọng sẽ giúp bạn nắm được khái quát về lập trình hướng đối tượng là cái gì...
 

cooliovato

Cố Vấn CLB
Staff member
Èo ! Cái này dễ mà.

Khi không biết cụ thể 1 hàm nào, thì em viết cái hàm đó ra trên Visual Studio, rồi nhần F1, nó ra help online. Giải thích rất cụ thể và có cho ví dụ.

Cố gắng nhé em.
Anh xem giúp em đoạn code này ah, tác dụng của nó là bật Calculator lên, sau đó nhập vào phép tính 13*13=169. Em đang muốn ứng dụng để điều khiển các chương trình khác bằng C# (VD như flash game). Nhưng lạ là nó chỉ chạy chính xác đúng 1 lần duy nhất là lần đầu tiên chạy thử, còn các lần sau thì nó ko chạy đúng nữa (ko sendkey tới calculator đc). Em nghĩ là do không set calculator lên foreground đc nhưng em không biết phải khắc phục như thế nào
Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
 
namespace ConsoleApplicationTest
{
    class Program
    {
        [System.Runtime.InteropServices.DllImport("USER32.DLL", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [System.Runtime.InteropServices.DllImport("USER32.DLL", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        static extern bool SetForegroundWindow(IntPtr hWnd);
 
        static void Main(string[] args)
        {
            Process calc = Process.Start("calc.exe");
            calc.WaitForInputIdle();
 
            IntPtr calculatorHandle = FindWindow(null, "Calculator");
            if (calculatorHandle == IntPtr.Zero)
            {
                Console.WriteLine("Calculator is not running.");
            }
            else
            {
                SetForegroundWindow(calculatorHandle);
                SendKeys.SendWait("13");
                SendKeys.SendWait("*");
                SendKeys.SendWait("13");
                SendKeys.SendWait("=");
            }
        }
    }
}
 

honghiep

Cố Vấn CLB
Staff member
mình nghĩ là do windows foreground 1 cửa sổ mất 1 khoảng thời gian. nên trước khi sendKey bạn để 1 khoảng thời gian trễ (khoảng 200ms) để windows foreground cửa sổ đó lên
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
Bài 7 em bị lỗi: Index was outside the bounds of the array.
Code:
cbCom.Items.Add(ports[i]);
....sao sửa đây ạ :-s (ten combobox của em là cbCom)[/I][/I]

à...nếu em thay
Code:
for (int i = 0; i <= intnoofCom; i++)
                {
                    cbCom.Items.Add(ports[i]);  //Add Com to ComSelect 's combobox
                }
chỗ <= thành < thì lại OK :|...vậy là lỗi chỗ so sánh >"< chắc là thay bằng while hay sao ạ :-s
 

buihaduong

Trứng gà
à...nếu em thay
Code:
for (int i = 0; i <= intnoofCom; i++)
                {
                    cbCom.Items.Add(ports[i]);  //Add Com to ComSelect 's combobox
                }
chỗ <= thành < thì lại OK :|...vậy là lỗi chỗ so sánh >"< chắc là thay bằng while hay sao ạ :-s
Chỗ đó < là đúng rồi bạn, tại vì chỉ số chạy từ 0 tới intnoofCom - 1 mà .
 

khoa vo

Trứng gà
Cảm ơn bác Lee!
Mình đã viết được chương trình nhận dữ liệu qua cổng COM trên máy tính theo như hướng dẫn.
Nhưng khi mình nhận 2 biến từ VĐK qua COM thì ko biết làm cách nào để tách chúng ra làm 2 textbox khác nhau. Mõi textbox nhận 1 giá trị.
Mong được mọi người giúp đỡ. Thanks!
 

thienminh_npn

Thành Viên PIF
Cảm ơn bác Lee!
Mình đã viết được chương trình nhận dữ liệu qua cổng COM trên máy tính theo như hướng dẫn.
Nhưng khi mình nhận 2 biến từ VĐK qua COM thì ko biết làm cách nào để tách chúng ra làm 2 textbox khác nhau. Mõi textbox nhận 1 giá trị.
Mong được mọi người giúp đỡ. Thanks!
Có phải khi bạn compile chương trình vẫn chạy bình thường nhưng tới khi gửi dữ liệu thì nó báo lỗi kiểu như là "abc gì gì đó trong đó có chữ thread" ở cái dòng mà bạn gọi mấy cái textbox không?

Nếu phải thì mình chém một tí về thờ-zét rùi đề nghị giải pháp sau nhé. Thờ-zét-zơ (threads) trong C# hiểu là các luồng xử lý độc lập trên phần cứng, nó không phụ thuộc bạn khai báo cái control như COM hay timer hay button hay textbox trong cái đối tượng nào (ví dụ cái FORMX nào đó chẳng hạn). COM nằm trên thread khác với máy cái control bình thường. Cho nên khi có một control gọi một control khác không cùng thread là có tai nạn giao thông ngay. Phải dò coi thằng control đó nằm ờ luồng nào rùi nhờ một thằng ủy quyền (delegate) chạy sang luồng ấy để thực hiện công việc trên đối tượng đó.

Giải pháp đây: viết một cái method (hàm ghi data và textbox) và một cái delegate để giao tiếp giữa hai luồng:

public delegate void PostData(string Data); /* khai báo thằng ủy quyền */
public void PostDataOnTextBoxes(stringDataFromMCU) /* khai báo cái method */
{
if (TextBox1.InvokeRequired) /* InvokedRequired trả về true/false cho việc control cần truy suất có cùng thread vs control gọi method này */

/*Nếu khác threads, tạo 1 anh ủy quyền*/
{
PostData DelegateOfPostData = new PostData(PostData); /*đặt tên cho anh ủy quyền ấy */
TextBox1.Invoke(DelegateOfPostDatah, new object[] { DataFromMCU }); \
/* ủy quyền cho anh ủy quyền mang tham số của method này (DataFromMCU) sang thread chứa cái control cần tác động*/
}

/*Nếu cùng thread, hoặc anh ủy quyền đã qua đây và thấy mình cùng thread với cái textbox này thì bắt đầu lấy tham số ra thực hiện cộng việc*/
else
{
TextBox1.Text= DataFromMCU;
}
}

Có thể dò luồng một đối tượng chứa cả hai textbox (groupbox chẳng hạn) rùi anh ủy quyền sẽ tìm textbox nào thích hợp vs data này mà tác dụng. Hoặc từng textbox (tùy vào bạn đặt mấy cái control ở đâu nhé)
Have FUN coding!!
 
Top