Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/49: Рейтинг темы: голосов - 49, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 29.09.2012
Сообщений: 37

Как сделать, чтобы при выборе определенной строки в ComboBox, текстовое содержимое отображалось на memo?

29.09.2012, 03:01. Показов 10811. Ответов 71
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане
Подскажите, как сделать, чтобы при выборе определенной строки в ComboBox, текстовое содержимое отображалось на memo, а некая переменная принимала значение присвоенное этой строке?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.09.2012, 03:01
Ответы с готовыми решениями:

как нарастить переменную при выборе определённой строки в Combobox
как нарастить переменную при выборе определённой строки в Combobox !! очень нужно помигите !! спасибо

C# Как сделать чтобы при выборе в combobox , менялись значения в других combobox?
Приветствую коллеги. Только встал на путь программирования и столкнулся с дилеммой. Есть форма, на ней 4 combobox. В каждом combobox по...

Как сделать чтобы при выборе в comboBox, выводилось значение в другом comboBox?
Здравствуйте! Есть таблица из 2 столбца (id, name). Как сделать чтобы при выборе из первого comboBox вывести значение другому comboBox?...

71
0 / 0 / 0
Регистрация: 29.09.2012
Сообщений: 37
29.09.2012, 05:50  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от angstrom Посмотреть сообщение
Правильно.

Можно завести класс:
Delphi
1
2
3
4
5
type
  TComboClass = class
    St : String;
    I : Integer;
  end;
и добавлять его каждому ComboBox-у:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.FormCreate(Sender: TObject);
var
  I : Integer;
  cl : TComboClass;
begin
  cl := TComboClass.Create;
  with cl do
  begin
    cl.St := 'Яблоко зелёное';
    cl.I  := 0.5;
    ComboBox1.Items.AddObject('Яблоко', cl);
  end;
end;
сделать в цикле для каждого пункта ComboBox-а

потом вывести в Memo:
Delphi
1
2
3
4
5
6
7
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  Memo1.Clear;
  Memo1.Lines.Add(ComboBox1.Items.Strings[ComboBox1.ItemIndex]);
  Memo1.Lines.Add(TComboClass(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).St);
  Memo1.Lines.Add(FloatToStr(TComboClass(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).I));
end;
и не забыть в OnDestroy удалить созданные классы.
я думаю путем объявления массивов будет менее громоздко и удобочитабельней, не так ли?
0
angstrom
29.09.2012, 05:51
Классами гибче.
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 17
29.09.2012, 08:28
Delphi
1
2
3
4
5
procedure Tbrowser.ComboBox1Select(Sender: TObject);
begin
Memo1.Clear;
  Memo1.Lines.Add(ComboBox1.Items.Strings[ComboBox1.ItemIndex]);
end;
вот так вроде))
0
0 / 0 / 0
Регистрация: 29.09.2012
Сообщений: 37
29.09.2012, 20:45  [ТС]
С первостепенной задачей справился отлично, спасибо ребята, но вот новая проблема: если у меня в одной форме 3 комбо и в них одинаковый перечень элементов, при этом нельзя, чтобы были выбраны одинаковые элементы в этих комбо, как это сделать? И второй вопрос по присвоению элементу значения: так как эти элементы отвечают за разные параметры в формуле, то как теперь поступить, ведь массив уже не прокатит?

Добавлено через 11 часов 48 минут
вопрос остается открытым, может через ItemIndex присваивать значения из массива переменным соответствующим строке выбранной в ComboBox
0
0 / 0 / 0
Регистрация: 29.09.2012
Сообщений: 37
29.09.2012, 21:40  [ТС]
объясню подробно:
линейки следующие
1 курю
2 не курю
3 бросил
4 бросаю
и они в 3 ComboBox 'ах, нельзя, чтобы в трех было хотя бы одно повторение, теперь понятно?

Добавлено через 37 минут
angstrom, а у вас есть идеи по этому вопросу?
0
angstrom
29.09.2012, 21:59
Есть, использовать классы с дополнительным полем типа Boolean. При выборе в одном из ComboBox-ов, ставить соответствующему полу True - занято, остальным проверять это свойство, если True не разрешать выбор. Можно конечно и через записи.
0 / 0 / 0
Регистрация: 29.09.2012
Сообщений: 37
29.09.2012, 22:15  [ТС]
Цитата Сообщение от angstrom Посмотреть сообщение
Есть, использовать классы с дополнительным полем типа Boolean. При выборе в одном из ComboBox-ов, ставить соответствующему полу True - занято, остальным проверять это свойство, если True не разрешать выбор. Можно конечно и через записи.
а нагляднее можно?

