Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.02;
Скачать: CL | DM;

Вниз

TButton: Как одно событие, согласовать с другим событием?   Найти похожие ветки 

 
JetAPI ©   (2007-08-05 18:23) [0]

Привет мастера Делфи!
На форме лежит Button1 и ListView1. Какой должить быть код в обработчиках TForm1.Button1Click и TForm1.ListView1CustomDrawItem,
чтобы по нажатию на кнопку, строка окрашивалась красным?

procedure TForm1.Button1Click(Sender: TObject);
begin
// Что должно быть здесь, чтобы, нажав на Button1,
// сработало условие в OnCustomDrawItem?
end;

procedure TForm1.FormCreate(Sender: TObject);
const a: array [0..2] of integer = (100,150,200);
var
i,j: Integer;
begin
ListView1.ViewStyle:=vsReport;
with ListView1 do begin
for i:=0 to 2 do begin
   Columns.Add.Width:=a[i];
   Column[i].Caption:="Column  #"+IntToStr(i+1);
   end;
for i:=0 to 3 do begin
   Items.Add.Caption:="Item  "+IntToStr(i+1);
   for j:=0 to 1 do
       Items.Item[i].SubItems.Add("Subitem  "+IntToStr(j+1))
   end;
end;
end;

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
 Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
// Что нужно добавить в усл. оператор, чтобы он сработал по
// нажатию Button1 ? Т.е., нажав на кнопку, только тогда строка
// рисовалась красным.
if Item.Index = 2 then ListView1.Canvas.Brush.Color := clRed;
end;


В общем, не знаю, как правильно это сделать...
Как одно событие, связать с другим событием?.. вот чего не пойму.
За ранее спасибо.


 
MetalFan ©   (2007-08-05 18:58) [1]


> строка окрашивалась красным?

какая строка? выведи условие и его проверяй в отрисовке
например можно добавлять в список номера закрашиваемых строк
например как-то так:


...
 FFillList: TList;
...
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> // Что должно быть здесь, чтобы, нажав на Button1,
> // сработало условие в OnCustomDrawItem?
    FList.Add( Pointer( ListView1.Selected ));
> end;
>
> procedure TForm1.FormCreate(Sender: TObject);
> const a: array [0..2] of integer = (100,150,200);
> var
> i,j: Integer;
> begin
> ListView1.ViewStyle:=vsReport;
> with ListView1 do begin
> for i:=0 to 2 do begin
>    Columns.Add.Width:=a[i];
>    Column[i].Caption:="Column  #"+IntToStr(i+1);
>    end;
> for i:=0 to 3 do begin
>    Items.Add.Caption:="Item  "+IntToStr(i+1);
>    for j:=0 to 1 do
>        Items.Item[i].SubItems.Add("Subitem  "+IntToStr(j+1))
>    end;
> end;
    FList := TList.Create;
> end;
>
> procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
>
>  Item: TListItem; State: TCustomDrawState; var DefaultDraw:
>  Boolean);
> begin
> // Что нужно добавить в усл. оператор, чтобы он сработал
> по
> // нажатию Button1 ? Т.е., нажав на кнопку, только тогда
> строка
> // рисовалась красным.
  FList.IndexOf( Item ) >= 0 then
     ListView1.Canvas.Brush.Color := clRed;
>
> end;

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


 
Yanis ©   (2007-08-05 19:14) [2]


> чтобы по нажатию на кнопку, строка окрашивалась красным?

IntToStr("0")
Вот эта строка по нажатию F9 окрасится красным :o)


 
{RASkov} ©   (2007-08-05 19:44) [3]

> [0] JetAPI ©   (05.08.07 18:23)
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> // Что должно быть здесь, чтобы, нажав на Button1,
> // сработало условие в OnCustomDrawItem?
> end;

procedure TForm1.Button1Click(Sender: TObject);
begin
// Что должно быть здесь, чтобы, нажав на Button1,
// сработало условие в OnCustomDrawItem?
......
 ListView1.Invalidate;
