Форум: "Прочее";
Текущий архив: 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
Ибо тут никаких неясностей нет - все свойства и методы явно принадлежат объекту TEdit.Create(Self) и весьма компактны (можно весь блок with глазом окинуть)... И переменная i "очевидно" переменная, а не свойство или метод TEdit... :)
begin
Parent := Self;
SetBounds(20, 30*i, 150, 25);
Text := "Edit" + IntToStr(i);
OnClick := OnEditClick;
end;
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2011.09.04;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c