Добавлено через 2 минуты
Цитата Сообщение от angstrom Посмотреть сообщение
Есть, использовать классы с дополнительным полем типа Boolean. При выборе в одном из ComboBox-ов, ставить соответствующему полу True - занято, остальным проверять это свойство, если True не разрешать выбор. Можно конечно и через записи.
кстати, может ItemIndex сравнивать и выводить сообщение типа "Выбраны одинаковые значения, исправьте свой выбор" и при этом кнопку "Далее" делать невидимой, типа через if
0
angstrom
29.09.2012, 22:27
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
type
  TComboRecord = record
    St : String;
    I : Single;
    Busy : Boolean;
  end;
 
var
  buf : array[0..9] of TComboRecord = (
    (St : 'Яблоко зелёное'; I : 0.5; Busy : False),
    (St : 'Яблоко красное'; I : 0.75; Busy : False),
// перечисляем остальные
    (St : 'Яблоко жёлтое'; I : 0.75; Busy : False));
При выборе в ComboBox-е пункта, пробегаемся по всему массиву циклом и выставляем всем полям Busy False, выбранному True. При выборе в следующем ComboBox-е при попытке выбора, проверяем поле Busy на True, если да, выбор запрещён. Как то так.
0 / 0 / 0
Регистрация: 29.09.2012
Сообщений: 37
29.09.2012, 22:57  [ТС]
Цитата Сообщение от AleksPlex Посмотреть сообщение
И второй вопрос по присвоению элементу значения: так как эти элементы отвечают за разные параметры в формуле, то как теперь поступить, ведь массив уже не прокатит?
а с этим что решить?

Добавлено через 13 минут
Цитата Сообщение от angstrom Посмотреть сообщение
TComboRecord |= record
именно тут показывает сообщение: Expected ':' but '=' found
в чем я уже затупил?
0
angstrom
29.09.2012, 23:04
Наверное type перед этим забыл прописать.
0 / 0 / 0
Регистрация: 29.09.2012
Сообщений: 37
29.09.2012, 23:08  [ТС]
Цитата Сообщение от angstrom Посмотреть сообщение
Наверное type перед этим забыл прописать.
Delphi
1
2
3
4
5
6
7
8
9
10
type
  TForm2 = class(TForm)
TComboRecord = record
St : String;
I : Single;
Busy : Boolean;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    Memo1: TMemo;
    Button1: TButton;
прописал
0
angstrom
29.09.2012, 23:15
Цитата Сообщение от AleksPlex Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
8
9
10
type
  TForm2 = class(TForm)
TComboRecord = record
St : String;
I : Single;
Busy : Boolean;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    Memo1: TMemo;
    Button1: TButton;
прописал
не так, так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
type
  TForm2 = class(TForm)
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    Memo1: TMemo;
    Button1: TButton;
  end;
 
  TComboRecord = record
    St : String;
    I : Single;
   Busy : Boolean;
  end;
0 / 0 / 0
Регистрация: 29.09.2012
Сообщений: 37
29.09.2012, 23:32  [ТС]
Цитата Сообщение от angstrom Посмотреть сообщение
не так, так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
type
  TForm2 = class(TForm)
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    Memo1: TMemo;
    Button1: TButton;
  end;
 
  TComboRecord = record
    St : String;
    I : Single;
   Busy : Boolean;
  end;
пишет о несовместимости типов
[Error] Unit2.pas(136): Incompatible types: 'Integer' and 'TComboRecord'

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
var
  Form2: TForm2;
    const
     buf : array[0..4] of TComboRecord = (
    (St : 'яблоко зеленое'; I : 0; Busy : False),
    (St : 'яблоко красное'; I : 10; Busy : False),
    (St : 'яблоко желтое'; I : 20; Busy : False),
    (St : 'яблоко надкусанное'; I : 30; Busy : False));
  MaskKom : array[0..10] of Integer = (0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100);
  MaskNav : array[0..10] of Integer = (0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100);
  MaskMex : array[0..10] of Integer = (0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100);
  MaskZar : array[0..10] of Integer = (0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100);
0
angstrom
29.09.2012, 23:35
Где ты что путаешь, примерно так.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    ComboBox3: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure UpdateComboBox;
  end;
 
  TComboRecord  = record
    St          : String;
    I           : Single;
    Busy        : Boolean;
  end;
 
