powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Улучшение оператора with: голосование и обсуждения
100 сообщений из 100, показаны все 4 страниц
Улучшение оператора with: голосование и обсуждения
    #39989254
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: "Стартовое" сообщение (сместилось после переноса):
DmSer
Предлагаю вынести обсуждение улучшений оператора with в данную ветку.
Ранее была создана задача, где предлагается ввести алиасы в оператор with.
Вот ссылка на неё: https://quality.embarcadero.com/browse/RSP-27468

Если Вам нравится идея и Вы ещё не принимали участие в голосовании, то обязательно проголосуйте, Ваш голос имеет значение!

Благодаря алиасам можно исправить фундаментальные проблемы оператора with, из-за которых Марко Канту уже который год грозится выпилить его из Delphi.
Одно из предложений было оформлять алиасы с помощью ключевого слова "as". В этом случае код может выглядеть таким образом:
Код: pascal
1.
2.
3.
4.
5.
6.
with MyArrayOfRecords[i] as r, GetMyObject() as o do
begin
  r.IntVal := 1;
  r.StrVal := 'Hello';
  o.MyRec := r;
end;



_Vasilisk_
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TMyThread.SetThreadStateInfo(const Value: string);
begin
StringProtectSection.Enter; // Входим в режим защиты
FThreadStateInfo := Value;
StringProtectSection.Leave; // Выходим из режима защиты
end;
try finally всегда. Даже если внутри одна строчка. Ну и использование одной глобальной критической секции на все - это огромный антипаттерн



try..finally ради одной безобидной строчки выглядит как-то нерационально. Какой в ней смысл? Кто такое правило ввёл?

Одну строчку без try..finally ещё нормально, а вот 2 строчки - уже лажа получается. Нужно предложить эмбаркадере ещё один вариант использования оператора with:

Код: pascal
1.
2.
3.
4.
with section CS do
begin

end;



это тупо синтаксический сахар над try..finally.

либо может более универсальное:

Код: pascal
1.
2.
3.
4.
with syncobject CS do
begin

end;



в таком случае пусть компилятор будет вспоминать, у кого Enter/Leave, Lock/Unlock, wait/release и т.д.

получится на 2 строчки короче, нежели с try..finally:

Код: pascal
1.
2.
3.
4.
5.
6.
CS.Enter;
try

finally
  CS.Leave;
end;



Как считаете, смысл есть?
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989409
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

экономия на спичках, имхо
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989414
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
With - зло!

Лучше бы конструкцию

Код: pascal
1.
2.
3.
4.
try
except
finally
end;



замутили.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989416
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Как считаете, смысл есть?

1. Только если будет возможность подключать свои syncobjects. Например, через интерфейс.
2. Лучше не with, а какое-нибудь другое ключевое слово. Тот же using.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989417
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
With - зло!

with - отличная штука, которой не хватает единственной маленькой доработки для того, чтобы быть просто великолепной.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989418
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Какой?
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989428
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
with Expr do
  .Name := Value;
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989437
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С вложенными точками, надо полагать?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989441
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Код: pascal
1.
2.
with Expr do
  .Name := Value;



Но не решит проблему для нескольких переменных:
Код: pascal
1.
2.
with Expr1, Expr1 do
  .Name := Value;
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989450
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
За улучшение with можно голосовать: https://quality.embarcadero.com/browse/RSP-27468
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989456
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer> Но не решит проблему для нескольких переменных:

Да, если вложенные ещё можно как-то (уродливо, ИМХО)
разрешить, то с несколькими вроде бы совсем никак.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989461
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Но не решит проблему для нескольких переменных:

Для нескольких переменных решат алиасы:

Код: pascal
1.
2.
with Expr1 e1, Expr1 e2 do
  e1.Name := e2.Value;


Но я не уверен, что это действительно нужно.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989475
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
with - отличная штука

+1

Kazantsev Alexey
За улучшение with можно голосовать: https://quality.embarcadero.com/browse/RSP-27468

done

