Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2011, 06:53   #11
{Shadowevil}
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Если с ListBox повозиться, то вполне можно сделать - там и прорисовка есть и высота настраиваемая. ListBox1.Style=lbOwnerDrawVariable
Код:
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
  for i:=0 to ListBox1.Items.Count-1 do begin
    ListBox1.ItemIndex:=i;
    ListBox1Click(ListBox1);
  end;
  ListBox1.ItemIndex:=0;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
var xHeight: Integer;
begin
  if ListBox1.ItemIndex mod 3=0 then xHeight:=24
  else if ListBox1.ItemIndex mod 3=1 then xHeight:=20
  else xHeight:=16;
  SendMessage(ListBox1.Handle,LB_SetItemHeight,ListBox1.ItemIndex,xHeight);
end;

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var xColor: TColor;
begin
  if ListBox1.Count=0 then Exit;
  if (odSelected in State) and ListBox1.Focused then xColor:=clActiveCaption
  else if odSelected in State then xColor:=clBtnFace
  else xColor:=clWindow;
  ListBox1.Canvas.Brush.Color:=xColor;
  ListBox1.Canvas.FillRect(Rect);
  if (odSelected in State) and Control.Focused then ListBox1.Canvas.Font.Color:=clWindow
  else if Index mod 3=0 then ListBox1.Canvas.Font.Color:=clRed
  else if Index mod 3=1 then ListBox1.Canvas.Font.Color:=clLime
  else ListBox1.Canvas.Font.Color:=clBlue;
  if Index mod 3=0 then ListBox1.Canvas.Font.Size:=16
  else if Index mod 3=1 then ListBox1.Canvas.Font.Size:=12
  else ListBox1.Canvas.Font.Size:=8;
  ListBox1.Canvas.TextRect(Rect,Rect.Left+2,Rect.Top,ListBox1.Items.Strings[Index]);
end;
ух ты, клево! спасибо огромное! а тут можно сделать итем многострочный? и чтобы допустим у первой строки в итеме шрифт был 12, а у 2, 3 .. - 8? а для динамического добавления итемов в цикле сойдет? и если да, как правильно вызывать этот метод или он сам вызывается при добавлении нового итема? извините что так много спрашиваю, но без вашей помощи вряд ли разберусь
или может поможете написать свой компонент который бы мог содержать много строчный текст в итемах с построчным редактированием?

Последний раз редактировалось {Shadowevil}; 12.12.2011 в 12:26.
{Shadowevil} вне форума Ответить с цитированием
Старый 12.12.2011, 23:10   #12
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

{Shadowevil}, как вариант многострочность в Item можно сделать двумя способами:
1. Отдельно прорисовывать каждую строку через Canvas, при этом изменяя размеры/цвет/шрифт перед прорисовкой (TextOut).
2. Просто сформировать строку вида: Верхняя строка + #13#10 + Нижняя строка. (Где #13#10 послужит переносом на новую строчку).
kettanaito вне форума Ответить с цитированием
Старый 13.12.2011, 06:22   #13
{Shadowevil}
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от kettanaito Посмотреть сообщение
{Shadowevil}, как вариант многострочность в Item можно сделать двумя способами:
1. Отдельно прорисовывать каждую строку через Canvas, при этом изменяя размеры/цвет/шрифт перед прорисовкой (TextOut).
2. Просто сформировать строку вида: Верхняя строка + #13#10 + Нижняя строка. (Где #13#10 послужит переносом на новую строчку).
второй вариант отпадает сразу, ибо вместо переноса он выдает две вертикальных черты ..Текст||Текст2 ..я подозреваю что это как раз так из-за того что в итемах не поддерживается многострочный текст, поэтому сюда и написал проблему)

А первый вариант, через канву, это надо просто в прорисовщике несколько
TextOut подряд вывести с необходимыми параметрами? то есть как я понимаю примерно так:

