Главная страница
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.056 c
1-1126605493
Laymer
2005-09-13 13:58
2005.10.02
URL ы


1-1126003954
simpson
2005-09-06 14:52
2005.10.02
Динамический массив - константа


1-1126429711
Цукор 5
2005-09-11 13:08
2005.10.02
вызов DLL


1-1126683715
vladimirov
2005-09-14 11:41
2005.10.02
испанские символы


14-1126299956
saNat
2005-09-10 01:05
2005.10.02
Рассказ МЕТРО