Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.09.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.003 c
2-1305788693
apic
2011-05-19 11:04
2011.09.04
Дней360


15-1303279486
Inovet
2011-04-20 10:04
2011.09.04
Фильм "Generation П" кто-нибудь уже видел?


4-1248422295
Dmitriy
2009-07-24 11:58
2011.09.04
как определить соединение


15-1305311860
Kerk
2011-05-13 22:37
2011.09.04
Паттерны проектирования


1-1258480783
STD
2009-11-17 20:59
2011.09.04
TVirtualStringTree ScrollBar





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский