Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.033 c
4-1123505386
dima1234
2005-08-08 16:49
2005.10.02
Серийный номер диска


14-1124935499
Aero
2005-08-25 06:04
2005.10.02
Интернет-магазин. С чего начать?


1-1126537952
WonderfulDay
2005-09-12 19:12
2005.10.02
Hbitmap vs Tbitmap


1-1126107297
Виктор_В.С
2005-09-07 19:34
2005.10.02
Очистить String от символов конец строки


1-1126367091
lionts
2005-09-10 19:44
2005.10.02
Импорт перемненных из внешних модулей