понимаю, что холивар. Только какой смысл в алиасах? имхо, красота with в краткости и отсутствии необходимости писать еще что-то слева от свойства/метода. Вряд ли в него будешь заключать портянки кода на 2-3 экрана

зы. на скруле всегда так, как только тема исчерпывается, начинается оффтоп. Ура, Рустему
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989476
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
DmSer
Но не решит проблему для нескольких переменных:

Для нескольких переменных решат алиасы:

Код: pascal
1.
2.
with Expr1 e1, Expr1 e2 do
  e1.Name := e2.Value;


Но я не уверен, что это действительно нужно.


Первые пару дней 10 человек проголосовали, затем задача ушла из топа. Думаю, голосов было бы намного больше.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989477
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док> Только какой смысл в алиасах?

В зависимости от ситуации, смыслов у алиаса может быть более одного.
В SQL кроме красоты/краткости это ещё и правильное разрешение имён.

> Вряд ли в него будешь заключать портянки кода на 2-3 экрана

Ты недооцениваешь умельцев.

> начинается оффтоп. Ура, Рустему

Опять я виноват? Почищу позже (если не забуду).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989480
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Для нескольких переменных решат алиасы:

Код: pascal
1.
2.
with Expr1 e1, Expr1 e2 do
  e1.Name := e2.Value;


Но я не уверен, что это действительно нужно.

Это почти то же самое что и
Код: pascal
1.
2.
3.
  var e1:=Expr1; 
  var e2:=Expr2;
  e1.Name := e2.Value;
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989489
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
Только какой смысл в алиасах?

Одноимённые члены резолвить без псевдонимов не получится.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989493
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Это почти то же самое что и
Код: pascal
1.
2.
3.
  var e1:=Expr1; 
  var e2:=Expr2;
  e1.Name := e2.Value;


А так работает?
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989496
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Да. С 10.3 начиная.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989499
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, как появился инлайн var так надобность в with практически отпала.

По крайней мере мне такие случаи почти не попадаются.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989502
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю вынести обсуждение улучшений оператора with в данную ветку.
Ранее была создана задача, где предлагается ввести алиасы в оператор with.
Вот ссылка на неё: https://quality.embarcadero.com/browse/RSP-27468

Если Вам нравится идея и Вы ещё не принимали участие в голосовании, то обязательно проголосуйте, Ваш голос имеет значение!

Благодаря алиасам можно исправить фундаментальные проблемы оператора with, из-за которых Марко Канту уже который год грозится выпилить его из Delphi.
Одно из предложений было оформлять алиасы с помощью ключевого слова "as". В этом случае код может выглядеть таким образом:
Код: pascal
1.
2.
3.
4.
5.
6.
with MyArrayOfRecords[i] as r, GetMyObject() as o do
begin
  r.IntVal := 1;
  r.StrVal := 'Hello';
  o.MyRec := r;
end;
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989503
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все проблемы с With решаются игнорированием правил старика Вирта и выдачей ошибки (или
хотя бы предупреждения) если идентификатор в коде ресольвится более чем в один объект
вместо примитивного "молча возьмём тот, что ближе" ака "кто последний, тот и папка".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989504
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё я предлагаю рассмотреть идею нового варианта использования оператора with для работы с примитивами синхронизации:

Код: pascal
1.
2.
3.
4.
with syncobject CS do
begin
   SomeCode;
end;



CS - это критическая секция, хотя можно пофантазировать и насчёт других объектов синхронизации (мьютексы, эвенты, спинлоки, TThreadList, объекты, поддерживающие общий интерфейс для синхронизации)

получится на 2 строчки короче, нежели с try..finally:

Код: pascal
1.
2.
3.
4.
5.
6.
CS.Enter;
try
  SomeCode;
finally
  CS.Leave;
end;



Вот коробит меня использовать try..finally для защиты всего лишь одной строки кода. А в случае with было бы нагляднее (по моему мнению).
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989507
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

А обработка ошибок у тебя в таком варианте где?
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989510
Не поддерживаю. Язык должен быть понятным. А это уже лапша.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989513
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Не поддерживаю. Язык должен быть понятным.
бгы-г!
Код: python
1.
^[-.\w]+@(?:[a-z\d][-a-z\d]+\.)+[a-z]{2,6}$
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989515
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Это почти то же самое что и
Код: pascal
1.
2.
3.
  var e1:=Expr1; 
  var e2:=Expr2;
  e1.Name := e2.Value;


Во-первых это копирование. Во-вторых, с записями такая конструкция не прокатит.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989522
Kazantsev Alexey,

Разве когда он скомпилирует код, ассемблерный лист не будет идентичен?
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989525
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

помогите, пожалуйста исправить такую программу:

cat "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'

- не печатает
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989527
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Потому и "почти что".
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989532
Мимопроходящий,

Ну регулярные выражения Это Святое!
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989545
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
DmSer,

А обработка ошибок у тебя в таком варианте где?


Тот же try..finally, только за ширмой.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989547
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

В итоге еще длиней чем сразу через try сделать выйдет.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989551
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
DmSer,

В итоге еще длиней чем сразу через try сделать выйдет.


Наоборот, короче на 2 строки.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989556
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Все проблемы с With решаются игнорированием правил старика Вирта и выдачей ошибки (или хотя бы предупреждения) если идентификатор в коде ресольвится более чем в один объект
вместо примитивного "молча возьмём тот, что ближе" ака "кто последний, тот и папка".
Больше всего в этой сентенции мне нравится слово "все". Особо радостно будет код VCL перекомпиливать, где "последний папка" встречается чуть реже чем везде.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989557
DmSer,

Представь сколько символов можно было сэкономить на then - begin используя простую { Притом прям на строке с if условием.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989563
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
DmSer,

Представь сколько символов можно было сэкономить на then - begin используя простую { Притом прям на строке с if условием.


Представляю. С помощью фигурных скобок очень многие вещи получаются компактнее. Иногда завидую.
С другой стороны c# всё продолжают и продолжают уродовать. С begin..end бы они так не разбежались!
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989571
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, нужны нормальные с++ ссылки (фактически, алиасы).
With - не нужен.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989582
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъWith - не нуженНе умеешь готовить ))

Достаточно чтобы отладчик поля прорисовывал, ну и иногда какой-нибудь "WithSelf" не помешал бы.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989585
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъВ общем, нужны нормальные с++ ссылки (фактически, алиасы)Так есть var уже в любое место, чем не ссылка или алиас вкупе с магией разыменования указателей?
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989592
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bred eFeM
ъъъъъWith - не нужен
Не умеешь готовить ))

Достаточно чтобы отладчик поля прорисовывал, ну и иногда какой-нибудь "WithSelf" не помешал бы.

Уже больше полувека как (с 1969года), а отладчик такого не умеет.

With - не нужен. Дешевле отказаться, чем продолжать дальше тянуть эту колченогую конструкцию.
Достаточно алиасов, ограниченных текущим scope, как в нынешних var.
Типа:
Код: pascal
1.
2.
3.
4.
5.
  var button1 := TButton.Create(...);
  button1.Parent := ...;
  alias p = button1.Parent;
  p.Caption := '';
end; // end of scope


Как только появятся алиасы, with перестанет применяться, и в следующей версии его можно спокойно выпиливать.
И, наличие инлайн переменных уже делает бессмысленной любимую некоторыми глупость
Код: pascal
1.
2.
3.
with TMyClass.Create() do begin
...
   Free();


Для полноты, хорошо бы ввести в язык полноценный RAII, и тогда потихоньку сами собой отвалятся и try-finally...
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989593
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bred eFeM
чем не ссылка

Всем не ссылка.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989596
ъъъъъ

With - не нужен.


Нужен))) Приведу свой код


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
procedure TForm1.Button3Click(Sender: TObject);
var
  v, NewClas: TPtr;
begin
  with CurrentPHP do
  begin
    v := RegPHPClass('PHPClassTest'); // Инициализируем контейнер класса

    zend_register_function(v, 'TestFunc', @functionCall);
    zend_register_function(v, 'TestFunc1', @functionCall2);
    zend_register_function(v, 'TestFunc2', @functionCall3);

    // Добавим в него константы
    zend_declare_class_constant(v, 'constNull');
    zend_declare_class_constant(v, 'constLong', 2020);
    zend_declare_class_constant(v, 'constBool', True);
    zend_declare_class_constant(v, 'constDouble', Double(Pi));
    zend_declare_class_constant(v, 'constString', 'const set String');

    // Добавляем Protected свойства  PHPClassTest::ProtectedNull
    zend_declare_property(v, 'ProtectedNull', ZEND_ACC_PROTECTED);
    zend_declare_property(v, 'ProtectedLong', 2020, ZEND_ACC_PROTECTED);
    zend_declare_property(v, 'ProtectedBool', True, ZEND_ACC_PROTECTED);
    zend_declare_property(v, 'ProtectedDouble', Double(Pi), ZEND_ACC_PROTECTED);
    zend_declare_property(v, 'ProtectedString', 'Protected set String', ZEND_ACC_PROTECTED);

    // Cтатические переменные класса PHPClassTest::$StaticNull
    zend_declare_property(v, 'StaticNull', ZEND_ACC_STATIC);
    zend_declare_property(v, 'StaticLong', 2020, ZEND_ACC_STATIC);
    zend_declare_property(v, 'StaticBool', false, ZEND_ACC_STATIC);
    zend_declare_property(v, 'StaticDouble', Double(Pi), ZEND_ACC_STATIC);
    zend_declare_property(v, 'StaticString', 'Static set String', ZEND_ACC_STATIC);

    // Пробуем обновить static свойства
    zend_update_static_property(v, 'StaticNull');
    zend_update_static_property(v, 'StaticLong', 2095);
    zend_update_static_property(v, 'StaticBool', True);
    zend_update_static_property(v, 'StaticDouble', 2095.08);
    zend_update_static_property(v, 'StaticString', 'Static update String ');

    // Теперь хочу создать класс, и заполнить его переменными
    NewClas := NewPzval; // Создадим контейнер
    object_init_ex(NewClas, v); // Иницилизируем новый класс

    // Будем просто обновлять переменные в классе. Тем самыим добавляя значения
    zend_update_property(v, NewClas, 'UpdateNull');
    zend_update_property(v, NewClas, 'UpdateLong', 2020);
    zend_update_property(v, NewClas, 'UpdateBool', True);
    zend_update_property(v, NewClas, 'UpdateDouble', Double(Pi));
    zend_update_property(v, NewClas, 'UpdateString', 'Hello');

    // Вывод
    EvalCode('print_r(["StaticNull" => PHPClassTest::$StaticNull, "StaticLong" => PHPClassTest::$StaticLong, ' +
      ' "StaticBool" => PHPClassTest::$StaticBool, "StaticDouble" => PHPClassTest::$StaticDouble, ' +
      ' "StaticString" => PHPClassTest::$StaticString, "constNull" => PHPClassTest::constNull, "constLong" => PHPClassTest::constLong, ' +
      '"constBool" => PHPClassTest::constBool , "constDouble" => PHPClassTest::constDouble, "constString" => PHPClassTest::constString, "' +
      print_r(NewClas, 1) + '"]); ', nil, 'Test Runner', 1);

  end;
end;




Приводить CurrentPHP к каждой функции и всему остальному, будет достаточно сложно.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989600
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик,

ну говнокод же.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989609
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
Bred eFeM
чем не ссылка
Всем не ссылка.
Ну да, давай ещё const заинлайним всем на радость...
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989612
ъъъъъ,

Поясни за говнокод. Нормальный код.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989614
ъъъъъ,

Ты просто не понимаешь, что я могу разделять загруженные PHP библиотеки на разные структуры, тем самым заставляя каждый поток работать со своим PHP классом.

Вот и выходит что это качественный код.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989615
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bred eFeM
ъъъъъ
пропущено...
Всем не ссылка.
Ну да, давай ещё const заинлайним всем на радость...

With - не нужен.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989616
ъъъъъ,

Поясни, в какой сфере он не нужен. Или он не нужен вообще. А если он вообще не нужен, то почему он в таком случае не нужен?


Данная конструкция тебе что, прикусила во время ом ?

Генерируемый ассемблерный листинг, 100% идентичен и без конструкции with. Что и с with


... Ты выражаешься не ясно, и непонятно. Не поясняешь и не акцентируешь.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989617
Вот почему я не могу использовать with если генерируемый код идентичен коду, который без with с указанием прямой структуры или класса ?
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989619
Хочу познать этот дзен, почему with не нужен. От сей опытного человека, который так сильно об него обжёгся и весь код пошёл по ступенькам с небес в ад.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989629
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Хочу познать этот дзен, почему with не нужен.
Врятли поймёшь...
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989630
white_nigger,

То есть проблема в самом программисте, а не в конструкции. Если данная конструкция вложена в процедуру события какого - либо объекта, и надо в конструкции обратится к переменной класса. Я ведь просто напишу Self. и мне выдаст функции\переменные текущего класса, самого события.

А по умолчанию, все функции\переменные принадлежат объекту верхнего уровня, вложенного в with


И генерируемый код ассемблера мало чем отличается по итогу, если бы я изначально приписывал к каждой функции \ переменной нужный мне объект, вложенного в with
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989693
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я давно уже за идею
Код: pascal
1.
2.
with some.long.object as ob do
  ob.field := ...
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989761
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
Одно из предложений было оформлять алиасы с помощью ключевого слова "as"
Идея, в принципе хороша, но не с такой реализацией. Пример
Код: pascal
1.
with Sender as TButton do


ну и придется запретить with без алиасов. Иначе все бессмысленно
Dimitry Sibiryakov
Все проблемы с With решаются игнорированием правил старика Вирта и выдачей ошибки (или хотя бы предупреждения) если идентификатор в коде ресольвится более чем в один объект
Обеими руками за именно такую реализацию. Причем именно за ошибку, а не предупреждение. Выдает же компилятор ошибку, когда в двух модулях объявлены две overload функции с одним прототипом. И код переписывать нужно по минимуму и основная проблема with уйдет (еще бы они дебаггер допилили).

Более того, может быть такое поведение стоит расширить на любое пересечение идентификаторов в текущей зоне видимости. Но это уже может быть больно.

А вообще, как здесь правильно заметили, с инлайновыми переменными with вообще бессмыслен
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989768
_Vasilisk_,

Эмм. Мне кажется Сэр, вы используете with совершенно не по назначению, и не понимаете его суть.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989770
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
ну и придется запретить with без алиасов. Иначе все бессмысленно
и сломать обратную совместимость?
имхо, оно того не стоит.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989772
_Vasilisk_,

В таком исполнение - конструкция, как и задумывалась - идеальна!. Ибо все свойства \ функции доступны верхнего объекта Sender as TButton

Код: pascal
1.
2.
3.
4.
5.
6.
7.
  with Sender as TButton do
  begin
    Caption := 'Text';
    Left := 34;
    Top := 46;
    Font.Size := 10;
  end;



Высшим приоритетом! А все остальные уже поданные.

И такую конструкцию на инлайн не променяешь.
Потому что вы сами должны понимать, что придётся создавать переменную, и прописывать её ручками к каждому свойству.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989778
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так уже работает
Код: pascal
1.
with (Sender as TButton) do
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989779
Uridian,

Оно и без скобок работает.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989780
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
with TForm.Create(nil) as X do begin
  Button1 := TButton.Create(X);
  Button.Parent := X;
  ShowModal;
  Free;
end;
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989790
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Г-споди, какой хернёй вы страдаете. Почему вы не пишете на сразу php, зачем вообще нужен этот изврат?
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989792
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Хочу познать этот дзен, почему with не нужен.

Потому что нужны более удобные инструменты, чем копипаста с with.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989801
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
DimaBr, Это не имеет практичности на жизнь.

Жизнь, она у всех разная. Не нужно по своей жизни судить всех остальных.
Лично мне, порой не хватает конструкции AS (или подобной)
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989808
DimaBr,

Если ты хотел сделать

Код: pascal
1.
with var X := TForm.Create(nil) do begin



То сделай это хотя бы так
Код: pascal
1.
2.
var X := TForm.Create(nil)
with X do begin



Но странно, что это не работает как первый вариант.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989811
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
_Vasilisk_ну и придется запретить with без алиасов. Иначе все бессмысленно
и сломать обратную совместимость?Хотя бы warning добавить
ВсеРазумный
Высшим приоритетом! А все остальные уже поданные.
Угу. Все просто замечательно, пока в объекте не появится новое свойство, которого не было в предыдущих версиях. Угадай, что сделает этот код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TForm1.Button1Click(Sender: TObject);
var
  R: TRect;
begin
  with R do begin
    Left := 100;
    Right := 200;
    Width := Right - Left;
  end;
end;


ВсеРазумный
Потому что вы сами должны понимать, что придётся создавать переменную, и прописывать её ручками к каждому свойству.
И это замечательно
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989812
Fr0sT-Brutal,

Извращенци.

Код: pascal
1.
2.
with var ob = some.long.object do
  ob.field := ...



К тому же,всю логику with убиваете! По рукам вам за такое.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989814
_Vasilisk_,

Сказочники.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Unit2.pas.31: Left := 100;
0060DED0 C745E864000000   mov [ebp-$18],$00000064
Unit2.pas.32: Right := 200;
0060DED7 C745F0C8000000   mov [ebp-$10],$000000c8
Unit2.pas.33: Width := Right - Left;
0060DEDE 8B55F0           mov edx,[ebp-$10]
0060DEE1 2B55E8           sub edx,[ebp-$18]
0060DEE4 8D45E8           lea eax,[ebp-$18]
0060DEE7 E89850E0FF       call TRect.SetWidth
Unit2.pas.35: end;
0060DEEC 8BE5             mov esp,ebp
0060DEEE 5D               pop ebp
0060DEEF C3               ret 



И ASM с обычным присвоением без with

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Unit2.pas.30: R.Left := 100;
0060DED0 C745E864000000   mov [ebp-$18],$00000064
Unit2.pas.31: R.Right := 200;
0060DED7 C745F0C8000000   mov [ebp-$10],$000000c8
Unit2.pas.32: R.Width := R.Right - R.Left;
0060DEDE 8B55F0           mov edx,[ebp-$10]
0060DEE1 2B55E8           sub edx,[ebp-$18]
0060DEE4 8D45E8           lea eax,[ebp-$18]
0060DEE7 E89850E0FF       call TRect.SetWidth
Unit2.pas.33: end;
0060DEEC 8BE5             mov esp,ebp
0060DEEE 5D               pop ebp
0060DEEF C3               ret 




Сделает тоже самое. Не надо тут ЛяЛя ТраПоля На коне мы катались.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989815
_Vasilisk_
И это замечательно


Отстаньте от оператора with если не понимаете его логику.

Вам Дай Атомную Электростанцию, вы на ней будете мороженное выпускать!
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989822
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный

Код: pascal
1.
0060DEE7 E89850E0FF       call TRect.SetWidth


Сделает тоже самое.

То же самое ?
А подразумевалось установить ширину формы!
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989823
DimaBr,

Я СКОЛЬКО РАЗ ПИСАЛ!!! Вы чё, совсем без мозгов что ли?

Смысл WITH в том, что в приоритете функции и свойства установленного объекта в WITH


ОН РАБОТАЕТ КАК И ДОЛЖЕН. ЖОПА ОТ ВАС ГОРИТ, ТАКИХ ПРОФЕССИОНАЛОВ DELPHI
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989825
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
DimaBr,
Я СКОЛЬКО РАЗ ПИСАЛ!!! Вы чё, совсем без мозгов что ли?
Смысл WITH в том, что в приоритете функции и свойства установленного объекта в WITH
ОН РАБОТАЕТ КАК И ДОЛЖЕН. ЖОПА ОТ ВАС ГОРИТ, ТАКИХ ПРОФЕССИОНАЛОВ DELPHI

Все прекрасно знают как он работает, просто вы даже не читаете текст
Все просто замечательно, пока в объекте не появится новое свойство, которого не было в предыдущих версиях
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989828
DimaBr,

А причём тут with ?! Если в старых версиях Delphi разрабы ложанулись, и не сделали функционал TRect А в будущем допилили до идеала.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989829
DimaBr,

Тем более я писал, если вы хотите из with обращаться к функциям формы и свойствам.

Нужно использовать self. в with Ибо with отвечает только за установленный объект в with
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989839
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смешней наоборот, когда из TRect Width выпилят или переименуют.

Вот тогда реально хохма внутри with происходит.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989843
rgreat,

Вы такие сказочники, ей богу. Вам with вообще не нужен, потому что вы хотите взять переменную на объект в with

А with нужен для быстрого заполнения структур или объектов. Без ссылки для всех свойств \ функций и прочего.


Если вы не готовы поддерживать прошлые версии Delphi Или будущие. То зачем вам вообще with модернизировать? В старых проектов он не будет работать. А в новых вы его юзать по всем тем же проблемам не будете.



ВЫ Как дети из детсада - хочу, сделайте. Но я не буду с этим играть.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989845
Я кстати ничего не имею против, что бы with поддерживал такое

Код: pascal
1.
with var x = Object do



Это правильная архитектура. Никаких алисов и прочего. Мы берём, и присваиваем к переменной объект.


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

Код: plaintext
1.
2.
auto x;
if (x = (object == ...))



НО Опять же есть те, кто считают что это языку не нужно например с СИ и СИ++
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989849
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Сказочники.
А теперь тот же код в D7
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989851
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Я кстати ничего не имею против, что бы with поддерживал такое

Код: pascal
1.
with var x = Object do



Это правильная архитектура. Никаких алисов и прочего. Мы берём, и присваиваем к переменной объект.


В случае объектов это будет работать, в случае записей - нет. Для записей нужны алиасы.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989852
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
ВсеРазумный
Сказочники.
А теперь тот же код в D7

Тссс... не спугни!
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989853
_Vasilisk_,

Вашей Delphi 7 уже 18 лет. Уже совершенно летняя, что бы перестать её опекать.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989854
DmSer

В случае объектов это будет работать, в случае записей - нет. Для записей нужны алиасы.


Будет и для записи работать! Потому что это присвоение обычной переменной на запись. Которое аналогично и вне with
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989855
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
А with нужен для быстрого заполнения структур или объектов. Без ссылки для всех свойств \ функций и прочего.
А слабо нормальный конструктор написать?

А вообще я не против адекватного with, если таковой будет.
Я против использования существующего.

Но я пока красивых предложенных вариантов не видел.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989856
rgreat,

В том - то и прелесть, что мы можем обращаться к любым свойствам и не только, и включая процедуры с функциями и константами.


Никакой конструктор не даст такой функциональности. Будет как бабка Зинка выглядеть в 100 лет.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989860
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Никакой конструктор не даст такой функциональности.
Такой потенциально опасной и глючной - да, никакой.

Вообще у свойств к которым обращается владельца надо указывать явно.

Собственно по хорошему даже к глобальным переменным надо обращатся указывая их юнит.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989863
rgreat,

Опасный и глючный в руках у незнайки.


Так же как ядерная физика, глючная и не предсказуемая. Вот - вот, весь мир взлетит на воздух.


А вы тут, боитесь положить мороженное в стаканчик. Что бы из стаканчик скушать, не беря его в руки.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989864
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
DmSer

В случае объектов это будет работать, в случае записей - нет. Для записей нужны алиасы.


Будет и для записи работать! Потому что это присвоение обычной переменной на запись. Которое аналогично и вне with


Разница в том, что для объектов присваивается ссылка, а для записей - вся структура.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989866
DmSer,

Так и есть. Но я что - то сейчас задумался, что и вправду вся структура будет скопирована. Но ведь функционал годный, с добавлением @Struct
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989870
Для объектов
Код: pascal
1.
with var x = Object do




Скопировать структуру
Код: pascal
1.
with var x = Struct do



Взять Pointer на структуру PX^.
Код: pascal
1.
with var x = @Struct do
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989871
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
rgreat,

Опасный и глючный в руках у незнайки.

Опасный в любых руках при рефакторинге свойств класса/рекорда.

В компоненте который ты использовал, поменяли свойство которое ты через with использовал и все - ты в жопе.

Никакой ошибки не будет а ПО будет глючить.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989872
rgreat,

Вы даже не готовы мониторить изменения, которое происходит с тем чем вы работаете. От версии к версии, если оно меняется. Добавляя разные вариации вызовов в одно место.

То есть это говорит о вашем профессионализме. Когда вы скачали новую Delphi, написали код. Потом решили её закинуть на D7 и потом перекинуть на ещё более новую версию.

Создав допустим 3 случая разного взаимодействия.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989873
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Я лучше не буду раскладывать себе грабли без которых можно обойтись.

А ты можешь вручную проверять весь свой и чужой код каждый раз когда где-то что-то обновится. Я не против.

Особенно мне тебя жалко если ты каждый раз вручную сверяешь сорцы дельфи при переходе на новую версию.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989876
rgreat,

Ну правильно. Только with тут причём? Его как задумывали, так он и работает. Он сам должен подставлять ссылку на объект указанного в with в свойства - верхнего уровня, которые принадлежат объекту установленного в with


А дальше уже глобальные переменные, и переменные класса с их функциями и прочим.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989878
rgreat
Особенно мне тебя жалко если ты каждый раз вручную сверяешь сорцы дельфи при переходе на новую версию.


Да, очень жаль человека, который умеет пользоваться инструментами и документациями. Которые сразу способны показать различие кода с помощью diff А это процедуры - свойства и так далее. Наличие \ Отсутствие \ Добавленные


В добавок сам Delphi везде использует with

Код: pascal
1.
2.
    with Location do
      DrawCheck(Canvas, Point(FrameRect.Left + 5, Self.Height div 2 - 1), 2);



Код: pascal
1.
2.
3.
4.
5.
  with Canvas do
  begin
    Pen.Color := Menu.ColorMap.FontColor;
    Brush.Color := Pen.Color;
  end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class function TKeyLanguage.Create: TKeyLanguage;
begin
  with Result do
  begin
    Caption := '';
    Vk := -1;
    ScanCode := -1;
    SetLength(ComboKeys, 0);
    Language := '';
    KeyImage := kiText;
  end;
end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  with DockClients[0] do
  begin
    NcW := Self.Width - Width;
    NcH := Self.Height - Height;
    FUpdatingSize := True;
    try
      SetBounds(Left, Top, W - NcW, H - NcH);
    finally
      FUpdatingSize := False;
    end;
    NewWidth := Width + NcW;
    NewHeight := Height + NcH;
  end;




И я считаю это правильным!.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989882
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слабоумие и отвага.

Dixi.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989883
rgreat,

То есть проблема в человеке, а не в конструкции языка with


Мы давно это выяснили.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989921
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Смысл WITH в том, что в приоритете функции и свойства установленного объекта в WITH
*установленн ых объект ов
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989936
Gluck99,

Да. Можно группировать в with разные объекты (В понимание объектов в Delphi), и структуры.


НО это прям очень редкая и нестандартная ситуация. Надо следить что бы в двух объектах не было одинаковых свойств и функций, иначе они не будут доступны для второго объекта.


А with прежде всего подразумевает настройку объекта указанного в with. А не всей области, включая и форму.
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989974
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Слабоумие и отвага.
Dixi.
Воистину!...
...
Рейтинг: 0 / 0
Улучшение оператора with: голосование и обсуждения
    #39989996
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
По этому эта тема изначально является флудом.
Во-первых, почитай что такое флуд (а-то у тебя даже терминология хромает).
Во-вторых, ты просто не пиши в такие темы с флудом, пусть эти бестолковые
неучи между собой общаются. Договорились? Заранее спасибо.
...
Рейтинг: 0 / 0
100 сообщений из 100, показаны все 4 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Улучшение оператора with: голосование и обсуждения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]