end;


 
MetalFan ©   (2007-08-05 19:56) [4]


> {RASkov} ©   (05.08.07 19:44) [3]

угу, не учол


 
{RASkov} ©   (2007-08-05 19:56) [5]

> сработало условие в OnCustomDrawItem

Тьфу.... я не так понял, показалось, что нужно просто вызвать istView1CustomDrawItem.....

Если это условие
 if Item.Index = 2 then
верно, Т.е. после нажатия определенной (Button1 например) кнопки, третья строка в листвью должна покраситься в красный, так?
Тогда можно так:

procedure TForm1.Button1Click(Sender: TObject);
begin
 Button1.Tag:=1;
 ListView1.Invalidate;
end;
...............
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
 if (Button1.Tag=1) and (Item.Index = 2) then ListView1.Canvas.Brush.Color := clRed;
end;

Правильно я понял или нет?
Собственно в [1] нечто тоже самое, только, имхо, можно быстрее сделать, помещая в Item.Data некую инфу, и соответственно
в OnCustomDrawItem не искать по списку а проверять DAta текущего Item"a..... Вроде понятно разъяснил... Вместо Button1.Tag используй Data


 
MetalFan ©   (2007-08-05 21:31) [6]


> {RASkov} ©   (05.08.07 19:56) [5]

из головы вылетело про Data!!! фтопку список... используй ListView.Selected.Data и Item.Data при отрисовке


 
JetAPI ©   (2007-08-05 23:48) [7]

Спасибо...  Спасибо...
Это то, что и хотел...

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Tag:=1;
ListView1.Invalidate;
end;

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
 Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if (Button1.Tag = 1) and (Item.Index = 2) then
                                                     ListView1.Canvas.Brush.Color := clRed;
end;


Сейчас с date  буду пробовать...

ЗЫ: Делфи очень нравится!


 
JetAPI ©   (2007-08-05 23:57) [8]

to Raskov
>>Правильно я понял или нет?
Да... Именно так... Все работает... Спасибо.


 
JetAPI ©   (2007-08-06 18:19) [9]

to Raskov
   and MetalFan

Ничего не получается... Не могу разобраться. Мне не ясен сам смысл...
Вот здесь, я так понимаю, мы храним событие "нажатие кнопки":

procedure TForm1.Button1Click(Sender: TObject);
begin
ListView1.Selected.Data;  // Вот здесь вот не понимаю...
ListView1.Invalidate;
end;

А здесь,..

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
 Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Item.Data = 2 then ListView1.Canvas.Brush.Color := clRed;
end;

должно, всё, проверятся... Но этого-то я не могу понять:
Как, и что присваевается в  ListView1.Selected.Data; ??

Вечером вчера сидел, и сейчас сижу, хелп перечитываю...
Понимаю, что без посторонней помощи не справлюсь...


 
{RASkov} ©   (2007-08-06 22:00) [10]

> [9] JetAPI ©   (06.08.07 18:19)
> ListView1.Selected.Data;  // Вот здесь вот не понимаю...

Дык тыж в Data ничего не пишешь....

В общем Data тип Pointer вот туда и будем писатель указатель на текущий итем или нил если он там уже есть, т.е. переключать (если не надо то убери приравнивание к nil):
procedure TForm1.Button1Click(Sender: TObject);
begin
 if ListView1.Selected.Data=ListView1.Selected then ListView1.Selected.Data:=nil
  else ListView1.Selected.Data:=ListView1.Selected;
 ListView1.Invalidate;
end;

А здесь смотрим если в Data есть указатель на "себя" то красим иначе нет
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
 Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
 if Item.Data=Item then ListView1.Canvas.Brush.Color := clRed;
end;


 
{RASkov} ©   (2007-08-06 22:06) [11]

> писатель указатель

:)
записывать в Data указатель на текущий Item т.е. на себя..


 
JetAPI ©   (2007-08-06 22:52) [12]

Сижу... Разбираюсь... но получается пока не очень.
Хотелось бы все-таки самому разобраться... Но главное, мне алгоритм и мысль понятна! Это и важно-то!

