Текущий архив: 2005.10.02;
Скачать: CL | DM;
Вниз
Подскажите, в чем проблема? Найти похожие ветки
← →
kyn66 © (2005-08-23 18:55) [0]На форме есть ряд панелек, которые служат в качестве кнопки.Когда кликаю мышкой по ним, все нормально отрабатывает
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;
← →
Юрий Зотов © (2005-08-23 19:02) [1]Sender в Button1Click - это кнопка. Вы передаете ее в Panel1Click - а там написано: Sender as TPanel. Вот и ошибка.
procedure TMainFrm.Button1Click(Sender: TObject);
begin
Panel1Click(FindComponent("Panel" + Edit1.Text));
Edit1.Text := "";
Edit1.SetFocus;
end;
← →
begin...end © (2005-08-23 19:06) [2]Ошибка, вероятно, вызвана тем, что при "принудительном" вызове 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
← →
kyn66 © (2005-08-23 19:24) [3]Огромнейшее Вам спасибо, действительно все работает! Да здравствуют Мастера !!!
← →
kyn66 © (2005-08-24 13:04) [4]Рано обрадовался. Похожая ситуация, тока теперь я хочу вызвать 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;
← →
begin...end © (2005-08-24 14:17) [5]> kyn66 © (24.08.05 13:04) [4]
Дело вот в чём. Метод FindComponent есть у любого наследника класса TComponent, в том числе и у TStringGrid. И в приведённом коде вызывается метод FindComponent экземпляра StringGrid1 (Вы явно указали на это конструкцией with). Этот метод, конечно, ищет компонент среди списка StringGrid1.Components. Однако родительским компонентом для искомой панели является, вероятно, форма MainFrm. Поэтому и искать надо среди её компонентов, т.е. вызывать её метод FindComponent. Чтобы сделать это, замените FindComponent на Self.FindComponent.
← →
kyn66 © (2005-08-24 15:20) [6]Сейчас попробую, но раз уж законнектился, хочу показать, что из двух ниже приведенных вариантов первый отрабатывает правильно, а на втором - 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
Страницы: 1 вся ветка
Текущий архив: 2005.10.02;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.056 c