Код:
....
Begin
Параметры 1
...
TextOut(Текст 1);
Параметры 2
...
TextOut(Текст 2);
Параметры 3
...
TextOut(Текст 3);
End;
...
так надо делать?


Ураа, получилось :З осталось только правильные параметры подобрать, но это дело времени :З Всем огромное спасибо за помощь! Без вас я бы не смог Отдельная благодарность Аватару за пример! :З надеюсь это кому нибудь еще поможет

Последний раз редактировалось {Shadowevil}; 13.12.2011 в 06:40.
{Shadowevil} вне форума Ответить с цитированием
Старый 13.12.2011, 14:21   #14
flexterful
Пользователь
 
Регистрация: 22.08.2008
Сообщений: 39
По умолчанию

Есть компонент TRichView. Его функциональности должно хватить
Чего бы тут сделать, дабы ничего неделать?
flexterful вне форума Ответить с цитированием
Старый 13.12.2011, 16:18   #15
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Для многострочного ListBox можно посмотреть
http://programmersforum.ru/showthrea...hlight=ListBox
Но в случае разно-фонтовых строк он не подойдет. Там можно имитировать многострочность при прорисовке выделения. В свойстве Items.Objects поместить номер блока и тип строки блока (например 256*номер+тип) для каждого итема. Если ловим в прорисовке, что Item выделенный, то запускать прорисовку выделенным и других итемов блока. Типом можно воспользоваться для управления фонтом прорисовки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.12.2011, 19:47   #16
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

{Shadowevil}, просто координату оси Y изменять, учитывая высоту текста:
Код:
...
with Canvas do 
begin
  Font.Color:=clRed;
  Font.Size:=10;
  TextOut(5,5,'Text 1');
  Font.Color:=clBlue;
  Font.Size:=8;
  TextOut(5,10,'Text 2');
end;
...
К примеру.
kettanaito вне форума Ответить с цитированием
Старый 14.12.2011, 07:19   #17
{Shadowevil}
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от kettanaito Посмотреть сообщение
{Shadowevil}, просто координату оси Y изменять, учитывая высоту текста:
Код:
...
with Canvas do 
begin
  Font.Color:=clRed;
  Font.Size:=10;
  TextOut(5,5,'Text 1');
  Font.Color:=clBlue;
  Font.Size:=8;
  TextOut(5,10,'Text 2');
end;
...
К примеру.
Так и сделал, все получилось еще раз огромное спасибо

*********************************** ****************************

Зря я так рано обрадовался
оказалось все не так сказочно как я думал
Ребят, не понимаю почему так происходит, дело вот в чем:
У меня есть цикл:
Код:
While Not Query10.Eof do
     begin
          firmn:=Query10.FieldByName('sfn').AsString;
          LBadr:=Query10.FieldByName('allinfo').AsString;
          sListBox1.AddItem(firmn, nil);
      Query10.Next;
     end;
где firmn - название фирмы, LBadr - ее адрес, sListBox1 - тот самый измученный листбокс.
LBadr прописана в Public.
На DrawItem, как подсказали ранее, прописываю:
Код:
...
  if (odSelected in State) and Control.Focused then sListBox1.Canvas.Font.Color:=clInactiveCaption
  else sListBox1.Canvas.Font.Color:=clBlack;

  sListBox1.Canvas.Font.Size:=8;
  sListBox1.Canvas.Font.Style:=sListBox1.Canvas.Font.Style + [fsBold];
  x:=sListBox1.Canvas.Font.Size;
  sListBox1.Canvas.TextRect(Rect, Rect.Left+2,Rect.Top,sListBox1.Items.Strings[Index]);
  sListBox1.Hint:=sListBox1.Items.Strings[Index];
  sListBox1.ShowHint:=true;

  if (odSelected in State) and Control.Focused then sListBox1.Canvas.Font.Color:=clInactiveCaption
  else sListBox1.Canvas.Font.Color:=clGray;
//  sListBox1.Canvas.Font.Size:=8;
  sListBox1.Canvas.Font.Style:=sListBox1.Canvas.Font.Style - [fsBold];
  sListBox1.Canvas.TextOut(Rect.Left+2, Rect.Top+x+6, '   '+ LBadr);
  sListBox1.Canvas.TextOut(Rect.Left+2, Rect.Top+x+22, '     '+'Телефон');
end;
и вот тут выплывает косяк ...Все LBadr в DrawItem заменяются на последний LBadr из цикла, т.е. допустим мне надо чтобы получилось:

Название фирмы 1
адрес: ул. Ленина, 50
телефон: ...
Название фирмы 2
адрес: ул. Победы, 32а
телефон: ...
Название фирмы 3
адрес: ул. Красной звезды, 12
телефон: ...

А получается:

Название фирмы 1
адрес: ул. Красной звезды, 12
телефон: ...
Название фирмы 2
адрес: ул. Красной звезды, 12
телефон: ...
Название фирмы 3
адрес: ул. Красной звезды, 12
телефон: ...

почему так происходит? и как от этого избавиться? может надо заносить LBadr в массив и потом тянуть из него в зависимости от индекса итема?

*********************************** **************************

Делааа ....сделал с массивом и вроде бы даже что то в этом есть, но опять один косяк всплывает ...теперь вместо последнего LBadr из цикла, везде ставится первый:

Название фирмы 1
адрес: ул. Ленина, 50
телефон: ...
Название фирмы 2
адрес: ул. Ленина, 50
телефон: ...
Название фирмы 3
адрес: ул. Ленина, 50
телефон: ...

и меняется на нужный только если ткнуть по итему:

Название фирмы 1
адрес: ул. Ленина, 50
телефон: ...
Название фирмы 2
адрес: ул. Победы, 32а
телефон: ...
Название фирмы 3
адрес: ул. Ленина, 50
телефон: ...

а если после этого, допустим, прокрутить колесико мыши, то все адреса меняются на тот, который выбран в данный момент
как сделать чтобы оно само подставлялось как надо?

Последний раз редактировалось {Shadowevil}; 14.12.2011 в 09:01.
{Shadowevil} вне форума Ответить с цитированием
Старый 14.12.2011, 09:39   #18
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Я уже упоминал о Items.Objects. Держите в нем для каждого Item ссылку на запись Query (например значение Query.RecNo) и при прорисовке локализуйте эту запись и значения из нее используйте
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.12.2011, 09:54   #19
{Shadowevil}
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Я уже упоминал о Items.Objects. Держите в нем для каждого Item ссылку на запись Query (например значение Query.RecNo) и при прорисовке локализуйте эту запись и значения из нее используйте
ой как вы сейчас сложно сказали а можно какой нибудь небольшой примерчик? пожалуйста. я это все пока еще смутно понимаю
{Shadowevil} вне форума Ответить с цитированием
Старый 14.12.2011, 10:04   #20
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Добавление итема
Код:
sListBox1.AddItem(firmn, TObject(Query10.RecNo));
вместо          
sListBox1.AddItem(firmn, nil);
Локализация записи при прорисовке
Код:
Query10.RecNo:=Integer(sListBox1.Items.Objects[Index]);
и из записи брать нужные значения

ADD

И вообще вы намудрили с компонентом. Что мешало просто DBGrid использовать, показывая в одну строку информацию? ИМХО
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 14.12.2011 в 10:19.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой компонент использовать Кинельски Компоненты Delphi 5 23.06.2010 11:10
КАКОЙ КОМПОНЕНТ НАДО ИСПОЛЬЗОВАТЬ? Gareevbo Общие вопросы Delphi 2 08.06.2009 22:33
Подскажите какой использовать компонент Tanya2008 Компоненты Delphi 1 12.03.2009 21:37
Какой компонент использовать для отображения файлов devi409 Компоненты Delphi 8 15.02.2009 14:50
Какой компонент использовать? XPAiN БД в Delphi 3 05.05.2008 08:45