Most popular

วันอาทิตย์ที่ 22 พฤษภาคม พ.ศ. 2554

เริ่มต้นพัฒนา Thread Object ใน Delphi (2/2)

จากตอนที่แล้วผู้เขียนได้ทดสอบสร้าง Thread Object หรือก็คือ Unit ที่บรรจุ Thread Class ไปแล้ว
เริ่มต้นพัฒนา Thread Object ใน Delphi (1/2) (http://systemdevman.blogspot.com/2011/05/thread-object-delphi-12.html)

ผู้เขียนจะปรับปรุง Code จากตัวอย่างที่แล้ว โดยสร้าง Thread Class เข้าไปใน Unit เดียวกับฟอร์ม
ก็จะมีความง่ายกว่าในแบบแรก เพราะ Thread สามารถใช้งานองค์ประกอบต่างๆที่อยู่บนฟอร์มได้ ไม่ว่าจะเป็น Control ต่างๆ หรือ method ของที่อยู่ใน Class ของ Form
ผู้เขียนจะปรับเปลี่ยนให้ Class แสดงอายุของพนักงานแต่ละท่านออกมาโดยคำนวณจากวันเกิด
Thread Class ที่สร้างขึ้นมีเพียง method Execute เพื่อใช้ทำงานเท่านั้น

TthdEmployeeAge = class(TThread)
protected
     procedure Execute; override;
end;


ภายใน method Execute มีการปรับปรุงเล็กน้อย

procedure TthdEmployeeAge.Execute;
Var
        itemText: String;
        birth: TDateTime;
        age: Integer;
begin
       inherited;
       with form1.DataSource1.DataSet do
       Begin

             First; //ไปที่ข้อมูลแถวแรกก่อน
             form1.ListBox1.Clear; //ล้างข้อมูลใน ListBox
             while not Eof do
             Begin

                  itemText:='รหัสพนักงาน '+FieldByName('EMP_COD').AsString;
                  itemText:=itemText + ' ชื่อ '+ FieldByName('EMP_NAM1').AsString + FieldByName('EMP_NAM2').AsString;
                  itemText:=itemText + ' นามสกุล '+ FieldByName('EMP_NAM3').AsString;

                  //เก็บค่าวันเเกิด
                  birth:=FieldByName('EMP_BRTH').AsDateTime;
                  //คำนวณอายุ
                  age:=YearOf(Now) - YearOf(birth);

                 itemText:=itemText+' อายุ '+IntToStr(age)+' ปี';
                 form1.ListBox1.Items.Add(itemText);
                 Next;
             end;
       end;
end;

การเรียกใช้ จาก Event FormShow() ก็ใช้ Constructor ตัวเดิมที่ Inheritance มาจาก TThread

procedure TForm1.FormShow(Sender: TObject);
begin
       TthdEmployeeAge.Create(false);
end;

ลองทดสอบโปรแกรมก็จะได้ผลคล้ายเดิม แต่จะมีการคำนวณอายุของพนักงานออกมาแทนเพศ


สรุป
การสร้าง Thread Class ขึ้นมาใช้แบบง่ายๆ ทั้งสองแบบนี้ ต่างก็เหมาะสมกับการทำงานแต่ละอย่าง แต่ละจุดประสงค์ Thread Object ซึ่งเป็นไฟล์ Unit แบ่งออกมาชัดเจนนั้นก็จำเป็นต้องสร้างให้มีความยืดหยุ่น ให้มีการทำงานได้จากหลายๆ ที่ในโปรแกรม ส่วนการเขียน Thread ลงไปใน Unit ที่มีอยู่แล้วนั้น อาจจะนำไปใช้ในการเฉพาะของ Unit นั้นๆ เขียนง่ายๆ ทำงานเฉพาะหน้าที่เดียว จึงไม่จำเป็นต้องมีความยืดหยุ่นมาก

Source Code ภายใน Unit1.pas หรือ Form1
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB;

type
      TthdEmployeeAge = class(TThread)
      protected
           procedure Execute; override;
      end;

TForm1 = class(TForm)
     ADOConnection1: TADOConnection;
     ADOTable1: TADOTable;
     DataSource1: TDataSource;
     ADOTable1EMP_COD: TStringField;
     ADOTable1EMP_NAM1: TStringField;
     ADOTable1EMP_NAM2: TStringField;
     ADOTable1EMP_NAM3: TStringField;
     ADOTable1EMP_SEX: TStringField;
     ADOTable1EMP_BRTH: TDateTimeField;
     ListBox1: TListBox;
     procedure FormShow(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

var
     Form1: TForm1;

implementation

uses DateUtils;

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
           TthdEmployeeAge.Create(false);
end;


{ TthdEmployeeAge }


procedure TthdEmployeeAge.Execute;
Var
        itemText: String;
        birth: TDateTime;
        age: Integer;
begin
       inherited;
       with form1.DataSource1.DataSet do
       Begin

             First; //ไปที่ข้อมูลแถวแรกก่อน
             form1.ListBox1.Clear; //ล้างข้อมูลใน ListBox
             while not Eof do
             Begin

                  itemText:='รหัสพนักงาน '+FieldByName('EMP_COD').AsString;
                  itemText:=itemText + ' ชื่อ '+ FieldByName('EMP_NAM1').AsString + FieldByName('EMP_NAM2').AsString;
                  itemText:=itemText + ' นามสกุล '+ FieldByName('EMP_NAM3').AsString;

                  //เก็บค่าวันเเกิด
                  birth:=FieldByName('EMP_BRTH').AsDateTime;
                  //คำนวณอายุ
                  age:=YearOf(Now) - YearOf(birth);

                 itemText:=itemText+' อายุ '+IntToStr(age)+' ปี';
                 form1.ListBox1.Items.Add(itemText);
                 Next;
             end;
       end;
end;

end.

1 ความคิดเห็น:

  1. เข้ามาอ่านเรื่อง thread ทั้งสองตอนในตอนที่ 1 ผมได้ขอให้เขียนอ่านฐานข้อมูลมาใส่ combo พอมาอ่านตอนที่ 2 คิดว่าพอได้คำตอบแล้วครับ ขอบคุณสำหรับสิ่งดี ๆ ที่แบ่งปันนะครับ
    จะแวะมาเป็นขาประจำครับ

    ขอบคุณครับ

    ตอบลบ