Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Вызов процедуры


Автор: IamDreamer 29.4.2006, 15:43
Имеется процедура:
Код

procedure NewDir(Sender: TObject);
begin
If NewForm.Edit1.Text<>'' Then MkDir(Form1.DirectoryListBox1.Directory+'\'+NewForm.Edit1.Text)
  Else
    begin
      ShowMessage('Введите имя папки');
    end;
  NewForm.Close;
  Form1.DirectoryListBox1.Update;
  Form1.DirectoryListBox2.Update;
end;

В списке параметров кроме Sender'a ничего нет, но при вызове:
Код
NewDir;
 выдает ошибку о недостаточном кол-ве параметров. Как ее правильно вызвать? 

Автор: vood 29.4.2006, 16:33
задай ей sender:=application
а еще лучше напиши процедуру аналогичную данной только с параметром application:tapplication вместо  sendera 

Автор: IamDreamer 29.4.2006, 16:45
vood, а что вообще такое Sender/TApplication? 

Автор: Quadr0 29.4.2006, 16:52
...

Автор: IamDreamer 29.4.2006, 17:53
Цитата(vood @  29.4.2006,  16:33 Найти цитируемый пост)
application:tapplication

Это типа так:
Код

procedure NewDir(Application: TApplication);
begin
...
end;

Цитата(Quadr0 @  29.4.2006,  16:52 Найти цитируемый пост)
А зачем тебе вообще там Sender?

А как без него? Я пробовал так:
Код

procedure NewDir;
begin
...
end;
, но все равно писал про мало параметров.

 

Автор: Демо 29.4.2006, 18:01
Ну напиши NewDir(nil), раз не нужен параметр. 

Автор: Sunvas 29.4.2006, 18:20
Цитата(Демо @  29.4.2006,  18:01 Найти цитируемый пост)
Ну напиши NewDir(nil), раз не нужен параметр. 

или NewDir(self) в зависимости от того, как ты вызываешь процедуру 

Автор: IamDreamer 29.4.2006, 19:57
Я вызываю ее напрямую. В смысле это процедура создания новой папки. В моем случае это можно сделать несколькими способами (правой кнопкой мыши, там выбрать, простой кнопкой "Создать" и т.д.). Дык вот чтобы не писать одно и то же везде, я решил сделать процедуру, которой для работы не надо никаких параметров, они ей не нужны.  

Автор: vood 30.4.2006, 00:20
Так это событие onclick popupmenu 
А нафиг его вызывать оно само сработает smile  

Автор: Yanis 30.4.2006, 00:21
Цитата(IamDreamer @  29.4.2006,  19:57 Найти цитируемый пост)
которой для работы не надо никаких параметров, они ей не нужны

А зачем тогда такой заголовок:
Код

procedure NewDir(Sender: TObject);
 если никакие параметры не требяются?

P. S. может всё таки сделать процедуру с параметром и в нём передавать имя создаваемой папки? Типа:
Код

procedure NewDir(Dir: string);

 smile  

Автор: vood 30.4.2006, 00:22
События ненужно вызывать как функции они срабатывают сами
Или утебя на форме нет popupmenu

Добавлено @ 00:23 
Yanis,это событие  компонента 

Автор: Yanis 30.4.2006, 00:33
Цитата(vood @  30.4.2006,  00:22 Найти цитируемый пост)
Yanis,это событие   

А, ну теперь ясно. 

IamDreamer
Вообще странное объявление метода класса/объекта. Если уж на то оно пошло то должно быть как минимум таким:
Код

{ ... }
type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
    procedure NewDir(Sender: TObject);
  end;
{ ... }
procedure TForm1.NewDir(Sender: TObject);
begin
  If NewForm.Edit1.Text<>'' Then MkDir(Form1.DirectoryListBox1.Directory+'\'+NewForm.Edit1.Text)
  Else
    begin
      ShowMessage('Введите имя папки');
    end;
  NewForm.Close;
  Form1.DirectoryListBox1.Update;
  Form1.DirectoryListBox2.Update;
end;

Вот это уже похоже на метод.  

Автор: vood 30.4.2006, 00:37
Yanis, а только ли TApplication может быть Sender? 

Автор: Демо 30.4.2006, 01:04
Цитата(vood @  30.4.2006,  00:37 Найти цитируемый пост)
а только ли TApplication может быть Sender? 


Sender - это любой объект.
Предназначен для использования в обработчиках событий для идентификации объекта класса.

например:

Код

type

  TForm1 = class(TForm)
     Button2: TButton;
     procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure OnMyEvent(Sender: TObject);
  end;


  TMyEvent=procedure(Sender: TObject) of object;

  TMyClass=class
  private
     FName: String;
     FEvent: TMyEvent;
     procedure MyEvent;
  public
     constructor Create(Name: String);
     procedure Test;

     property Name: String read FName write FName;
     property OnEvent: TMyEvent read FEvent write FEvent;
  end;

implementation


procedure TForm1.OnMyEvent(Sender: TObject);
begin
  ShowMessage((Sender as TMyClass).Name);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  m1,m2: TMyClass;
begin
  m1 := TMyClass.Create('Name1');
  m2 := TMyClass.Create('Name2');

  m1.OnEvent := OnMyEvent;
  m2.OnEvent := OnMyEvent;
  m1.Test;
  m2.Test;
  m1.Free;
  m2.Free;

end;

{ TMyClass }

constructor TMyClass.Create(Name: String);
begin
  FName := Name;
end;

procedure TMyClass.MyEvent;
begin
  if Assigned(FEvent) then FEvent(Self);
end;

procedure TMyClass.Test;
begin
  MyEvent;
end;

 

Автор: Тьма 30.4.2006, 01:17
отвечу за яниса

нет, не только
Sender - это обьект, который вызвал событие, т.е. в процедуте procedure TForm1.Button1Click(Sender: TObject) sender это Button1. если ты используешь один обработчик события на несколько контролов, то Sender это будет контрол, который вызваль это событие
например
Код

procedure TForm1.ManyButtonsClick(Sender: TObject);
begin
  if sender = button1 
     then begin
             end;
  if sender = button2 
     then begin
             end;
....
  if sender = ButtonN
     then begin
             end;
end;


вырезка из делфовой справки
Цитата

The Sender parameter is the object whose event handler is called.  For example,.with the OnClick event of a button, the Sender parameter is the button component that is clicked.
 

ой ой ой долго писал smile 
 

Автор: vood 30.4.2006, 05:03
Тьма значит Sender это обьект событие которого обрабатываеться? 

Автор: Yanis 30.4.2006, 07:47
Демо, Тьма
Молодцы ;)

Цитата(Тьма @  30.4.2006,  01:17 Найти цитируемый пост)
отвечу за яниса
 Респект.

Добавлено @ 07:54 
Цитата(vood @  30.4.2006,  05:03 Найти цитируемый пост)
Тьма значит Sender это обьект событие которого обрабатываеться?  

Отвечу за Тьму smile Да. 

Автор: IamDreamer 30.4.2006, 08:50
Цитата(vood @  30.4.2006,  00:22 Найти цитируемый пост)
События ненужно вызывать как функции они срабатывают сами

Как это срабатывают сами? Допустим, необходимо при нажатии на кнопку "Создать папку" показать диалог создания папки. Получается, в событии OnClick кнопки нужно вписать:
Код

procedure NewDir(Sender: TObject);
begin
If NewForm.Edit1.Text<>'' Then MkDir(Form1.DirectoryListBox1.Directory+'\'+NewForm.Edit1.Text)
  Else
    begin
      ShowMessage('Введите имя папки');
    end;
  NewForm.Close;
  Form1.DirectoryListBox1.Update;
  Form1.DirectoryListBox2.Update;
end;
 
Но у меня эта процедура уже есть. Поэтому, в событии OnClick вписываю вместо целого кода процедуры ее вызов:
Код

procedure Button1Click(Sender: TObject);
begin
NewDir;
end;

Как это она сама вызовется?

Цитата(vood @  30.4.2006,  00:22 Найти цитируемый пост)
Или утебя на форме нет popupmenu

И popupmenu тож есть. 

Цитата(Yanis @  30.4.2006,  00:21 Найти цитируемый пост)
может всё таки сделать процедуру с параметром и в нём передавать имя создаваемой папки?

Можно попробовать.  

Автор: Joss 30.4.2006, 10:39
Процедура NewDir у тебя имеет параметр типа TObject. Почему ты ее вызываешь без параметров? Вызывай так:
Код


procedure Button1Click(Sender: TObject);
begin
   NewDir(Sender);
end;

 

Автор: vood 30.4.2006, 14:08
Напиши и немучайся
Код

procedure Button1Click(Sender: TObject);
begin
If NewForm.Edit1.Text<>'' Then MkDir(Form1.DirectoryListBox1.Directory+'\'+NewForm.Edit1.Text)
  Else
    begin
      ShowMessage('Введите имя папки');
    end;
  NewForm.Close;
  Form1.DirectoryListBox1.Update;
  Form1.DirectoryListBox2.Update;

end;



Добавлено @ 14:09 
ЗЫ 
Yanis, спасибо 

Автор: IamDreamer 1.5.2006, 10:40
vood, дык это че, везде придется писать? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)