ЗЫ: Выдает ошибку во время исполнения. При нажатии на  Button1,
программа виснет... на этом операторе...

if ListView1.Selected.Data = ListView1.Selected then
    ListView1.Selected.Data := nil


 
MetalFan ©   (2007-08-06 23:01) [13]

а зачем писать указатель на себя?????
достаточно так:
procedure TForm1.Button1Click(Sender: TObject);
begin
if not assigned(ListView1.Selected) then exit; //профферочка
if ListView1.Selected.Data=Pointer(1) then ListView1.Selected.Data:=nil
   else ListView1.Selected.Data:=Pointer(1);
ListView1.Invalidate;
end;

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Item.Data=Pointer(1) then
  ListView1.Canvas.Brush.Color := clRed;
end;


 
JetAPI ©   (2007-08-06 23:07) [14]

to Raskov
Почти разобрался.... Сейчас пробую Индексно задать выделение строки.
Т.е. Item.Index = 1 или 2 или и3...

А вообщет здорово это исп. Data


 
{RASkov} ©   (2007-08-06 23:15) [15]

> [13] MetalFan ©   (06.08.07 23:01)
> а зачем писать указатель на себя?????

Да собственно разницы никакой.... хоть что угодно туда можно записать... в 4х байтах можно уместить всё :)
И оно нужно только для индикации - нужно ли строку красить или нет...


> [12] JetAPI ©   (06.08.07 22:52)
> ЗЫ: Выдает ошибку во время исполнения. При нажатии на  Button1,

Посмотри начало обработчика Button1Click в [13]

> procedure TForm1.Button1Click(Sender: TObject);
> begin
> if not assigned(ListView1.Selected) then exit; //профферочка
> .....


> [14] JetAPI ©   (06.08.07 23:07)

Извини... не понял :( Но, думаю, теперь сам разберешься :)


 
JetAPI ©   (2007-08-06 23:17) [16]

to Raskov, Ура!.. Спасибо!
Вы мне еще с прошлого раза помогаете с TListView...
Вот...

procedure TForm1.Button1Click(Sender: TObject);
begin
ListView1.Items[2].Data := ListView1.Items[2];
ListView1.Invalidate;
end;

Сейчас с  nil  разбираюсь...


 
{RASkov} ©   (2007-08-06 23:46) [17]

> [16] JetAPI ©   (06.08.07 23:17)
> ListView1.Items[2].Data := ListView1.Items[2];

Если в ЛистВью только одна строка краситься данным методом, а оно на то и идет(Items[2]), то незачем пользовать Data, а сделать именно так как в [5] и всех делов тут...

> Сейчас с  nil  разбираюсь...

А что с ним разбираться-то? )

Кстати... можно красить разными цветами, если воспользоваться тем, что предложил MetalFan
А точнее в Data записывать, например, индекс цвета.
Неудачный пример :(
Три кнопки с одним обработчиком OnClick
procedure TForm1.ButtonClick(Sender: TObject);
const Clr: array [0..2] of TColor = (clRed, clBlue, clYellow);
begin
 ListView1.Items[2].Data:=Pointer(Clr[(Sender as TButton).Tag]);
 ListView1.Invalidate;
end;

Tag у кнопок 0, 1 и 2.
и обработчик CustomDrawItem:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
 Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
 if Item.Data<>nil then ListView1.Canvas.Brush.Color := TColor(Item.Data);
end;



Страницы: 1 вся ветка

Текущий архив: 2007.09.02;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.031 c
2-1186930057
Miroving
2007-08-12 18:47
2007.09.02
Зависает Memo. Что делать?


15-1186427988
Kostafey
2007-08-06 23:19
2007.09.02
Установка кодировки


15-1185975787
lehich
2007-08-01 17:43
2007.09.02
подмена пакетов


15-1185581224
Nic
2007-07-28 04:07
2007.09.02
Задержки зарплаты


15-1186305705
Pasha L
2007-08-05 13:21
2007.09.02
что такое "Относительное изменение функции"? (математика)