Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  23:50[Войти] | [Зарегистрироваться]
Ответ на вопрос № 50045

11-03-2007 12:45
Здрасте, здрасте, господа!
На форме имеется несколько пар edit + кнопка. При нажатии на любую кнопку открывается окно с ListBox-ом. В нём список. При клике, выделенный элемент должен копироваться в поле edit той пары, кнопка которой была нажата. Скопировать в любой edit по его названию - без проблем, но название постоянно меняется. Пробовал использовать свойство Tag, но что-то туплю. Помогите, плиз.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

14-03-2007 03:06
Перечитал еще раз вопрос:
>>>edit + кнопка. При нажатии на любую кнопку открывается окно с ListBox-ом. В нём список. При клике, выделенный элемент должен копироваться в поле edit той пары, кнопка которой была нажата.
Очень точно описана функциональность TComboBox. Может его и надо использовать вместо edit + кнопка?

13-03-2007 18:48
>>> спасибо. понял. работает.

Это хорошо. Но я хотел бы вернуться к предложенному мной ранее варианту. Возможно, я его высказал чересчур обще и лаконично, и поэтому он не произвел на вас впечатления. Поэтому остановлюсь на нем поподробнее. Я так понимаю, что сейчас присвоение выбранного значения соответствующему 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.

SomeEditFrm.pas

unit SomeEditFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TSomeEditForm = class(TForm)
    edtClient: TEdit;
    btnChooseClient: TButton;
    edtTovar: TEdit;
    btnCooseTovar: TButton;
    lblClient: TLabel;
    lblTovar: TLabel;
    edtTara: TEdit;
    btnChooseTara: TButton;
    lblTara: TLabel;
    procedure btnChooseClientClick(Sender: TObject);
    procedure btnCooseTovarClick(Sender: TObject);
    procedure btnChooseTaraClick(Sender: TObject);
  end;

var
  SomeEditForm: TSomeEditForm;

implementation

uses ListFrm;

{$R *.dfm}

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;

end.

ListFrm.pas

unit ListFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB;

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

ListFrm.dfm

object ListForm: TListForm
  Left = 334
  Top = 177
  Width = 417
  Height = 338
  Caption = #1057#1087#1088#1072#1074#1086#1095#1085#1080#1082
  Color = clBtnFace
  Font.Charset = RUSSIAN_CHARSET
  Font.Color = clWindowText
  Font.Height = -13
  Font.Name = 'Arial'
  Font.Style = []
  OldCreateOrder = False
  Position = poMainFormCenter
  OnClose = FormClose
  DesignSize = (
    409
    311)
  PixelsPerInch = 96
  TextHeight = 16
  object lblTitle: TLabel
    Left = 5
    Top = 0
    Width = 301
    Height = 19
    Alignment = taCenter
    Anchors = [akLeft, akTop, akRight]
    AutoSize = False
    Caption = 'lblTitle'
    Font.Charset = RUSSIAN_CHARSET
    Font.Color = clWindowText
    Font.Height = -16
    Font.Name = 'Arial'
    Font.Style = [fsBold]
    ParentFont = False
  end
  object lbList: TListBox
    Left = 5
    Top = 20
    Width = 301
    Height = 281
    Anchors = [akLeft, akTop, akRight, akBottom]
    ItemHeight = 16
    TabOrder = 0
    OnDblClick = lbListDblClick
  end
  object btnOk: TButton
    Left = 320
    Top = 225
    Width = 75
    Height = 25
    Anchors = [akRight, akBottom]
    Caption = #1042#1099#1073#1086#1088
    Default = True
    ModalResult = 1
    TabOrder = 1
  end
  object btnCancel: TButton
    Left = 320
    Top = 270
    Width = 75
    Height = 25
    Anchors = [akRight, akBottom]
    Cancel = True
    Caption = #1054#1090#1084#1077#1085#1072
    ModalResult = 2
    TabOrder = 2
  end
end


13-03-2007 13:04 | Сообщение от автора вопроса
Вообще-то, форму нужно показывать после заполнения списка... Посмотрите, где у вас ShowModal...
спасибо. понял. работает.

12-03-2007 14:06 | Комментарий к предыдущим ответам
>>> любой кнопке открывается пустой ListBox, при последующих нажатиях всё работает с отставанием на один клик.объяснить не могу.

Вообще-то, форму нужно показывать после заполнения списка... Посмотрите, где у вас ShowModal...

12-03-2007 12:46 | Сообщение от автора вопроса
Если проверять номер, то не 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;

  para := 1;
end;

11-03-2007 16:14
Если проверять номер, то не if-ом, а case-ом.
Еще красивее создать массив TEdit, при большом числе компонент удобно иметь возможность обращаться по номеру.

11-03-2007 15:22
Хитрый ход - две строки кода и заработало.
    if para = 1 then
      Form_edit.Zakazchik_Edit.Text :=  ListBox1.Items.Strings[ListBox1.ItemIndex];


Есть еще более красивое решение:

var
  TargetEdit: TEdit;
...
  TargetEdit := Form_edit.Zakazchik_Edit;
...
TargetEdit.Text :=  ListBox1.Items.Strings[ListBox1.ItemIndex];



11-03-2007 14:09 | Сообщение от автора вопроса
Большое Вам!
Хитрый ход - две строки кода и заработало.

    if para = 1 then
      Form_edit.Zakazchik_Edit.Text :=  ListBox1.Items.Strings[ListBox1.ItemIndex];

11-03-2007 12:50
Можно решить задачу глобальной переменной, при нажатии кнопки присваиваешь переменной номер пары, а при выделении ListBoxa возвращаешь значение в пару, на которую указывает переменная.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Жил-был у бабушки серенький КТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования