Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2011, 09:58   #1
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию Область видимости

Здравствуйте. Когда пишу подпрограммы, то возникает небольшие неудобства, связаны они с тем, что если я использую оператор with в подпрограмме и есть поле, имя которого совпадает с формальным параметром подпрограммы, то как мне обратиться к параметру. Конечно, можно использывать другое имя параметра, но я придерживаюсь одних и тех же понятных имен.
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 22.09.2011, 10:02   #2
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

отказаться от with?
_Engine_ вне форума Ответить с цитированием
Старый 22.09.2011, 10:03   #3
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Цитата:
Сообщение от _Engine_ Посмотреть сообщение
отказаться от with?
Можно отказаться от with, можно поменять имя параметра или поля. Но это не выход. Может есть др. способы?
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 22.09.2011, 10:12   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Приведите пример...
Код:
with object do
begin
{
Тут можно обращаться с метода/свойствам/событиям Objdct без указания ссылки на него т.е. не так:
object.<metod>.DoSmth
а сразу так <metod>.DoSmth
}
end;
Так с чем сложность то?
Человек_Борща вне форума Ответить с цитированием
Старый 22.09.2011, 10:16   #5
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Код:
procedure P(Value: Integer);
type
  TRecord = record
    Value: Integer;
  end;
var
  R: TRecord;
begin
  with R do
  begin
    Value := Value;
  end;
end;
Можно конечно написать R.Value, но у меня там большие структуры и это не очень красиво смотреться будет.
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 22.09.2011, 10:39   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В пределах предложения With, Delphi пробует решить неполные ссылки, смотря сначала на адресат стоящий после With. Остается только поменять имя параметра или поля - других решений нет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.09.2011, 11:04   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а по моему, абсолютно логично, если имя параметра будет ОТЛИЧАТЬСЯ от имён полей..

например, так:
Цитата:
Код:
procedure P(pValue: Integer);
да и не только компилятору, но и любому читающему код, станет понятно, что там Value или pValue.
А на понятность ("я придерживаюсь одних и тех же понятных имен. ") это повлияет только в лучшую сторону!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.09.2011, 14:49   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Замечу, что параметры обычно называют через "A": AValue.

Ещё замечу, что with - далеко не самый удачный оператор в Pascal.

Вместо with лучше использовать локальную переменную.

Но вот это:
Цитата:
у меня там большие структуры и это не очень красиво смотреться будет
Может говорить о неверно выбранном подходе. Получается, что ваши структуры - это объект. И операции, которые должны, по идее, выполняться самим объектом, у вас выполняются внешним (по отношению к структуре) кодом.

Вероятно, наиболее правильное решение - запись с методами (где вся работа с полями выполнятся самой записью). Если же это невозможно (старая Delphi), то стоит рассмотреть вариант использования полноценного класса.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 23.09.2011, 15:39   #9
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Как вариант:

Код:
procedure GetProc(A,B,X,Y: Integer);
var
  MyRecord : packed record
   A : integer;
   B : integer; 
   C : integer;
   D : integer; 
  end;

begin
  with MyRecord do
  begin
    C := X;
    D := Y;
  end;
 MyRecord.A := A;
 MyRecord.B := B;
end;
Дублирующиеся поля "громезной структуры" вне wiht, недублирующиеся внутри.
Я использую именно такой способ, например при хранении таких полей как FileName Handle и.т.п
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 23.09.2011, 22:39   #10
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Цитата:
Замечу, что параметры обычно называют через "A": AValue
Никогда не слышал об этом. Буква А, это сокращение какого английского слова?

Цитата:
Ещё замечу, что with - далеко не самый удачный оператор в Pascal.
Согласен, источник многих ошибок, если точно не знать методов или быть невнимательным

Цитата:
Может говорить о неверно выбранном подходе. Получается, что ваши структуры - это объект. И операции, которые должны, по идее, выполняться самим объектом, у вас выполняются внешним (по отношению к структуре) кодом
Нет, не говорит, критична производительность, хотя я с вами соглашусь, но не в плане производительности. Невозможно оценить правильность подхода, не зная ситуацию. Не всегда нужно использовать ООП.

Цитата:
Вероятно, наиболее правильное решение - запись с методами (где вся работа с полями выполнятся самой записью). Если же это невозможно (старая Delphi), то стоит рассмотреть вариант использования полноценного класса.
Не, мне проще отказаться от with или использовать полное или др. имя
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Область видимости переменной bondik Общие вопросы .NET 4 04.10.2010 12:18
область видимости классов sashonk JavaScript, Ajax 1 15.09.2010 11:19
область видимости Dimarik Общие вопросы .NET 5 21.02.2010 21:32
область видимости переменных. С++ Prestigio Помощь студентам 10 07.07.2008 15:55
область видимости ? artem779 Общие вопросы Delphi 3 14.09.2007 09:34