3. 2C ÁC VẤN ẹỀ CHÍNH CẦN GIẢI QUYẾT
3.3.7.1 ẹeỏm soỏ nhaứ ủaừ baựn
Bán coự theồ ủeỏm coự bao nhiẽu nhaứ ủaừ baựn baống caựch nhaỏn nuựt ẹeỏm Nhaứ ẹaừ Baựn, moọt khung trao ủoồi nhử sau hieọn ra nhử sau ủãy cho bán thõng tin coự taỏt caỷ bao nhiẽu nhaứ ủaừ baựn.
ẹeồ ủeỏm soỏ nhaứ ủaừ baựn, chửụng trỡnh sinh ra moọt thread tẽn HomeSellCountThread procedure THomeSentCountThread.Execute; begin EnterCriticalSection(CritSect); Synchronize(DoThread); LeaveCriticalSection(CritSect); end; DoThread nhử sau : procedure THomeSellCountThread.DoThread; begin RepThueForm.fHomeSellCount := ChatForm.HomeData.HomeGetCountSell; end;
3.4 Caực chửực naờng cho ngửụứi caọp nhaọt thõng tin nhaứ
3.4.1 Tỡm kieỏm moọt nhaứ
Khi ngửụứi caọp nhaọt thõng tin nhaứ goừ vaứo õ soán thaỷo tỡm kieỏm, chửụng trỡnh seừ gửỷi moọt thõng ủieọp tỡm kieỏm ủeỏn maựy server keứm theo noọi dung tẽn nhaứ hó ủaừ ủaựnh vaứo. Maựy server seừ tieỏn haứnh vieọc tỡm kieỏm naứy (Táo ra moọt thread tẽn
THomeSearchTextThread) vaứ traỷ về cho client index cuỷa tẽn nhaứ gần gioỏng nhaỏt tỡm thaỏy trong danh saựch nhaứ.
3.4.2 Laỏy thõng tin cuỷa moọt nhaứ
Khi ngửụứi caọp nhaọt tửứ ủieồn nhaỏn chuoọt vaứo moọt nhaứ trong danh saựch nhaứ, chửụng trỡnh seừ gửỷi moọt thõng ủieọp laỏy thõng tin nhaứ ủeỏn maựy server, keứm theo vũ trớ cuỷa nhaứ naứy trong danh saựch nhaứ. Maựy server seừ tieỏn haứnh vieọc laỏy thõng tin nhaứ (Táo ra moọt thread tẽn THomeGetDataThread) vaứ gửỷi keỏt quaỷ về cho client. Khi ủaừ laỏy ủửụùc dửừ lieọu trẽn server, chửụng trỡnh client seừ hieồn thũ thõng tin nhaứ maứ bán vửứa click chuoọt lẽn maứn hỡnh.
3.4.3 Caọp nhaọt thõng tin moọt nhaứ
Khi ngửụứi caọp nhaọt tửứ ủieồn nhaỏn nuựt Caọp Nhaọt Thõng Tin Nhaứ, moọt khung trao ủoồi tửụng tửù nhử hỡnh 3.3.5. hieọn ra, nhửừng thõng tin cuừ ủaừ ủửụùc ủiền saỹn rồi, bán coự theồ sửỷa moọt vaứi choĩ sai soựt sau ủoự nhaỏn nuựt OK. Ngay luực ủoự chửụng trỡnh seừ gửỷi moọt thõng ủieọp caọp nhaọt thõng tin nhaứ ủeỏn chửụng trỡnh trẽn maựy server, keứm theo vũ trớ vaứ thõng tin mụựi cuỷa nhaứ vửứa mụựi sửỷa ủoồi naứy. Maựy server seừ tieỏn haứnh vieọc caọp nhaọt thõng tin nhaứ (Táo ra moọt thread tẽn TModifyDataThread) cho client.
3.4.4 Thẽm thõng tin moọt nhaứ mụựi
Nhaỏn vaứo nuựt thẽm nhaứ mụựi, moọt khung trao ủoồi nhử hỡnh 3.3. seừ hieọn ra ủeồ bán nhaọp thõng tin về nhaứ mụựi vaứo. Sau khi ủaừ ủiền ủuỷ thõng tin về nhaứ xong, nuựt OK seừ saựng lẽn ủeồ cho pheựp bán hoaứn thaứnh cõng vieọc thẽm nhaứ mụựi.
Khi nuựt OK ủửụùc nhaỏn, chửụng trỡnh seừ gửỷi moọt thõng ủieọp yẽu cầu thẽm nhaứ mụựi cho server, keứm theo thõng tin cho nhaứ bán vửứa nhaọp vaứo. Chửụng trỡnh cháy trẽn maựy server khi nhaọn ủửụùc thõng ủieọp naứy seừ sinh ra moọt thread tẽn TInsertDataThread ủeồ thửùc hieọn vieọc thẽm nhaứ mụựi. Neỏu vieọc thẽm nhaứ thaứnh cõng, moọt thõng ủieọp yẽu cầu caọp nhaọt danh saựch nhaứ seừ ủửụùc gửỷi ủeỏn cho toaứn boọ client.
3.4.5 Xoựa thõng tin moọt nhaứ
Chón moọt nhaứ trong danh saựch nhaứ cần xoựa rồi nhaỏn nuựt xoựa nhaứ, moọt khung trao ủoồi Confirm hieọn ra nhử sau:
Bán nhaỏn nuựt Nhaọn ủeồ quyeỏt ủũnh xoựa, khi aỏy chửụng trỡnh seừ gửỷi moọt thõng ủieọp yẽu cầu xoựa nhaứ ủeỏn chửụng trỡnh server keứm theo vũ trớ trong danh saựch nhaứ. Chửụng trỡnh server khi nhaọn ủửụùc thõng baựo naứy seừ sinh ra moọt thread tẽn TDeteleThread ủeồ thửùc hieọn vieọc xoựa nhaứ.
Neỏu cõng vieọc xoựa nhaứ thửùc hieọn thaứnh cõng, chửụng trỡnh server seừ gửỷi moọt thõng ủieọp yẽu cầu caọp nhaọt danh saựch nhaứ ủeỏn toaứn boọ caực client.
3.5 Caực chửực naờng cho moọt khaựch haứng
Dửụựi ủãy laứ khung trao ủoồi chớnh daứnh cho ngửụứi khaựch haứng:
3.5.1 Laỏy thõng tin về moọt nhaứ
Khi ngửụứi khaựch haứng nhaỏn chuoọt vaứo moọt nhaứ trong danh saựch nhaứ, chửụng trỡnh seừ gửỷi moọt thõng ủieọp laỏy thõng tin nhaứ ủeỏn maựy server, keứm theo vũ trớ cuỷa nhaứ naứy trong danh saựch nhaứ. Maựy server seừ tieỏn haứnh vieọc laỏy thõng tin nhaứ (Táo ra moọt thread tẽn
THomeGetDataThread) vaứ gửỷi keỏt quaỷ về cho client.
3.5.3 Tỡm kieỏm theo ủiều kieọn
Chửụng trỡnh coứn coự khaỷ naờng cho pheựp khaựch haứng chổ lieọt keọ danh saựch caực nhaứ thoỷa moọt soỏ ủiều kieọn naứo ủoự. Chaỳng hán chổ lieọt kẽ caực nhaứ coự dieọn tớch lụựn nhaỏt vaứ nhoỷ nhaỏt laứ bao nhiẽu; lieọt kẽ danh saựch caực nhaứ chổ ụỷ ngoái thaứnh; lieọt kẽ danh saựch caực nhaứ chổ ụỷ noọi thaứnh; lieọt kẽ danh saựch caực nhaứ coự giaự tiền nhoỷ nhaỏt vaứ lụựn nhaỏt laứ bao nhiẽu; lieọt kẽ danh saựch caực nhaứ cho thuẽ; lieọt kẽ danh saựch caực nhaứ baựn. Ngửụứi khaựch haứng cuừng coự theồ keỏt hụùp caực lửùa chón lái ủeồ tỡm cho chớnh xaực. Dú nhiẽn khi keỏt hụùp nhiều ủiều kieọn lái, soỏ nhaứ lieọt kẽ ra seừ ớt ủi.
Giaỷi thuaọt trong chửụng trỡnh:
Khi khaựch haứng nhaỏn nuựt Tỡm kieỏm theo ủiều kieọn, moọt khung trao ủoồi Tỡm kieỏm theo ủiều kieọn hieọn ra nhử dửụựi ủãy:
Hỡnh 3.53
Sau khi ủaừ nhaọp caực thõng tin cần thieỏt cho vieọc tỡm kieỏm, (vớ dú neỏu muoỏn chổ lieọt kẽ caực nhaứ cho thuẽ, haừy chón õ kieồm nhaứ cho thuẽ,…) nhaỏn nuựt tỡm kieỏm. Ngay luực ủoự
procedure TFindThread.DoThread; var
x : xxType; begin
FFilterCount := ChatForm.HomeData.HomeGetCount; // FfilterCount laứ soỏ nhaứ toỏi ủa ủửụùc tỡm thaỏy.
Getmem(FFilter, FFilterCount * sizeof(longint));
// Caỏp phaựt nhụự cho Ffilter laứ con troỷ chổ tụựi maỷng kieồu longint
ChatForm.HomeData.HomeFind(FFind.ThueBan, FFind.NgoaiNoiThanh, FFind.TriGiaMin, FFind.TriGiaMax, FFind.DienTichMin,
FFind.DienTichMax, FFilter, FFilterCount);
// Gói haứm tỡm kieỏm, keỏt quaỷ traỷ về laứ Ffilter, con troỷ maỷng chửựa danh saựch index caực nhaứ tỡm thaỏy thoỷa ủiều kieọn ủửa vaứo. FfilterCount laứ soỏ nhaứ thửùc sửù ủaừ tỡm thaỏy
FillChar(x, sizeof(x), 0); x.index := FFilterCount;
StrCopy(x.mess, idFindResult);
move(FFilter^, x.Home, FFilterCount * sizeof(longint)); // ẹửa giaự trũ cuỷa Ffilter vaứ FilterCount vaứo bieỏn x.
ChatForm.ServerSocket.Socket.Connections[FClient].SendBuf(x, sz);
// Gửỷi moọt thõng ủieọp keứm theo keỏt quaỷ tỡm kieỏm naốm trong bieỏn x cho Fclient ủoứi hoỷi tỡm kieỏm.
Freemem(FFilter);
// Giaỷi phoựng nhụự cho FFilter end;
TFindThread gói haứm HomeFind ủửụùc mõ taỷ sau ủãy:
function HomeFind (ThueBan, ViTri : Integer; GiaMin, GiaMax, SMin, SMax : real; var ListSelect : PArrInt; var FilterCount : longint) : boolean;
ẹửa vaứo
ThueBan = -1 : Boỷ qua lửùa chón naứy ThueBan = 0 : Chón nhaứ cho thuẽ ThueBan = 1 : Chón nhaứ baựn Vũtrớ = -1 : Boỷ qua lửùa chón naứy Vũtrớ = 0 : Chón nhaứ ụỷ ngoái thaứnh Vũtrớ = 1 : Chón nhaứ ụỷ noọi thaứnh GiaựMin < 0 : Boỷ qua lửùa chón naứy.
GiaựMin >= 0 : GiaMin ủửụùc tớnh theo tiền Vieọt Nam. Neỏu ThueBan = 0, GiaMin laứ giaự tiền thuẽ haứng thaựng nhoỷ nhaỏt. Ngửụùc lái, neỏu ThueBan = 1, GiaMin laứ giaự trũ nhoỷ nhaỏt cuỷa caờn nhaứ.
GiaựMax < 0 : Boỷ qua lửùa chón naứy
GiaựMax >= 0 : GiaMax ủửụùc tớnh theo tiền Vieọt Nam. Neỏu ThueBan = 0, GiaMax laứ giaự tiền thuẽ haứng thaựng lụựn nhaỏt. Ngửụùc lái, neỏu ThueBan = 1, GiaMax laứ giaự trũ lụựn nhaỏt cuỷa caờn nhaứ.
Smin < 0 : Boỷ qua lửùa chón naứy.
Smin >= 0 : Dieọn tớch toỏi thieồu cuỷa caờn nhaứ ủửụùc tớnh theo m vuõng. Smax < 0 : Boỷ qua lửùa chón naứy.
Smax >= 0 : Dieọn tớch toỏi ủa cuỷa caờn nhaứ ủửụùc tớnh theo m vuõng. FilterCount soỏ nhaứ trong danh saựch nhaứ.
Keỏt quaỷ :
ListSelect : Con troỷ chổ tụựi danh saựch chửựa index cuỷa caực nhaứ tỡm thaỏy. FilterCount : Soỏ lửụùng nhaứ thoỷa maừn ủiều kieọn ủửa vaứo.
function THomeData.HomeFind(ThueBan, ViTri : Integer; GiaMin, GiaMax, SMin, SMax : real; var ListSelect : PArrInt; var FilterCount : longint) : boolean;
var Index : longint; Home : THomeInfo; Count : longint; begin Result := true; Count := FilterCount;
// Count laứ toồng soỏ nhaứ coự theồ cho thuẽ hoaởc baựn
FilterCount := 0;
// Khụỷi táo soỏ nhaứ thoỷa ủiều kieọn ủửa vaứo laứ 0
for Index := 0 to Count - 1 do begin
Home := HomeGet(Index); case ThueBan of
1 : if not Home.Nhaban then Continue; // Neỏu khõng phaỷi nhaứ baựn thỡ xeựt nhaứ keỏ tieỏp
0 : if not Home.NhaChoThue then Continue; // Neỏu khõng phaỷi nhaứ cho thuẽ thỡ xeựt nhaứ keỏ tieỏp
end;
if ViTri >= 0 then // Neỏu coự xeựt ủiều kieọn nhaứ ụỷ vũ trớ noọi hay ngoái thaứnh if Home.NhaNgoaiThanh <> (ViTri = 0) then Continue;
// Neỏu khõng phuứ hụùp vũ trớ nhaứ thỡ xeựt ủeỏn nhaứ keỏ tieỏp
if GiaMin >= 0 then // Neỏu coự ủiều kieọn tỡm nhaứ vụựi giaự baựn hay thuẽ nhaứ beự nhaỏt
if ThueBan = 0 then // Neỏu tỡm nhaứ cho thuẽ
if Home.GiaMoiThang < GiaMin then Continue // Neỏu Giamoithang < GiaựMin thỡ xeựt nhaứ keỏ tieỏp
if GiaMax >= 0 then // Neỏu coự ủiều kieọn tỡm nhaứ vụựi giaự baựn hay thuẽ nhaứ lụựn nhaỏt
if ThueBan = 0 then // Neỏu tỡm nhaứ cho thuẽ
if Home.GiaMoiThang > GiaMax then Continue // Neỏu Giamoithang > GiaựMax thỡ xeựt nhaứ keỏ tieỏp
else
else // Neỏu tỡm nhaứ baựn
if (ThueBan = 1) and (Home.TriGia > GiaMax) then Continue; // Neỏu TriGia < GiaựMin thỡ xeựt nhaứ keỏ tieỏp
if SMin >= 0 then // Neỏu coự ủiều kieọn tỡm nhaứ vụựi dieọn tớch nhaứ beự nhaỏt
if Home.DienTich < SMin then Continue;
// Neỏu Dieọn tớch nhaứ nhoỷ hụn Smin thỡ xeựt ủeỏn nhaứ keỏ tieỏp
if SMax >= 0 then // Neỏu coự ủiều kieọn tỡm nhaứ vụựi dieọn tớch nhaứ lụựn nhaỏt
if Home.DienTich > SMax then Continue;
// Neỏu Dieọn tớch nhaứ lụựn hụn SMax thỡ xeựt ủeỏn nhaứ keỏ tieỏp
// Taỏt caỷ ủiều kieọn ủửa vaứo ủều thoỷa thỡ lửu Index vaứo ListSelect rồi taờng soỏ nhaứ // tỡm ủửụùc lẽn 1
ListSelect[FilterCount] := Index; Inc(FilterCount);
if FilterCount >= MaxFilterCount then Break;
// Neỏu soỏ nhaứ thoỷa ủiều kieọn cho vaứo lụựn hụn MaxFilterCount thỡ khõng cần tỡm nửừa end;
end;
Khi bán nhaỏn chuoọt vaứo moọt nhaứ baỏt kyứ trong danh saựch nhaứ tỡm ra thỡ laọp tửực trong danh saựch caực nhaứ cho thuẽ hoaởc baựn cuỷa khung trao ủoồi chớnh cuỷa chửụng trỡnh cuừng nhaỷy tụựi nhaứ naứy. ẹeỏn luực naứy, bán coự theồ ủaờng kyự mua hay thuẽ caờn nhaứ maứ bán ủaừ tỡm.
Giaỷi thuaọt laọp trỡnh ủeồ nhaỷy tụựi moọt nhaứ trong danh saựch nhaứ tửứ khung trao ủoồi tỡm kieỏm:
Gửỷi moọt thõng ủieọp WM_CHANGEINDEX tửù ủũnh nghúa nhử sau:
SendMessage(ChatForm.Handle, WM_ChangeIndex, Filter[Index], 0); Trong khung trao ủoồi chớnh cuỷa chửụng trỡnh seừ ủoựn thõng ủieọp naứy: TChatForm = class(TShadowForm)
… .., public
procedure ChangeIndex(var msg : TMessage); message WM_ChangeIndex;
end;
procedure TChatForm.ChangeIndex(var msg : TMessage); var
Index : integer; begin
Index := msg.WParam; if index < 0 then exit;
VLB.ItemIndex := index; // Thay ủoồi index trong danh saựch nhaứ VLBClick(nil); // Hieồn thũ thõng tin nhaứ ra maứn hỡnh end;
3.5.4 ẹaờng kyự thuẽ nhaứứ
Khi khaựch haứng nhaỏn nuựt ủaờng kyự thuẽ nhaứ, chửụng trỡnh seừ kieồm tra xem caờn nhaứ ủoự coự phaỷi laứ ủeồ cho thuẽ khõng (baống caựch xem Home.NhaChoThue).
* Neỏu laứ nhaứ cho thuẽ, moọt khung trao ủoồi Thuẽ Nhaứ hieọn ra sau ủãy:
Bán haừy nhaọp tham soỏ Tửứ Ngaứy, ẹeỏn Ngaứy sau ủoự nhaỏn nuựt Nhaọn ủeồ quyeỏt ủũnh thuẽ nhaứ.
Thao taực trong chửụng trỡnh ủeồ cho thuẽ moọt caờn nhaứ laứm nhử sau:
Chửụng trỡnh client seừ gửỷi moọt thõng ủieọp ủeỏn server yẽu cầu thuẽ nhaứ keứm theo ngaứy thuẽ vaứ vũ trớ cuỷa nhaứ trong danh saựch nhaứ. Khi nhaọn ủửụùc thõng ủieọp thuẽ nhaứ naứy, chửụng trỡnh server seừ táo ra moọt thread tẽn TthueNhaThread:
procedure TThueNhaThread.Execute; begin EnterCriticalSection(CritSect); Synchronize(DoThread); LeaveCriticalSection(CritSect); end;
DoThread chuỷ yeỏu gói haứm HomeRent nhử sau:
if HomeData.HomeRent(index, NgayDau, NgayCuoi) then ServerUpdateVLB
function THomeData.HomeRent(index : longint; NgayDau, NgayCuoi : TDateTime) : boolean;
(* ẹửa vaứo :
index : Vũ trớ nhaứ cần thuẽ trong danh saựch nhaứ NgayDau : Ngaứy baột ủầu thuẽ nhaứ
NgayCuoi: Ngaứy cuoỏi cuứng thuẽ nhaứ Ra :
Result = True neỏu thaứnh cõng Result = False neỏu thaỏt bái *) var dataindex, count : longint; buf : pchar; ftidx : TIndexfile; fHome : THomeInfo; begin result := false;
if index < 0 then exit;
seek(indexfile, index); read(indexfile, dataindex);
// dataindex laứ vũ trớ cuỷa thõng tin nhaứ trong datafile seek(datafile, dataindex); read(datafile, fhome); fhome.NgayDauThue := NgayDau; fHome.NgayCuoiThue := NgayCuoi; seek(datafile, dataindex); write(datafile, fhome);
// Caọp nhaọt ngaứy thuẽ nhaứ vaứo datafile seek(rentfile, filesize(rentfile));
// Caực leọnh sau ủãy ủeồ xoựa 4 byte tái vũ trớ index trong indexfile. Sau khi thửùc hieọn, indexfile giaỷm 4 byte
assignfile(ftidx, pathname + '1z2y3x4w.qgb'); rewrite(ftidx); count := index; if count > 0 then begin getmem(buf, count*idxtypeSize); seek(IndexFile, 0);
blockread(IndexFile, buf^, count); blockwrite(ftIdx, buf^, count); freemem(buf, count*idxtypeSize); end;
count := filesize(IndexFile)- count - 1; if count > 0 then
begin
getmem(buf, count*idxtypeSize); seek(IndexFile, index + 1);
blockread(IndexFile, buf^, count); blockwrite(ftidx, buf^, count); freemem(buf, count*idxtypeSize); end; result := IOResult = 0; if result then begin CloseFile(ftIdx); CloseFile(IndexFile); Erase(IndexFile); Rename(ftIdx, indexfilename); AssignFile(IndexFile, indexfilename); Reset(IndexFile); end; end;
3.5.5 ẹaờng kyự mua nhaứ
Khi khaựch haứng nhaỏn nuựt ủaờng kyự mua nhaứ, chửụng trỡnh seừ kieồm tra xem caờn nhaứ ủoự coự phaỷi laứ ủeồ baựn khõng (baống caựch xem Home.NhaBan).
* Neỏu khõng phaỷi nhaứ baựn moọt khung trao ủoồi nhaộc nhụỷ hieọn ra nhử dửụựi ủãy:
* Neỏu laứ nhaứ baựn, moọt khung trao ủoồi sau ủãy hieọn ra:
Nhaỏn nuựt Nhaọn ủeồ quyeỏt ủũnh mua caờn nhaứ ủaừ chón.
Thao taực trong chửụng trỡnh ủeồ cho mua moọt caờn nhaứ laứm nhử sau:
Chửụng trỡnh client seừ gửỷi moọt thõng ủieọp ủeỏn server yẽu cầu mua nhaứ keứm theo vũ trớ cuỷa nhaứ trong danh saựch nhaứ. Khi nhaọn ủửụùc thõng ủieọp thuẽ nhaứ naứy, chửụng trỡnh server seừ táo ra moọt thread tẽn TMuaNhaThread:
LeaveCriticalSection(CritSect); end;
DoThread trong mua nhaứ chuỷ yeỏu gói leọnh sau: if HomeData.HomeSell(index) then
ServerUpdateVLB
Ý nghúa cuỷa haứm HomSell nhử sau:
function THomeData.HomeSell(index : longint) : boolean; var
count, dataIndex : longint; buf : pchar;
ftidx : TIndexfile; begin
result := false;
if index < 0 then exit; seek(indexfile, index); read(indexfile, dataindex);
// dataindex laứ vũ trớ cuỷa thõng tin nhaứ trong datafile
seek(sellfile, filesize(sellfile)); write(sellfile, dataindex);
// Caực leọnh sau ủãy ủeồ xoựa 4 byte tái vũ trớ index trong indexfile. Sau khi thửùc hieọn, indexfile
giaỷm 4 byte
assignfile(ftidx, pathname + '1z2y3x4w.qgb'); rewrite(ftidx); count := index; if count > 0 then begin getmem(buf, count*idxtypeSize); seek(IndexFile, 0);
blockread(IndexFile, buf^, count); blockwrite(ftIdx, buf^, count); freemem(buf, count*idxtypeSize); end;
count := filesize(IndexFile)- count - 1; if count > 0 then
begin
getmem(buf, count*idxtypeSize); seek(IndexFile, index + 1);
blockread(IndexFile, buf^, count); blockwrite(ftidx, buf^, count); freemem(buf, count*idxtypeSize); end; result := IOResult = 0; if result then begin CloseFile(ftIdx); CloseFile(IndexFile); Erase(IndexFile); Rename(ftIdx, indexfilename); AssignFile(IndexFile, indexfilename); Reset(IndexFile); end; end;
3.6 Maừ chửụng trỡnh kinh doanh nhaứ ủaỏt trẽn máng client/server 3.6.1 Nha.dpr Nha.dpr laứ chửụng trỡnh chớnh. (* nha.dpr Written by Le Tuan *) program nha; uses Graphics, Controls, Forms,
nhaf in 'nhaf.pas' {ChatForm},
conectdlg in 'conectdlg.pas' {ConnectDlg}, myThread in 'myThread.pas',
homeInfo in 'homeInfo.pas' {HomeInfoForm}, hometools in 'hometools.pas',
findf in 'Findf.pas' {FindForm}, mytdrtf in 'mytdrtf.pas',
repthuef in 'repthuef.pas' {RepThueForm}, inputthuef in 'inputthuef.pas' {InputThue}, informf in 'informf.pas' {InfoForm};
{$R *.RES} begin
ConnectDlg := TConnectDlg.Create(Application); with ConnectDlg do
begin
if ShowModal = mrOK then begin ChatForm := TChatForm.Create(application); ChatForm.ShowModal; ChatForm.Release; end; Release;
3.6.2 Nhaf.pas
Nhaf.pas chửựa khung trao ủoồi chớnh cuỷa chửụng trỡnh. Khung trao ủoồi naứy duứng chung cho caỷ 3 ủoỏi tửụùng ngửụứi sửỷ dúng, tuy nhiẽn cuừng coự moọt soỏ khaực bieọt nhoỷ.
(* nhaf.pas Written by Le Tuan *) unit nhaf; interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, Buttons, ScktComp, ExtCtrls, ComCtrls, VLB, homeInfo, HomeTools, MyThread, Findf, Tranbtn, ShadowForm, mytdRTF, myDialog, inputthuef, QFButton, InformF; const WM_ChangeIndex = WM_USER + 5000; type TChatForm = class(TShadowForm) Image1: TImage; VLB: TVLB; TextSearch: TEdit; Label1: TLabel; Bevel1: TBevel; RichEdit1: TRichEdit; Bevel2: TBevel; Bevel3: TBevel; AdminLTBtnAdd: TLTBtn; AdminLTBtnModify: TLTBtn; AdminLTBtnDel: TLTBtn; DicLTBtnModify: TLTBtn; DicLTBtnDel: TLTBtn; DicLTBtnAdd: TLTBtn; Bevel4: TBevel; ClientSocket: TClientSocket;
AdminLTBtnRepBan: TLTBtn; Image3: TImage;
QFButton1: TQFButton; Image4: TImage;
LabelName: TLabel;
procedure FormPaint(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure VLBGetItem(Sender: TObject; Index: Integer; var ItemString: String);
procedure VLBClick(Sender: TObject);
procedure ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure CusLTBtnFindClick(Sender: TObject); procedure CusLTBtnThueClick(Sender: TObject); procedure CusLTBtnBanClick(Sender: TObject); procedure DicLTBtnModifyClick(Sender: TObject); procedure DicLTBtnDelClick(Sender: TObject); procedure DicLTBtnAddClick(Sender: TObject); procedure AdminLTBtnAddClick(Sender: TObject); procedure AdminLTBtnDelClick(Sender: TObject); procedure AdminLTBtnModifyClick(Sender: TObject); procedure TextSearchChange(Sender: TObject); procedure TextSearchKeyPress(Sender: TObject; var Key: Char);
procedure AdminLTBtnRepThueClick(Sender: TObject); procedure AdminLTBtnRepBanClick(Sender: TObject); procedure QFButton1Click(Sender: TObject);
procedure FormActivate(Sender: TObject); private
{ Private declarations }
procedure wmNcHitTest(var Msg : TwmNcHitTest); message wm_NcHitTest;
function TestTLTBtn(p : TPoint) : boolean; procedure DrawForm(Level : integer);
private function FindClient(ClientSocket : TCustomWinSocket) : integer; procedure ShowData; procedure ConnectAdmin; procedure ConnectModifier; procedure ConnectCustomer;
fIndex : longint;
procedure InsertData(Home : THomeInfo);
procedure ModifyData(index : longint; Home : THomeInfo); procedure MuaNha(Index : Longint);
procedure ThueNha(Index : Longint; NgayDau, NgayCuoi : TDateTime); procedure DeleteNha(Index : Longint);
procedure SendMessageToServer(Socket : TCustomWinSocket; mess : pchar; index : longint; home : THomeInfo); procedure SendMessageToClient(Socket : TCustomWinSocket; mess : pchar; index : longint; home : THomeInfo); procedure ChangeIndex(var msg : TMessage);
message WM_ChangeIndex; public
{ Public declarations }
procedure DrawShadowBox(fCanvas : TCanvas; R: TRect); procedure DrawShadow(fCanvas : TCanvas; R: TRect); procedure PaintBack(fCanvas : TCanvas; B : TBitmap); end;
type
TMyHintWindow = class(THintWindow)
constructor Create(AOwner : TComponent); override; end;
type
xxType = packed record
mess : array[0..19] of char; index : longint;
Home : THomeInfo; end;
const
sz = sizeof(xxType);
idGetData : pchar = '$GetData$'; idSetData : pchar = '$SetData$'; idGetItem : pchar = '$GetItem$'; idSetItem : pchar = '$SetItem$';
idGetVLBNumItems : pchar = '$GetVLBNumItems$';