Форум: "Начинающим";
Текущий архив: 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 записывать, например, индекс цвета.
Неудачный пример :(
Три кнопки с одним обработчиком OnClickprocedure 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