|
Create ComboBox |
Top Previous Next |
|
Now we show how to create a pick list for a merge field:
We use a panel with a speed button to display the drop down button. This panel is moved to the correct location in the MouseMove event. A timer is used to hide this panel if it is not required anymore. The picklist itself is a listbox, also placed on the form. It would be better to display this list on a seperate form located over the mainform but we wanted to make this example as simple as possible.
The name of the current field (for which the picklist is displayed) is stored in the string variable CurrField.
The MouseMove event handler for the editor. It sets 'CurrField'
procedure TWPEdTest.DataEditMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var fieldobj, fieldobjend : TWPTextObj; px, py : Integer; begin fieldobjend := nil; fieldobj := DataEdit.CodeInsideOf(x, y, wpobjMergeField); if (fieldobj <> nil) and ((CompareText(fieldobj.Name,'name')=0) or (CompareText(fieldobj.Name,'company')=0)) then begin fieldobjend := fieldobj.EndTag; if fieldobjend<>nil then begin DataEdit.GetParXYBaselineScreen(fieldobjend.ParentPar, fieldobjend.ParentPosInPar, px, py ) ; PickPanel.Left := px - PickPanel.Width div 2; PickPanel.Top := DataEdit.Top + py - MulDiv(PickPanel.Height,4,5); CurrField := fieldobj.Name; end; end; if fieldobjend=nil then HidePickPanelTimer.Enabled := TRUE // we hide it 500ms delayed else begin PickPanel.Visible := true; HidePickPanelTimer.Enabled := FALSE; end; end;
The timer HidePickPanelTimer disables the button
procedure TWPEdTest.HidePickPanelTimerTimer(Sender: TObject); begin HidePickPanelTimer.Enabled := FALSE; PickPanel.Visible := false; end;
The OnExit event of the listbox (it is called when the listbox looses the focus)is used to hide the listbox when the user clicks on the editor:
procedure TWPEdTest.PicklistExit(Sender: TObject); begin Picklist.Visible := FALSE; end;
A click on the speedbutton display the listbox:
procedure TWPEdTest.PickDropClick(Sender: TObject); begin Picklist.Left := PickPanel.Left + PickPanel.Width - Picklist.Width;
if CompareText(CurrField,'name')=0 then Picklist.Items.Assign(PicName.Lines) else if CompareText(CurrField,'company')=0 then Picklist.Items.Assign(PicCompany.Lines) else Picklist.Items.Clear;
if PickPanel.Top>EditTab.Height-100 then begin Picklist.Height := PickPanel.Top -20; if Picklist.Height>150 then Picklist.Height := 150; Picklist.Top := PickPanel.Top - Picklist.Height; end else begin Picklist.Top := PickPanel.Top + PickPanel.Height; Picklist.Height := EditTab.Height - Picklist.Top-20; if Picklist.Height>150 then Picklist.Height := 150; end; Picklist.Visible := TRUE; Picklist.SetFocus; end;
Last but not least - a click in the listbox should update the current field. We use the function [b]CodeListTags[/b] to find all the field with a given name and simply update the property EmbeddedText.
procedure TWPEdTest.PicklistClick(Sender: TObject); var objlst : TWPTextObjList; i : Integer; s : string; begin if Picklist.ItemIndex>=0 then s := Picklist.Items[Picklist.ItemIndex] else exit; objlst := DataEdit.CodeListTags(wpobjMergeField,CurrField, true); try for i:=0 to objlst.Count-1 do objlst[i].EmbeddedText := s; finally objlst.Free; DataEdit.ReformatAll(false, true); end; DataEdit.Setfocus; // also hides Picklist! end;
You can download the complete example here http://www.wpcubed.com/ftp/ex/EditFieldDemo.zip
|