Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полезные примочки для ListBoxа и для ComboBoxа 
:(
    Опции темы
Pakshin A. S.
  Дата 14.3.2003, 03:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Вставка в ListBox картинки.
Установите свойства Style = lbOwnerSrawFixed.
Модуль формы будет выглядеть так:
Код

unit Unit1;

interface

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

type
TForm1 = class (TForm)
 ListBox1: TListBox;
 procedure FormActivate(Sender: TObject);
 procedure ListBox1DrawItem(Control: TWinControl; Index: integer; Rect: TRect; State: TOwnerDrawState);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
var
Ico: TIcon;
begin
with ListBox1.Items do
 begin
  Ico:=TIcon.Create;
  Ico.LoadFromFile('c:\Program Files\Common Files\Borland Shared\Images\Icons\chemical.ico');
  AddObject('Some text', Ico);
  Ico:=Ticon.Create;
  Ico.LoadfromFile('c:\Program Files\Common Files\Borland Shared\Images\Icons\chip.ico');
  AddObject('Some text', Ico);
  Ico.Free;
 end;
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: integer; Rect: TRect; State: TOwnerDrawState);
var
Ico:Ticon;
Offset:integer; //ширина отступа текста
begin
with (Control as TListBox).Canvas do
 begin
  FillRect(Rect);
  Offset:=2;
  Ico:=TIcon((Control as TListBox).Items.Objects[Index[);
  if Ico <> nil
   then
    begin
     Draw(Rect.Left + 1, Rect.Top + 2, TIcon((Control as TListBox).Items.Objects[Index]));
     OffSet:=Ico.Width + 9;
    end;
  TextOut(Rect.Left + OffSet, rect.Top + 7, (Control as TListBox).Items[Index]);
 end;
end;




Добавление горизональной полосы прокрутки в TListBox.
Код

procedure TForm1.FormCreate(Sender: TObject);
var
i, MaxWidth: integer;
begin
MaxWidth:=0;
for i:+0 to ListBox1.Items.Count-1 do
 if MaxWidth < ListBox1.Canvas.TextWidth(ListBox1.Items.Strings[i])
  then
   MaxWidth:=ListBox1.Canvas.textWidth(ListBox1.Items.Strings[i]);
SendMessage(ListBox1.Handle, LB_SETHORIZANTALEXTENT, MaxWidth + 2, 0);
end;




Компонент, реализующий Hint в выпадающем списке ComboBox

Код

type
TVSComboBox = class(TCustomComboBox)
...
private
 FHint: THintWindow;
...
protected
 procedure WMCTLCOLORLISTBOX(var Message: TMessage); message WM_CTLCOLORLISTBOX;
...

Главное не забыть выполнить инициальзацию компонента в конструкторе:
...
begin
inherited Create(AOwner);
FHint:=THintWindow.Create(Self);
...

Чтобы получить информацию об активной строке в выпадающем списке ComboBox, перезватите сообщение WM_CTLCOLORLISTBOX. В процедуре сообщения проанализируёте строку и, если её длинна больше ширины выпадающего списка, передайте "длинную строку" в FHint и активизируйте его:
FHint.ActivateHint(TextRc, Items[ItemIndex]);
Если активная строка в выпадающем списке "короткая" - спрячьте FHint:
FHint.ReleaseHandle;

PM   Вверх
Song
Дата 14.3.2003, 04:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Sysman.ru
***


Профиль
Группа: Участник
Сообщений: 1095
Регистрация: 2.6.2002

Репутация: 2
Всего: 4



Это ты типа ликбез что ли? :-/


--------------------
Прежде чем сказать "Невозможно", подумай, прав ли ты
PM WWW ICQ   Вверх
Medved
Дата 14.3.2003, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Всесьма похвально.... (без сарказма). Ликбез приветсвуется.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
stab
Дата 14.3.2003, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Прикольно, только почему загрузка иконок в первом примере происходит при наступлении события OnActivate. Лучше это делать на OnCreate или OnShow...


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Pakshin A. S.
Дата 15.3.2003, 04:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Через несколько дней напишу ещё что-нибудь полезное...
PM   Вверх
Pakshin A. S.
Дата 15.3.2003, 04:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Впринцепе в ListBox можно запихнуть и BitMap:
[CODE]
procedure ListDrawItem(...);
var
BitMap: TBitMap;
begin
// Инициализацию BitMapa писать не буду
...
with (Control as TListBox).Canvas do
begin
FillRect(Rect);
Draw(rect.Left, Rect.Top, BitMap);
TextOut(Rect.Left + 2 + BitMap.Width, Rect.Top, ListBox1.Items.Strings[Index]);
end;
end;
...

PM   Вверх
Pakshin A. S.
Дата 15.3.2003, 04:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Чёрт, забыл закрыть секцию CODE, надо быть внимательнее...
PM   Вверх
Pakshin A. S.
Дата 15.3.2003, 04:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Нашел в одной книге интересный пример:
Код

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: integer; Rect: TRect; State: TOwnerDrawState);
var
s:string;
Sym:char;
N:Word;
Def: TColor;
begin
with (Control as TListBox).Canvas do
 begin
  s:=Items[Index];
  Fillrect(Rect);
  MoveTo(Rect.Left + 2, Rect.Top);
  SetTextAlign(Canvas.Handle, TA_LEFT OR TA_UPDATECP);
  Def:=Font.Color;
  for n:=1 to Length(s) do
   begin
    Sym:=AnsiUpperCase(S[n])[1];
    case Sym of
     'А', 'Я': Font.Color:=clRed;
    else
     ForntColor:=Def;
    end;
  Windows.textOut(Convas.Handle, 0, 0, @S[N], 1);
 end;
end;
end;

В результате все буквы А и Я будут красного цвета.
PM   Вверх
MacTep
Дата 16.3.2006, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Ничего отрицательного сказать не хочу, но в последнем коде куча ошибок. Это раз! Два, он не работает нормально! Постарался исправить, ничего не получилось путевого. Может быть разберемся в нем и посраемся довести его до совершенства?


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Quadr0
Дата 16.3.2006, 21:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 10:49
  Вверх
MacTep
Дата 16.3.2006, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



Quadr0, ну вот это уже совсем другое дело. Но согласись, что вовсе не так, как написанов примере выше! smile
Добавлено @ 22:31
Quadr0, а можно узнать для чего нужны переменные ChRect, FocusRect: TRect;
и что обозначают куски кода:
Код

  { Цвет выделения и рамка }
  FocusRect := Rect;
  with FocusRect do
  begin
    Inc(Left, 1);
    Inc(Top, 1);
    Dec(Right, 1);
    Dec(Bottom, 1);
  end;
  with Lb.Canvas do
  begin
    Pen.Style := psClear;
    if odSelected in State then
      Brush.Color := clHighlight;
    FillRect(Rect);
    Rectangle(FocusRect);
  end;
  { Вывод текста }
  ChRect := Rect;
  with ChRect do
  begin
    Inc(Left, 4);
    Inc(Top, 1);
    Right := Left;
  end;

Попытался сам вникнуть, но не получилось! smile



--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Quadr0
Дата 16.3.2006, 22:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 10:50
  Вверх
MacTep
Дата 17.3.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: 4
Всего: 4



А как можно сделать так, чтобы, например, красным текстом были написаны лишь строки с номерами 1, 3, 5 и 7, а после нажатия на кнопку 2, 4, 6, 8???


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
_hunter
Дата 17.3.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



для определения строки в обработчик передается Index
для реакции на нажатие устанавливай где-нить флаг


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.