diff --git a/components/tvplanit/source/vpcontactbuttons.pas b/components/tvplanit/source/vpcontactbuttons.pas index d048ae7d9..39437de34 100644 --- a/components/tvplanit/source/vpcontactbuttons.pas +++ b/components/tvplanit/source/vpcontactbuttons.pas @@ -69,6 +69,8 @@ type SearchString: String) of object; TVpContactButtonBar = class(TVPCustomControl) + private + FOnContactNotFound: TNotifyEvent; protected {private} FBarOrientation: TVpButtonBarOrientation; FBorderWidth: Integer; @@ -138,8 +140,10 @@ type read FShowNumberButton write SetShowNumberButton default True; property OnButtonClick: TVpButtonBarClickEvent read FOnButtonClick write FOnButtonClick; + property OnContactNotFound: TNotifyEvent + read FOnContactNotFound write FOnContactNotFound; property RadioStyle: Boolean - read FRadioStyle write FRadioStyle; + read FRadioStyle write FRadioStyle default true; property Align; property Anchors; @@ -210,6 +214,7 @@ begin FButtonWidth := 34; FCaptionStyle := csLowercase; FDrawingStyle := ds3d; + FRadioStyle := true; FShowNumberButton := True; end; {=====} @@ -379,7 +384,9 @@ begin FContactGrid.SetFocus; for I := 1 to Length(bbSearchString) do if FContactGrid.SelectContactByName(bbSearchString[I]) then - Break; + Exit; + if Assigned(FOnContactNotFound) then + FOnContactNotFound(self); end; end; {=====} @@ -397,14 +404,17 @@ var I: Integer; P: TPoint; R: TRect; + found: Boolean; begin inherited MouseDown(Button, Shift, X, Y); if Button = mbLeft then begin + found := false; P := Point(X, Y); for I := 0 to pred(FButtonCount) do begin R := FButtonsArray[I].Rect; if PointInRect(P, R) then begin + found := True; { if RadioStyle then un-press the last clicked button. } if RadioStyle then DrawButton(FButtonPressed, False); @@ -415,10 +425,12 @@ begin end; end; - if Assigned(FOnButtonClick) then - FOnButtonClick(Self, FButtonPressed, bbSearchString) - else - SelectContact; + if found then begin + if Assigned(FOnButtonClick) then + FOnButtonClick(Self, FButtonPressed, bbSearchString) + else + SelectContact; + end; end; end; {=====} diff --git a/components/tvplanit/source/vpdata.pas b/components/tvplanit/source/vpdata.pas index 16ad56f19..937cd1d59 100644 --- a/components/tvplanit/source/vpdata.pas +++ b/components/tvplanit/source/vpdata.pas @@ -473,7 +473,7 @@ type function Count: Integer; procedure DeleteContact(Contact: TVpContact); function First: TVpContact; - function FindContactByName(const Name: string; + function FindContactByName(const AName: string; CaseInsensitive: Boolean = True): TVpContact; function FindContactIndexByName(const Name: string; CaseInsensitive: Boolean = True): Integer; @@ -2567,44 +2567,36 @@ begin end; end; -{ new function introduced to support the new buttonbar component } -function TVpContacts.FindContactByName(const Name: string; - CaseInsensitive: Boolean): TVpContact; +{ new function introduced to support the new buttonbar component. } +function TVpContacts.FindContactByName(const AName: string; + CaseInsensitive: Boolean): TVpContact; var I: Integer; SearchStr: String; - SearchLength: Integer; + SearchLength: Integer; + SearchName: String; begin Result := nil; // To enhance performance, uppercase the input name and get its length only once if CaseInsensitive then - SearchStr := uppercase(Name) + SearchStr := UpperCase(AName) else - SearchStr := Name; + SearchStr := AName; SearchLength := Length(SearchStr); - + // Iterate the contacts looking for a match - for I := 0 to FContactsList.Count - 1 do begin - if CaseInsensitive then begin - // not case sensitive - if Copy(uppercase(TVpContact(FContactsList[I]).LastName), 1, SearchLength) = SearchStr - then begin - // We found a match, so return it and bail out - Result := TVpContact(FContactsList[I]); - Exit; - end; - end else begin - // case sensitive - if Copy(TVpContact(FContactsList[I]).LastName, 1, SearchLength) = SearchStr - then begin - // We found a match, so return it and bail out - Result := TVpContact(FContactsList[I]); - Exit; - end; - end; - end; -end; + for I := 0 to FContactsList.Count - 1 do begin + SearchName := Copy(TVpContact(FContactsList[I]).LastName, 1, SearchLength); + if CaseInsensitive then + SearchName := Uppercase(SearchName); + // We found a match, so return it and bail out + if SearchName = SearchStr then begin + Result := TVpContact(FContactsList[I]); + exit; + end; + end; +end; { new function introduced to support the new buttonbar component } function TVpContacts.FindContactIndexByName(const Name: string;