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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2007, 00:05   #1
JetAPI
Пользователь
 
Регистрация: 21.07.2007
Сообщений: 13
По умолчанию TListView; не рисует цветом TCanvas

Добрый день всем!
Помогите, пожалуйста, разобраться... самому справиться не получается.
Никак, цветным, не рисуется TCanvas/ Вот этот фрагмент...
Код:
with Sender.Canvas do begin
  Font.Color:=clBlue;
  TextOut(R.Left + 0, R.Top, 'Син');
  Font.Color:=clLime;
  TextOut(R.Left + 30, R.Top, 'Зел');
  Font.Color:=clRed;
  TextOut(R.Left + 60, R.Top, 'Крас');
  end;
Должно написаться Синим Зеленым и Красным... Пишется все, только синим.
код привожу ниже... Посмотрите пожалуйста, в чем ошибка?.. Что делаю не так?
Код:
unit MDUnit1;

interface

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

type
  TForm1 = class(TForm)
    ListView1: TListView;
    procedure FormCreate(Sender: TObject);
    procedure ListView1AdvancedCustomDrawSubItem(Sender: TCustomListView;
      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
      Stage: TCustomDrawStage; var DefaultDraw: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

uses CommCtrl;

procedure TForm1.FormCreate(Sender: TObject);
var  i,j: Byte;
begin
Form1.Width := 650;
ListView1.ViewStyle := vsReport;
ListView1.GridLines := True;
ListView1.Width := 500;
for i:=0 to 2 do begin
    ListView1.Columns.Add.Width:=150;
    ListView1.Column[i].Caption:='Колонка '+IntToStr(i+1);
    end;
for i:=0 to 3 do begin
    ListView1.Items.Add.Caption:='Итем '+IntToStr(i+1);
    for j:=0 to 1 do
        ListView1.Items.Item[i].SubItems.Add('Сабитем '+IntToStr(j+1));
    end;
end;

procedure TForm1.ListView1AdvancedCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var R: TRect;
begin
if (item.Index = 1) and (SubItem = 1) then begin
  DefaultDraw:=false;
  ListView_GetSubItemRect(ListView1.Handle,Item.Index,SubItem,LVIR_BOUNDS,@R);
  with Sender.Canvas do begin
  Font.Color:=clBlue;
  TextOut(R.Left + 0, R.Top, 'Син');
  Font.Color:=clLime;
  TextOut(R.Left + 30, R.Top, 'Зел');
  Font.Color:=clRed;
  TextOut(R.Left + 60, R.Top, 'Крас');
  end;
end;
// Если эти операторы убрать, текст жирным делается...
if Assigned(Sender.Canvas.Font.OnChange) then
  Sender.Canvas.Font.OnChange(Sender.Canvas.Font);
end;

end.
Можно ли как-нибудь помочь моему горю? Спасибо всем, за ранее.

(См. скриншот)
Изображения
Тип файла: jpg не_рисует_цветом.JPG (26.2 Кб, 150 просмотров)
JetAPI вне форума Ответить с цитированием
Старый 24.08.2007, 10:06   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Дай полный код чтоб компилировался
ListView_GetSubItemRect ?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 24.08.2007 в 10:09.
mutabor вне форума Ответить с цитированием
Старый 24.08.2007, 10:52   #3
JetAPI
Пользователь
 
Регистрация: 21.07.2007
Сообщений: 13
По умолчанию

mutabor , 1000 извинений... но я даже и не надеюсь, что кто-то это может решить, поэтому не стал дотошно описывать весь код (да там ничего и нету...)
Вы наверное, забыли подключмить модуль CommCtrl...

implementation
{$R *.dfm}

uses CommCtrl;

На форме лежит один компонент TListView... и все.
ЗЫ: Не получается ни у кого... цветом прорисовать..

Последний раз редактировалось JetAPI; 24.08.2007 в 10:56.
JetAPI вне форума Ответить с цитированием
Старый 24.08.2007, 16:30   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Код:
procedure TForm1.ListView1AdvancedCustomDrawSubItem(
  Sender: TCustomListView; Item: TListItem; SubItem: Integer;
  State: TCustomDrawState; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);
var
 R: TRect;
 bm: TBitmap;
begin
if (item.Index = 1) and (SubItem = 1) then
  begin
  DefaultDraw:=false;
  ListView_GetSubItemRect(ListView1.Handle,Item.Index,SubItem,LVIR_BOUNDS,@R);
  bm:=TBitmap.Create;
  bm.Width:=R.Right;
  bm.Height:=R.Bottom;
  with bm.Canvas do
    begin
    Font.Color:=clBlue;
    TextOut(R.Left + 0, R.Top, 'Син');
    Font.Color:=clLime;
    TextOut(R.Left + 30, R.Top, 'Зел');
    Font.Color:=clRed;
    TextOut(R.Left + 60, R.Top, 'Крас');
    end;
  with Sender.Canvas do
    begin
    CopyRect(R,bm.Canvas,R);
    end;
  bm.Free;
  end;
// Если эти операторы убрать, текст жирным делается...
if Assigned(Sender.Canvas.Font.OnChange) then
  Sender.Canvas.Font.OnChange(Sender.Canvas.Font);
end;
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 24.08.2007 в 16:33.
mutabor вне форума Ответить с цитированием
Старый 24.08.2007, 16:35   #5
JetAPI
Пользователь
 
Регистрация: 21.07.2007
Сообщений: 13
По умолчанию

mutabor спасибо!
Сейчас попробую...

Последний раз редактировалось JetAPI; 24.08.2007 в 16:37.
JetAPI вне форума Ответить с цитированием
Старый 24.08.2007, 16:49   #6
JetAPI
Пользователь
 
Регистрация: 21.07.2007
Сообщений: 13
По умолчанию

Фу-у...
mutabor, да!.. Да! Это решение!
Спасибо!! Спасибо! Так и нужно... Я сам сделать ничего не мог.
JetAPI вне форума Ответить с цитированием
Старый 24.08.2007, 16:58   #7
JetAPI
Пользователь
 
Регистрация: 21.07.2007
Сообщений: 13
По умолчанию

mutabor, можно вопрос?.. пожалуйста...
Вот, этим оператором, мы создаем:
bm:=TBitmap.Create;
А этим...
bm.Free;
...мы освобождаем то, что создали. Правильно я понимаю?..
Т.е., они всегда в паре идут... да?
Если не затруднит, объясните... Возможно не правильно понимаю.

ЗЫ: Делфи только учусь, поэтому имеются ламмерские вопросы.
JetAPI вне форума Ответить с цитированием
Старый 24.08.2007, 17:49   #8
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Free освобождает память занятую объектом, если создаешь временные (локальные) объекты, обязательно потом освобождай память.

Можно сделать этот битмап глобальным, не надо будет при каждой перерисовке заново создавать. Тогда и Free не нужен будет. Оставь там только изменение ширины и высоты. Создай его в OnCreate формы.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 24.08.2007, 22:17   #9
JetAPI
Пользователь
 
Регистрация: 21.07.2007
Сообщений: 13
По умолчанию

Цитата:
Можно сделать этот битмап глобальным, не надо будет при каждой перерисовке заново создавать. Тогда и Free не нужен будет. Оставь там только изменение ширины и высоты. Создай его в OnCreate формы.
Вот этот совет примукак к своему сведенью!.. Я только в самом начале, и для меня каждое объяснение и подсказка очень важны.
mutabor, спасибо... Вы очень мне помогли!
JetAPI вне форума Ответить с цитированием
Старый 24.08.2007, 22:22   #10
JetAPI
Пользователь
 
Регистрация: 21.07.2007
Сообщений: 13
По умолчанию

to Mutabor
Цитата:
Создай его в OnCreate формы.
Ага... понятно...
JetAPI вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TListView (привязка значков к сетке) Fireleo Общие вопросы Delphi 2 04.08.2008 14:52
Цветные строки в TListView Johnson Компоненты Delphi 6 18.07.2008 15:07
Как работать с TCanvas - на PaintBox1 программа должна рисовать полигон Михаил Юрьевич Общие вопросы Delphi 16 04.01.2008 15:31
Как сортировать список TListView по определённому столбцу? Никки Общие вопросы Delphi 1 18.12.2007 19:18
Вопрос по TListView. madroller Компоненты Delphi 1 03.11.2006 04:35