Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.038 c
15-1186089042
Модуль
2007-08-03 01:10
2007.09.02
Как отловить нажатия на кнопки вверх, вниз, на панели?


2-1186407629
Василий
2007-08-06 17:40
2007.09.02
MainMenu в ToolBar e. А нет HotKeys. :(


4-1173440828
dzuev
2007-03-09 14:47
2007.09.02
usb - порт и принтер


2-1186737234
Новичек
2007-08-10 13:13
2007.09.02
Массив объектов.


8-1164745849
Oburec
2006-11-28 23:30
2007.09.02
Как отобразить графику рисуемую c OpenGL на простой форме)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский