Здрасте, здрасте, господа!
На форме имеется несколько пар edit + кнопка. При нажатии на любую кнопку открывается окно с ListBox-ом. В нём список. При клике, выделенный элемент должен копироваться в поле edit той пары, кнопка которой была нажата. Скопировать в любой edit по его названию - без проблем, но название постоянно меняется. Пробовал использовать свойство Tag, но что-то туплю. Помогите, плиз.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
14-03-2007 03:06
Перечитал еще раз вопрос:
>>>edit + кнопка. При нажатии на любую кнопку открывается окно с ListBox-ом. В нём список. При клике, выделенный элемент должен копироваться в поле edit той пары, кнопка которой была нажата.
Очень точно описана функциональность TComboBox. Может его и надо использовать вместо edit + кнопка?
Это хорошо. Но я хотел бы вернуться к предложенному мной ранее варианту. Возможно, я его высказал чересчур обще и лаконично, и поэтому он не произвел на вас впечатления. Поэтому остановлюсь на нем поподробнее. Я так понимаю, что сейчас присвоение выбранного значения соответствующему Edit происходит в форме с ListBox'ом (справочнике), при этом конкретный получатель (Edit) определяется, исходя из значения переменной para. Т.е. у вас стоит большой case, где перечислены все возможные значения para и соответствующие им Edit'ы. Посмотрите на него еще раз и ужаснитесь. Кроме того, что это просто некрасиво, это еще и не универсально. Вы привязываете свой справочник к совершенно конкретным формам и Edit'ам на них. Ваш справочник должен быть совершенно автономным и универсальным и давать возможность пользоваться им в любом месте без его дополнительной доработки.
Этим требованиям удовлетворяет предложенный мной вариант. А именно: в форму справочника передавать сразу адрес получателя. Тогда в этой форме вам не придется решать, куда писать выбранное значение, исходя из каких-либо условий, например, значения какой-либо глобальной переменной, т.к. получатель уже известен. Дабы убедить вас в красоте моего решения, я приведу вам в качестве примера полностью рабочее приложение, остается только скопировать нужный текст в нужные файлы. Кстати, обратите внимание, что в приведенном варианте получателем может быть не только TEdit, но и TField. Все остальное зависит от вашей фантазии.
P.S. В справочнике обратите внимание на свойства:
TButton - ModalResult, Default, Cancel
TLabel - AutoSize
Все - Anchors
Project1.dpr
program Project1;
uses
Forms,
SomeEditFrm in 'SomeEditFrm.pas' {SomeEditForm},
ListFrm in 'ListFrm.pas' {ListForm};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TSomeEditForm, SomeEditForm);
Application.Run;
end.
procedure TSomeEditForm.btnChooseClientClick(Sender: TObject);
begin
with TListForm.Create do
begin
{Заполнение списка}
lbList.Items.Add('ОАО "Рога и Копыта"');
lbList.Items.Add('Магазин "Игрушки"');
lbList.Items.Add('ЧП Иванов, Петров, Сидоров и Ко');
lbList.Items.Add('Ресторан "Золотая Рыбка"');
lbList.Items.Add('Магазин "3000 мелочей"');
{Остальное}
lblTitle.Caption := 'Клиенты';
ChooseTo(edtClient);
Free;
end;
end;
procedure TSomeEditForm.btnCooseTovarClick(Sender: TObject);
begin
with TListForm.Create do
begin
{Заполнение списка}
lbList.Items.Add('Коньяк "Наполеон" (г.Нижнеурюпинск)');
lbList.Items.Add('Медведь плюшевый');
lbList.Items.Add('Экскаватор шагающий');
lbList.Items.Add('Апельсины');
lbList.Items.Add('Детская железная дорога');
lbList.Items.Add('Товар с очень длинным названием, которое могло не поместиться в списке, но все равно помещается');
{Остальное}
Width := 750;
lblTitle.Caption := 'Товары';
ChooseTo(edtTovar);
Free;
end;
end;
procedure TSomeEditForm.btnChooseTaraClick(Sender: TObject);
begin
with TListForm.Create do
begin
{Заполнение списка}
lbList.Items.Add('Пакет');
lbList.Items.Add('Бочка');
lbList.Items.Add('Контейнер 20т');
lbList.Items.Add('Коробка');
lbList.Items.Add('Навалом');
{Остальное}
Width := 300;
lblTitle.Caption := 'Тара';
ChooseTo(edtTara);
Free;
end;
end;
type
TListForm = class(TForm)
lblTitle: TLabel;
lbList: TListBox;
btnOk: TButton;
btnCancel: TButton;
procedure lbListDblClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
public
constructor Create; reintroduce;
function ShowModal: Integer; override;
function ChooseTo(TargetEdit: TEdit): Boolean; overload;
function ChooseTo(TargetField: TField): Boolean; overload;
end;
//var
// ListForm: TListForm;
implementation
{$R *.dfm}
constructor TListForm.Create;
begin
inherited Create(Application);
end;
function TListForm.ShowModal: Integer;
begin
Constraints.MinWidth := Width;
Constraints.MinHeight := Height;
Result := inherited ShowModal;
end;
procedure TListForm.lbListDblClick(Sender: TObject);
begin
ModalResult := mrOk;
end;
procedure TListForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if (ModalResult = mrOk) and (lbList.ItemIndex < 0) then // Not selected or empty
Action := caNone;
end;
function TListForm.ChooseTo(TargetEdit: TEdit): Boolean;
begin
if ShowModal = mrOk then
TargetEdit.Text := lbList.Items[lbList.ItemIndex];
Result := (ModalResult = mrOk);
end;
function TListForm.ChooseTo(TargetField: TField): Boolean;
begin
if ShowModal = mrOk then
TargetField.AsString := lbList.Items[lbList.ItemIndex];
Result := (ModalResult = mrOk);
end;
end.
SomeEditFrm.dfm
object SomeEditForm: TSomeEditForm
Left = 253
Top = 133
Width = 696
Height = 480
Caption = 'SomeEditForm'
Color = clBtnFace
Font.Charset = RUSSIAN_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'Arial'
Font.Style = []
OldCreateOrder = False
Position = poDesktopCenter
PixelsPerInch = 96
TextHeight = 16
object lblClient: TLabel
Left = 20
Top = 39
Width = 41
Height = 16
Caption = #1050#1083#1080#1077#1085#1090
end
object lblTovar: TLabel
Left = 20
Top = 74
Width = 35
Height = 16
Caption = #1058#1086#1074#1072#1088
end
object lblTara: TLabel
Left = 20
Top = 109
Width = 28
Height = 16
Caption = #1058#1072#1088#1072
end
object edtClient: TEdit
Left = 70
Top = 35
Width = 250
Height = 24
TabOrder = 0
end
object btnChooseClient: TButton
Left = 335
Top = 35
Width = 61
Height = 25
Caption = #1050#1083#1080#1077#1085#1090#1099
TabOrder = 1
OnClick = btnChooseClientClick
end
object edtTovar: TEdit
Left = 70
Top = 70
Width = 250
Height = 24
TabOrder = 2
end
object btnCooseTovar: TButton
Left = 335
Top = 70
Width = 61
Height = 25
Caption = #1058#1086#1074#1072#1088#1099
TabOrder = 3
OnClick = btnCooseTovarClick
end
object edtTara: TEdit
Left = 70
Top = 105
Width = 250
Height = 24
TabOrder = 4
end
object btnChooseTara: TButton
Left = 335
Top = 105
Width = 61
Height = 25
Caption = #1058#1072#1088#1072
TabOrder = 5
OnClick = btnChooseTaraClick
end
end
Если проверять номер, то не if-ом, а case-ом.
Еще красивее создать массив TEdit, при большом числе компонент удобно иметь возможность обращаться по номеру.
if для проверки самого решения. потом все 10 пар загнал в case
но теперь другая проблема:
дело в том, что в ListBox грузятся данные из разных мест. при клике на ListBoxе загружается новый список, т.е. нажатие на любую кнопку -> грузится соответствующий список. Суть проблемы. при первом клике на любой кнопке открывается пустой ListBox, при последующих нажатиях всё работает с отставанием на один клик.объяснить не могу.
код при нажатии на кнопку:
procedure TForm_edit.Zakazchik_Click(Sender: TObject);
begin
Form_Resource.ShowModal;
Form_Resource.ListBox1.Items.Clear;
Base.DataModule2.Zakazchik.First;
while not Base.DataModule2.Zakazchik.Eof do
begin
Form_Resource.ListBox1.Items.Add
(Base.DataModule2.Zakazchik.FieldByName('Заказчик').AsString);
Base.DataModule2.Zakazchik.Next;
end;
Если проверять номер, то не if-ом, а case-ом.
Еще красивее создать массив TEdit, при большом числе компонент удобно иметь возможность обращаться по номеру.
Можно решить задачу глобальной переменной, при нажатии кнопки присваиваешь переменной номер пары, а при выделении ListBoxa возвращаешь значение в пару, на которую указывает переменная.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.