Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.09.04;
Скачать: CL | DM;

Вниз

обращение к объекту   Найти похожие ветки 

 
young_dev   (2011-05-11 11:17) [0]

Есть ли существенная разница между нижеприведенными вариантами кода. Много где встречаю код, как во втором варианте. В чем плюсы?


procedure TTestForm.Edit1Change(Sender: TObject);
begin

 if Edit1.Text = "" then
   // ...

end;

procedure TTestForm.Edit1Change(Sender: TObject);
begin

 with Sender as TEdit do
   if Text = "" then
     // ...

end;


 
clickmaker ©   (2011-05-11 11:21) [1]

> как во втором варианте. В чем плюсы?

несколько контролов - один обработчик


 
Ega23 ©   (2011-05-11 11:22) [2]

Есть разница. Вот смотри:

unit Unit11;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm11 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   procedure OnEditClick(Sender: TObject);
 public
   { Public declarations }
 end;

var
 Form11: TForm11;

implementation

{$R *.dfm}

procedure TForm11.FormCreate(Sender: TObject);
var
 i: Integer;
begin
 for i := 1 to 10 do
   with TEdit.Create(Self) do
   begin
     Parent := Self;
     SetBounds(20, 30*i, 150, 25);
     Text := "Edit" + IntToStr(i);
     OnClick := OnEditClick;
   end;

end;

procedure TForm11.OnEditClick(Sender: TObject);
begin
 if (Sender is TEdit) then
   ShowMessage(TEdit(Sender).Text);
end;

end.


 
картман ©   (2011-05-11 19:43) [3]


> несколько контролов - один обработчик

а разницы нет


 
asail ©   (2011-05-11 19:50) [4]


> young_dev   (11.05.11 11:17)

Обрати внимание у
> Ega23 ©   (11.05.11 11:22) [2]

1. "with" в данном случае - лишний геморой. Лучше без него.
2. Наличие проверки на "Sender is TEdit". А то, может, кто нибудь вызовет OnEditClick(nil) или что-то похожее (например, присвоит этот обработчик не TEdit"у) и словишь AV...


 
Ega23 ©   (2011-05-12 07:58) [5]


> 1. "with" в данном случае - лишний геморой. Лучше без него.

Обоснуй.


 
Ega23 ©   (2011-05-12 08:00) [6]


>  А то, может, кто нибудь вызовет OnEditClick(nil)

Кстати будет очень прикольно. Вывалится Message с пустой строкой.


 
OW ©   (2011-05-12 08:39) [7]

а так не вывалиться,
хоть у TButton и нет свойства Text, покажется его Caption :)
(т.к. все упрется в call TControl.GetText)

procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
for i := 1 to 10 do
  with TEdit.Create(Self) do
  begin
    Parent := Self;
    SetBounds(20, 30*i, 150, 25);
    Text := "Edit" + IntToStr(i);
    OnClick := OnEditClick;
  end;
  with TButton.Create(Self) do
  begin
    Parent := Self;
    SetBounds(320, 30*i, 150, 25);
    Caption := "btn" + IntToStr(i);
    OnClick := OnEditClick;
  end;
end;

procedure TForm1.OnEditClick(Sender: TObject);
begin
// if (Sender is TEdit) then
 mmo1.Lines.Add (TEdit(Sender).Text);  
end;


 
Ega23 ©   (2011-05-12 08:51) [8]


> хоть у TButton и нет свойства Text, покажется его Caption


Ну да. Потому что
TControl = class(TComponent)
  ....
protected
 property Caption: TCaption read GetText write SetText stored IsCaptionStored;


 
Anatoly Podgoretsky ©   (2011-05-12 09:37) [9]

> Ega23  (12.05.2011 08:00:06)  [6]

Уже вызывали, и не только у нас.


 
Игорь Шевченко ©   (2011-05-12 10:42) [10]


> 1. "with" в данном случае - лишний геморой. Лучше без него.


Без него никак


 
TUser ©   (2011-05-12 12:05) [11]

Имхо, если этот метод используется как обработчик некоего события, кроме изменения содержимого эдита, то он не должен называться Edit1Change.


 
Ega23 ©   (2011-05-12 12:06) [12]


>  он не должен называться Edit1Change.


Это уже совсем из другой оперы


 
asail ©   (2011-05-12 12:52) [13]


> Ega23 ©   (12.05.11 07:58) [5]

> Игорь Шевченко ©   (12.05.11 10:42) [10]

Я не очень точно выразился... Я не про "with", в коде Ega23 [2], а про "with" в коде топикстартера. Вот про это:
with Sender as TEdit do
  if Text = "" then

Лично у меня к визу очень отрицательное отношение - зачастую сильно затрудняет как читабельность кода, так и его дебагинг (по крайней мере в Д6). Но, если без экстремизма, то ради бога...


 
asail ©   (2011-05-12 14:05) [14]


> Ega23 ©   (12.05.11 08:00) [6]

> Вывалится Message с пустой строкой.

А вот про это я не знал. Ожидал AV, а тут... Забавно.


 
Игорь Шевченко ©   (2011-05-12 14:41) [15]

asail ©   (12.05.11 12:52) [13]

То есть, вместо with Sender as TEdit надо писать
var
 Edit: TEdit;
begin
 Edit := Sender as TEdit;
и потом работать с этой переменной, я тебя верно понял ?


 
Kerk ©   (2011-05-12 15:01) [16]

Ненавижу with. Индусский код ими изобилует.


 
asail ©   (2011-05-12 15:05) [17]


> Игорь Шевченко ©   (12.05.11 14:41) [15]

> я тебя верно понял ?

Нет. Не верно. В данном конкретном случае, лично я написал бы просто:
TEdit(Sender).Text ...

Но, это если не много обращений к объекту... А если много, то мона и локальную переменную ввести.

А, вот в случае [2], я бы, наверное тоже with замутил:
with TEdit.Create(Self) do
  begin
    Parent := Self;
    SetBounds(20, 30*i, 150, 25);
    Text := "Edit" + IntToStr(i);
    OnClick := OnEditClick;
  end;
Ибо тут никаких неясностей нет - все свойства и методы явно принадлежат объекту TEdit.Create(Self) и весьма компактны (можно весь блок with глазом окинуть)... И переменная i "очевидно" переменная, а не свойство или метод TEdit... :)



Страницы: 1 вся ветка

Текущий архив: 2011.09.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.009 c
1-1265789474
bilov
2010-02-10 11:11
2011.09.04
Приложение к среде Delphi - закладки


15-1291811465
12
2010-12-08 15:31
2011.09.04
Шахматы. Что за натура у людей? Не сдаваться до последнего..


4-1250254612
maxodus
2009-08-14 16:56
2011.09.04
Запустить процесс от имени системной учетной записи


15-1305614438
Kerk
2011-05-17 10:40
2011.09.04
Вторничная задачка :)


2-1305913737
TarenoKostanay
2011-05-20 21:48
2011.09.04
Вставка стороннего приложения в окно программы