Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подскажите, в чем проблема? [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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо