![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как изменить текст комбобокса после выбора из выпадающего списка
ANB © (2008-09-16 14:19:00)Чего то совсем туплю.
Имеем : комбобокс с заполненным выпадающим списком.
Надо : после того, как юзер выбрал нужный элемент в списке изменить текст комбобокса.
Зачем : в списке лежат длинные строки, которые я разбираю, обрабатываю, а по окончании в тексте комбобокса хочу отобразить только кусок выбранной строки.
Что получается : вроде нужная строка сначала присваивается, а потом трется обратно длинной строкой из списка.
ANB (2008-09-17 13:47:00) [1]
> а OnCloseUp не подойдет?
Не помогает. Я с него начал. Но тогда еще новый текст не доехал.
Засунул в OnSelect
> Пока тут трепешься, уже раз восемь бы сделал ;)
Да я еще вчера сделал.
MsGuns (2008-09-16 20:15:00) [2]>ANB (16.09.08 17:30) [12]
>Лениво и некогда.
Пока тут трепешься, уже раз восемь бы сделал ;)
clickmaker (2008-09-16 18:47:00) [3]а OnCloseUp не подойдет?
ANB (2008-09-16 18:13:00) [4]
> {RASkov} © (16.09.08 17:42) [13]
О нечто подобном я думал. Только вот PostMessage не больно надежно.
{RASkov} (2008-09-16 17:42:00) [5]> Как изменить текст комбобокса после выбора из выпадающего списка
А такой вариант не пойдет:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
const AFTER_COMBOSELECT = WM_USER+100;
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
procedure ComboBox1Select(Sender: TObject);
private
procedure ComboUpdate(var Mes: TMessage); message AFTER_COMBOSELECT;
{ Private declarations }
public
{ Public declarations }
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ComboBox1Select(Sender: TObject);
begin
PostMessage(Handle, AFTER_COMBOSELECT, Integer(TComboBox(Sender)), 0);
end;
procedure TForm1.ComboUpdate(var Mes: TMessage);
begin
with TComboBox(Mes.WParam) do Text:='NewText';
end;
end.
?
ANB (2008-09-16 17:30:00) [6]
> Тогда не мучайся, а сделай отдельный edit и отдельный выпадающий
> список
Лениво и некогда. Использовал пока нулевой элемент Items для мусора. Работает и ладно. Юзеру не мешает. Вылезла по дороге еще одна проблема в комбинации комбобокс + RX форм-стродже. Пустые элементы списка как то криво садяться.
Я думал что такой тупой и не умею работать с комбобоксами, а оно воно как. Следующий раз переделаю на обычный эдит.
Игорь Шевченко (2008-09-16 17:27:00) [7]ANB (16.09.08 17:22) [9]
> Да мне и иметь в поле нужно короткий текст. Иначе длинный
> придется еще раз обрабатывать. Плюс юзер должен иметь возможность
> руками его менять.
Тогда не мучайся, а сделай отдельный edit и отдельный выпадающий список
Vlad Oshin (2008-09-16 17:27:00) [8]положи еще один, на самом деле, поверх, пусть Визибл щелкается туда-сюда
ANB (2008-09-16 17:22:00) [9]
> Игорь Шевченко © (16.09.08 16:43) [7]
Да мне и иметь в поле нужно короткий текст. Иначе длинный придется еще раз обрабатывать. Плюс юзер должен иметь возможность руками его менять.
> Положи в список короткие строки.
> А обрабатывай длинные. Например, из постороннего массива.
>
По хорошему юзер должен видеть длинные строки.
> >Матство.
Непереводимая игра слов. :(
oldman (2008-09-16 17:02:00) [10]
> ANB (16.09.08 14:19)
> Зачем : в списке лежат длинные строки, которые я разбираю,
> обрабатываю, а по окончании в тексте комбобокса хочу отобразить
> только кусок выбранной строки.
Положи в список короткие строки.
А обрабатывай длинные. Например, из постороннего массива.
Игорь Шевченко (2008-09-16 16:43:00) [11]
> Имеем : комбобокс с заполненным выпадающим списком.
> Надо : после того, как юзер выбрал нужный элемент в списке
> изменить текст комбобокса.
> Зачем : в списке лежат длинные строки, которые я разбираю,
> обрабатываю, а по окончании в тексте комбобокса хочу отобразить
> только кусок выбранной строки.
Используй OwnerDraw и выводи только часть текста. Реагируй на odComboBoxEdit в State при рисовании.
Примерно так:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
AText: string;
begin
TComboBox(Control).Canvas.FillRect(Rect);
if Index <> -1 then
begin
AText := TComboBox(Control).Items[Index];
if odComboBoxEdit in State then
AText := Copy(AText, 1, 5);
DrawText(TComboBox(Control).Canvas.Handle, PChar(AText), -1, Rect,
DT_VCENTER);
end;
end;
end.
MsGuns (2008-09-16 15:58:00) [12]>ANB (16.09.08 15:29) [5]
>Матство.
Переведи
>А попроще низзя ?
А чего там сложного ? Особенно если эту панель с тройкой не засунуть в репозитрий и брать оттуда готовую ? Да и в библиотеку можно засунуть, обойдясь вообще без дизайна
ANB (2008-09-16 15:29:00) [13]
> MsGuns © (16.09.08 14:49) [4]
Матство. А попроще низзя ?
Пока извратился через перезаписывание одного элемента Items. Благо его содержимое не больно ценно. Хотя хотелось бы вернуть все на место.
MsGuns (2008-09-16 14:49:00) [14]В таких случаях я бы использовал обычный эдит, справа рядом кнопульку и "фантомный" комобокс, который по нажатию на кнопульку рисуется точно по эдиту и кнопульке. Дальше, думаю все ясно. Если имеется процедура обработки ресайзинга, то всю эту троицу впихать в панельку, размеры и позицию которой пересчитывать так же, как и для "старого" комобобокса
Поросенок Винни-Пух (2008-09-16 14:46:00) [15]Если про RX то там у комбо было два параллельных списка.
Один с отображаемыми строками, другой со значениями.
Ega23 (2008-09-16 14:44:00) [16]
> То есть юзер при выбое видит одно поле (значение), а в KeyValue
> записано другое поле (значение)
Не совсем так. Там DisplayValue было
Поросенок Винни-Пух (2008-09-16 14:25:00) [17]похожий пример был в rx. или в EhLib (для dbaware)
То есть юзер при выбое видит одно поле (значение), а в KeyValue записано другое поле (значение)