Tỡm kieỏm theo ủiều kieọn

Một phần của tài liệu THREAD trong DELPHI.doc (Trang 41 - 46)

3. 2C ÁC VẤN ẹỀ CHÍNH CẦN GIẢI QUYẾT

3.5.3Tỡ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;

Một phần của tài liệu THREAD trong DELPHI.doc (Trang 41 - 46)