var
  Form1: TForm1;
  buf : array[0..4] of TComboRecord = (
    (St : 'ßáëîêî çåë¸íîå'; I : 0.5; Busy : False),
    (St : 'ßáëîêî êðàñíîå'; I : 0.75; Busy : False),
    (St : 'Ïîìèäîð'; I : 0.4; Busy : False),
    (St : 'Àðáóç'; I : 2.5; Busy : False),
    (St : 'Âèøíÿ'; I : 0.2; Busy : False));
не трогай описание формы, после его end;, пишешь описание TComboRecord.
0 / 0 / 0
Регистрация: 29.09.2012
Сообщений: 37
29.09.2012, 23:49  [ТС]
Цитата Сообщение от angstrom Посмотреть сообщение
не трогай описание формы, после его end;, пишешь описание TComboRecord.
в форме уже все норм, поменял местами и порядок
Delphi
1
2
3
4
5
6
7
8
var
  Form2: TForm2;
    const
     buf : array[0..4] of TComboRecord = (
    (St : 'îáîðóäîâàíèå îòñóòñòâóåò'; I : 0; Busy : False),
    (St : 'ÿùèê ñ èíòðóìåíòàìè'; I : 10; Busy : False),
    (St : 'áîëüøîé ïðîòèâîîñêîëî÷íûé ïîäáîé'; I : 20; Busy : False),
    (St : 'ñòåðåîòðóáà'; I : 30; Busy : False));
вот тут проблемка
0
angstrom
29.09.2012, 23:51
Где ты у меня увидел Const? У меня var используется.
0 / 0 / 0
Регистрация: 29.09.2012
Сообщений: 37
30.09.2012, 00:15  [ТС]
это первоначальный вариант - исправил давно, но проблема осталась
procedure UpdateComboBox;
[Error] Unit2.pas(73): Unsatisfied forward or external declaration: 'TForm2.UpdateComboBox'

Добавлено через 12 минут
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
type
   TForm1 = class(TForm)
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    Memo1: TMemo;
    ComboBox3: TComboBox;
    procedure ComboBox38Change(Sender: TObject);
    procedure ComboBox39Change(Sender: TObject);
    procedure ComboBox40Change(Sender: TObject);
    procedure UpdateComboBox;
    private
    { Private declarations }
  public
    { Public declarations }
 
    end;
TComboRecord = record
St : String;
I : Single;
Busy : Boolean;
 
  end;
 
var
  Form1: TForm1;
     buf : array[0..4] of TComboRecord = (
    (St : 'îáîðóäîâàíèå îòñóòñòâóåò'; I : 0; Busy : False),
    (St : 'ÿùèê ñ èíòðóìåíòàìè'; I : 10; Busy : False),
    (St : 'áîëüøîé ïðîòèâîîñêîëî÷íûé ïîäáîé'; I : 20; Busy : False),
    (St : 'ñòåðåîòðóáà'; I : 30; Busy : False));
 
implementation
 
{$R *.dfm}
 
 
 
procedure TForm1.ComboBox1Change(Sender: TObject);
 var
 I : Integer;
begin
 I := buf[ComboBox1.ItemIndex];
end;
 
procedure TForm1.ComboBox2Change(Sender: TObject);
var
 I : Integer;
begin
 I := buf[ComboBox2.ItemIndex];
end;
 
procedure TForm1.ComboBox3Change(Sender: TObject);
var
 I : Integer;
begin
 I := buf[ComboBox3.ItemIndex];
end;
 
end.
0
angstrom
30.09.2012, 00:15
Наверное проще так. Никакой оптимизации.
Вложения
Тип файла: rar Project26.rar (1.3 Кб, 6 просмотров)
0 / 0 / 0
Регистрация: 29.09.2012
Сообщений: 37
30.09.2012, 00:35  [ТС]
Цитата Сообщение от angstrom Посмотреть сообщение
Наверное проще так. Никакой оптимизации.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    ComboBox3: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure UpdateComboBox;
  end;
 
  TComboRecord  = record
    St          : String;
    I           : Single;
    Busy        : Boolean;
    Tag         : Integer;
  end;
 
var
  Form1: TForm1;
  buf : array[0..4] of TComboRecord = (
    (St : 'ßáëîêî çåë¸íîå'; I : 0.5; Busy : False; Tag : 0),
    (St : 'ßáëîêî êðàñíîå'; I : 0.75; Busy : False; Tag : 0),
    (St : 'Ïîìèäîð'; I : 0.4; Busy : False; Tag : 0),
    (St : 'Àðáóç'; I : 2.5; Busy : False; Tag : 0),
    (St : 'Âèøíÿ'; I : 0.2; Busy : False; Tag : 0));
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
var
  I : Integer;
begin
  ComboBox1.Items.Clear;
  ComboBox2.Items.Clear;
  ComboBox3.Items.Clear;
  for I := 0 to High(Buf) do
  begin
    ComboBox1.Items.Add(buf[I].St);
    ComboBox2.Items.Add(buf[I].St);
    ComboBox3.Items.Add(buf[I].St);
  end;
end;
 
procedure TForm1.UpdateComboBox;
var
  I : Integer;
begin
  ComboBox1.Items.Clear;
  ComboBox2.Items.Clear;
  ComboBox3.Items.Clear;
 
  for I := 0 to High(Buf) do
    if (ComboBox1.Tag = buf[I].Tag) or (buf[I].Tag = 0) then
      ComboBox1.Items.Add(buf[I].St);
 
  for I := 0 to High(Buf) do
    if (ComboBox2.Tag = buf[I].Tag) or (buf[I].Tag = 0) then
      ComboBox2.Items.Add(buf[I].St);
 
  for I := 0 to High(Buf) do
    if (ComboBox3.Tag = buf[I].Tag) or (buf[I].Tag = 0) then
      ComboBox3.Items.Add(buf[I].St);
end;
 
procedure TForm1.ComboBox1Change(Sender: TObject);
var
  I : Integer;
  St : array[0..2] of String;
begin
  St[0] := ComboBox1.Items.Strings[ComboBox1.ItemIndex];
  St[1] := ComboBox2.Items.Strings[ComboBox2.ItemIndex];
  St[2] := ComboBox3.Items.Strings[ComboBox3.ItemIndex];
 
  for I := 0 to High(Buf) do
    if (TComboBox(Sender).Tag = buf[I].Tag) and (buf[I].Tag <> 0) then
    begin
      buf[I].Tag  := 0;
      buf[I].Busy := False;
    end;
 
  for I := 0 to High(Buf) do
    if TComboBox(Sender).Items.Strings[TComboBox(Sender).ItemIndex] = buf[I].St then
    begin
      buf[I].Tag  := TComboBox(Sender).Tag;
      buf[I].Busy := True;
    end;
 
  UpdateComboBox;
  ComboBox1.ItemIndex := ComboBox1.Items.IndexOf(St[0]);
  ComboBox2.ItemIndex := ComboBox2.Items.IndexOf(St[1]);
  ComboBox3.ItemIndex := ComboBox3.Items.IndexOf(St[2]);
end;
 
end.
очень удобный вариант) спасибо, но хотелось бы подробнее разобраться в примере, можно объяснить, что выполняет машина, на объяснения, как для полного нуба, не обижусь)))
0
angstrom
30.09.2012, 00:47
При выборе итема, проверяем, если за этим ComboBox-ом уже закреплён элемент (Tag <> 0) очищаем его. Так как количество итемов может быть меньше (использовано в других CoboBox-ах) чем имеется в buf используем if TComboBox(Sender).Items.Strings[TComboBox(Sender).ItemIndex] = buf[I].St для поиска в буфере, при нахождении закрепляем за ComboBox-ом, выставляя Tag буфера в соответствии TagComboBox-а. Затем очищаем содержимое всех ComboBox-ов и заполняем в соответствии с полем Tag буфера.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.09.2012, 00:47

Как сделать чтобы при выборе в combobox , менялись значения в других combobox?
Есть два combobox. Как их сделать зависимыми друг от друга. Что бы при выборе одного combobox менялись данные в другом. К примеру: В...

Как сделать чтобы при выборе в combobox , менялись значения в других combobox? Visual Basic 6.0
Есть несколько компонентов Combobox, списки через Form_load я прописал, теперь списки отображаются. Но как сделать так чтобы при выборе в...

Как сделать, чтобы в при выборе одного итема в ComboBox, в другом ComboBox выводился итем того же индекса?
Как сделать чтобы в при выборе одного итема в в ComboBox в другом ComboBox выводился итем того же индекса например у меня есть база с...

Подстановка символов при выборе определенной строки в ComboBox
Необходима помощь!?!?!?! имеется форма на которой ComboBox1, edit1, edit2, Button1 - после нажатия Button1, в edit2 вставляется...

Нужно, чтобы при выборе города (combobox) информация о нем выводилась в memo
Нужно чтобы при выборе города(combobox) информация о нем выводилась в memo. Только инф-ция о городе должна подгружаться из блокнота.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru