![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите, в чем проблема? [D7, WinXP]
kyn66 © (2005-08-23 18:55:00)На форме есть ряд панелек, которые служат в качестве кнопки.Когда кликаю мышкой по ним, все нормально отрабатывает
procedure TMainFrm.Panel1Click(Sender: TObject);
begin
with (Sender as TPanel) do
begin
if BorderStyle = bsNone then
begin
BorderStyle := bsSingle;
Font.Style := [fsBold];
// ParseCaption((Sender as TPanel).Caption);
end
else
begin
BorderStyle := bsNone;
Font.Style := [];
end;
end;
end;
Когда-же принудительно хочу ее кликнуть - ошибка, что не так?
procedure TMainFrm.Button1Click(Sender: TObject);
begin
TPanel(FindComponent('Panel' + (Edit1.Text))).OnClick(Sender);
Edit1.Text := '';
Edit1.SetFocus;
end;
kyn66 (2005-08-24 15:20:00) [1]Сейчас попробую, но раз уж законнектился, хочу показать, что из двух ниже приведенных вариантов первый отрабатывает правильно, а на втором - Acces violation
1)
if (Sender as TStringGrid).Cells[ACol, ARow] <> '' then
begin
Panel1Click(FindComponent('Panel' + (Sender as TStringGrid).Cells[ACol, ARow]));
(Sender as TStringGrid).Cells[ACol, ARow] := '';
end;
2)
with (Sender as TStringGrid) do
if Cells[ACol, ARow] <> '' then
begin
Panel1Click(FindComponent('Panel' + Cells[ACol, ARow]));
Cells[ACol, ARow] := '';
end;
Вероятно действительно здесь замешан With
И еще, а в моей ситуации есть принципиальная разница для клика по StringGrid на какое событие вешать, на StringGrid1SelectCellили StringGrid3MouseDown
begin...end (2005-08-24 14:17:00) [2]> kyn66 © (24.08.05 13:04) [4]
Дело вот в чём. Метод FindComponent есть у любогонаследника класса TComponent, в том числе и у TStringGrid. И в приведённом коде вызывается метод FindComponent экземпляра StringGrid1(Вы явно указали на это конструкцией with). Этот метод, конечно, ищет компонент среди списка StringGrid1.Components. Однако родительским компонентом для искомой панели является, вероятно, форма MainFrm. Поэтому и искать надо среди еёкомпонентов, т.е. вызывать еёметод FindComponent. Чтобы сделать это, замените FindComponent на Self.FindComponent.
kyn66 (2005-08-24 13:04:00) [3]Рано обрадовался. Похожая ситуация, тока теперь я хочу вызвать Panel1Clickприклике по ячейке StringGrid, почему Sender теряется? Опять ошибку выдает..8-(
procedure TMainFrm.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
C, R: Longint;
begin
with (Sender as TStringGrid) do
begin
MouseToCell(X, Y, C, R);
if (Cells[C, R] <> '') then
begin
Panel1Click(FindComponent('Panel' + Cells[C, R]));
Cells[C, R] := '';
end;
end;
end;
kyn66 (2005-08-23 19:24:00) [4]Огромнейшее Вам спасибо, действительно все работает! Да здравствуют Мастера !!!
begin...end (2005-08-23 19:06:00) [5]Ошибка, вероятно, вызвана тем, что при "принудительном" вызове OnClick этому обработчику в качестве параметра передаётся кнопка Button1 -- ведь именно она является sender'ом внутри обработчика Button1Click. А внутри OnClick панели есть попытка приведения типа sender'а к TPanel. Класс TPanel не является наследником TButton -- отсюда и ошибка.
Я бы построил код примерно так:
procedure TMainFrm.Button1Click(Sender: TObject);
var
C: TComponent;
begin
C := FindComponent('Panel' + (Edit1.Text));
if Assigned(C) and (C is TPanel) then
begin
TPanel(C).OnClick(C);
Edit1.Text := '';
Edit1.SetFocus
end
end
Юрий Зотов (2005-08-23 19:02:00) [6]Sender в Button1Click - это кнопка . Вы передаете ее в Panel1Click - а там написано: Sender as TPanel . Вот и ошибка.
procedure TMainFrm.Button1Click(Sender: TObject);
begin
Panel1Click(FindComponent('Panel' + Edit1.Text));
Edit1.Text := '';
Edit1.SetFocus;
end;