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

Вниз

Отображение begin .. end другим цветом (D2005)   Найти похожие ветки 

 
Eugene74   (2005-06-09 16:47) [0]

Добрый день.
Подскажите, пожалуйста, можно ли добиться в редакторе Delphi 2005 отображения слов-скобок begin и end другим цветом? Но только этих двух, а не всех зарезервированых слов! Хочу как раз, чтобы они визуально не смешивались с другими (ведь все отображаются одинаковым черным жирным шрифтом), чтобы улучшилась читаемость кода.

Под предыдущими версиями Delphi этого эффекта можно было добиться с помощью CodeRush:
http://www.devexpress.com/Products/VCL/CoderushDelphi/i/features/StructuralHighlightingCR6.gif

Но версию для D2005 они, похоже, не собираются выпускать, а с помощью стандартных средств, Castalia и GExperts мне этого добиться не удалось. Может где что просмотрел?


 
Eugene74   (2005-06-09 23:44) [1]

Если это невозможно, то нельзя ли переопределить begin end на {} ? Читать же намного легче будет...
(для многострочных комментариев останутся (* *) )


 
Просто Джо ©   (2005-06-10 05:32) [2]


>  [1] Eugene74   (09.06.05 23:44)
> Если это невозможно, то нельзя ли переопределить begin end
> на {} ? Читать же намного легче будет...

Синтаксис языка "переопределить" экспертами не представляется возможным.


 
Просто Джо ©   (2005-06-10 05:33) [3]

А для того, чтобы "читать легче было" следует, ИМХО, придерживаться стандартных правил форматирования кода.


 
Eugene74   (2005-06-10 15:17) [4]

Дык, я стараюсь придерживаться, но все равно эти begin end визуально смешиваются с операторами :(


if condition then
begin
 statement
 statement  
end
else
begin
 statement
 statement  
end;
if ...


Собственно, о том, что переопределение (подобно define в C) в Delphi стандартными средствами сделать нельзя, я знаю. Но кто из нас пользуется только стандратными средствами? ;) Вот и подумалось, может кто-то уже догадался, как это все-таки можно сделать... Может, именно в D8/D2005 какие-то возможности для этого появились...


 
Суслик ©   (2005-06-10 15:23) [5]

делай отступ 3, а не 1.
имхо намного обзорнее.


 
Германн ©   (2005-06-10 15:27) [6]

2 Суслик ©   (10.06.05 15:23) [5]
3 нельзя ни в коем случае! можно 2, 4, 8 и т.д. ;)


 
Eugene74   (2005-06-10 15:28) [7]

Да, statements в примере выше тоже часто начинаются с жирного шрифта (зарезервированые слова).

Интересно, как кому-то вообще в голову пришла идея в качестве скобок использовать слова?

Скобки, они ведь на то и скобки, чтобы как раз визуально выделять группы слов. Представьте, что было бы, если бы в нормальном языке нельзя было бы употреблять (), а вместо это надо было бы писать начало .. конец.


 
Суслик ©   (2005-06-10 15:29) [8]


>  [6] Германн ©   (10.06.05 15:27)

я 10 лет уже трешкой пользуюсь. Меня не переубедить.


>  [7] Eugene74   (10.06.05 15:28)

пиши на си


 
Eugene74   (2005-06-10 15:32) [9]

Отступ обычно делаю 2 (согласно рекомендациям по стилевому оформлению), иногда 3 (как принято в VB) или 4.
Но читабельность кода это почему-то заметно не улучшает. Может, дело все-таки в длине скобок (3-5 символов) и избыточности конструкций?


 
Суслик ©   (2005-06-10 15:34) [10]


>  [9] Eugene74   (10.06.05 15:32)

это дело привички. Почитай например getmem.inc (поищи в исходниках, поставляемых с дельфи - должно быть). Там вообще другой стиль. И ничего. Разобраться можно.


 
Lin7   (2005-06-10 15:35) [11]

Castalia не работает под D2005? У меня на D7 работает хорошо и всё выделяет.


 
Eugene74   (2005-06-10 15:55) [12]

Суслик ©   (10.06.05 15:29) [8]
пиши на си

Дело в том, что я не являюсь профессиональным программистом, просто решаю прикладные задачи в своей области, C/C++ никогда серьезно не занимался. Но мне кажется, что своих проблем (в т.ч. с избыточностью синтаксиса) там хватает. В C++Builder, натянутом словно маска на Delphi VCL, как-то уродливо выглядят конструкции. С MS C++ даже боюсь и начинать. В Delphi то уже немного освоился. Вот только замечаю, что из-за недостатков синтаксиса времени много уходит на проверку логических конструкций.

getmem.inc
спасибо, посомтрел. Там begin переносится в конец предыдущей строки. Да, смотрится несколько лучше. Вообще, я прежде чем сюда писать перечитал кучу статей и топиков в форумах по стилевому оформлению кода Delphi. Склоняюсь к тому, что без изменений в самом синтаксисе языка, кардинального улучшения достичь не удастся. Или может, я чего-то недопонимаю в самих принципах, заложенных в синтаксис языка?

Но возвращаясь к первоначальной идее, может можно хоть на время редактирования (перед выводом на эран) заменять чем то эти begin end, а потом пусть все автоматически меняется обратно перед подсовыванием компилятору?

Lin7   (10.06.05 15:35) [11]
Castalia не работает под D2005?

Работает, но именно цветом сами слова begin .. end не выделяет (в отличие от CodeRush).


 
arhis   (2005-06-10 18:26) [13]

>Вот только замечаю, что из-за недостатков синтаксиса времени >много уходит на проверку логических конструкций.

Я конечно понимаю, что на вкус и цвет товарищей нет, но вот этого мне не понять.


 
Суслик ©   (2005-06-10 18:51) [14]


> Или может, я чего-то недопонимаю в самих принципах, заложенных
> в синтаксис языка?

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


 
linesoft ©   (2005-06-10 19:31) [15]

Eugene74, ты мне очень напомнил Брюса Баррингтона. Советую почитать его рассказ о создании Clarion. (К сожалению, сейчас порылся в сети, не нашел, но дома точно на бумаге лежит, значит найти можно).
Он тоже так придирался к С и др. языкам, что создал новый.
Если по такому же пути идти нет желания, приходится выбирать из того, что есть. Хочешь скобки - выбираешь С, не хочешь уходить с дельфы - терпи слова.


 
Zeqfreed ©   (2005-06-10 20:22) [16]

Скажу, что я лично не представляю, как бы убого смотрелись этии скобочки операторные. От части из-за этого, меня всегда отпугивал C++, хотя это конечно же глупо ). А если тебе мешает синтаксис для разбора алгоритмов, значит ты выбрал для себя не наиболее подходящий тебе стиль написания кода, ИМХО.


 
Eugene74   (2005-06-13 19:39) [17]

Спасибо вам за ответы. В общем-то я не ратую именно за {} вместо begin/end. Скорее, мне импонирует синтаксис VB/VBS или, еще более прогрессивно, Python.

Eugene74
времени много уходит на проверку логических конструкций

Попробую объяснить, что я имею ввиду. Может, вы мне сможете подсказать, как можно писать более лаконичный и понятный код.

Посмотрите на эту небольшую процедуру (последняя в модуле). Есть ли здесь синтаксические или логические (в данном случае под этим будем понимать противоречие с визуальным форматированием) ошибки? Если да, то где именно и как их исправить? Если не секрет, сколько времени занял анализ, только честно? При любом варианте: как бы вы написали такую процедуру?

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
 WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
 h: hWnd;
 I: TComponent;
 wd: Integer;
begin
 h := WindowFromPoint(MousePos);
 if WheelDelta >= 0 then wd := 1 else wd := -1;
 for I in Self do begin
   if (I is TsSpinEdit) then
     with (I as TsSpinEdit) do
       if (Handle = h) or (Button.Handle = h) then begin
         Value := Value + Increment * wd;
         Handled := True;
         Exit
       end
   else if (I is TsCheckBox) then
     with (I as TsCheckBox) do
       if (Handle = h) then begin
         if State = cbChecked then
           State := cbUnchecked
         else
           State := cbChecked;
         Handled := True;
         Exit
       end
 end
end


 
-=XP=- ©   (2005-06-13 20:05) [18]

if WheelDelta >= 0 then wd := 1 else wd := -1;
WD := Sign(WheelDelta);

if State = cbChecked then
 State := cbUnchecked
else
 State := cbChecked;

Checked := not Checked;

Кроме того, если вместо WindowFromPoint использовать ControlAtPos(), то весь Ваш код становится намного короче.

:о)


 
-=XP=- ©   (2005-06-13 20:18) [19]

Скобки, они ведь на то и скобки, чтобы как раз визуально выделять группы слов. Представьте, что было бы, если бы в нормальном языке нельзя было бы употреблять (), а вместо это надо было бы писать начало .. конец.

Очень, очень дискутивно. Хотя бы исходя из того, что {..} или begin..end называются "операторными скобками". Вот тут вся загвоздка. Вы выделяете слово "скобки". Я же выделяю слово "операторные". Для Вас это - группы слов. Для меня - часть программы, выполняющая вполне определенные действия. Для Вас - участок текста. Для меня - совокупность действий. Для Вас - синтаксис. Для меня - семантика. Вам - выделить. Мне - начать.
Перефразируя: "Представьте, что было бы, если бы в нормальном языке нельзя было бы употреблять "Начало", Конец", а вместо это надо было бы писать (..)". ;)

P.S. Я все время путаюсь в скобках. Особенно в математических выражениях, когда в одном выражении больше 5-6 пар скобок. С begin/end у меня такой путаницы практически не возникает. Мне обратиться к окулисту или к психиатру? :(


 
Eugene74   (2005-06-13 20:36) [20]

-=XP=-
За Sign спасибо (но для этого надо добавлять модуль Math).
С CheckBox так просто не получится (поправьте, если ошибаюсь). Дело в том, что State - это не булев тип, и там есть еще третий вариант cbGrayed, при котором состояние чекбокса меняться не должно.
За ControlAtPos тоже спасибо, попробую переписать. Btw вопрос. Только что в справке прочитал "ControlAtPos returns an immediate child of the control". Получается, если те же spinedit"ы лежат на панели внутри формы, то этот метод возвратит ссылку на панель, а не на spinedit?

begin..end ... - часть программы, выполняющая вполне определенные действия.
так ведь в том то и дело, что они абсолютно никаких действий не выполняют!
Перефразируя: "Представьте, что было бы, если бы в нормальном языке нельзя было бы употреблять "Начало", Конец" в качестве скобок, а вместо это надо было бы писать (..)". ;)
но это не надо представлять. Оно так и есть :)

Перефразируя: "Представьте, что было бы, если бы в нормальном языке нельзя было бы употреблять "Начало", Конец", а вместо это надо было бы писать (..)". ;)
Пример математического выражения со скобками - в студию, а потом его же с begin/end вместо скобок :)


 
Eugene74   (2005-06-13 20:40) [21]

еще раз последний кусок предыдущего поста, который получился сплошным курсивом:

begin..end ... - часть программы, выполняющая вполне определенные действия.

так ведь в том то и дело, что они абсолютно никаких действий не выполняют!

Перефразируя: "Представьте, что было бы, если бы в нормальном языке нельзя было бы употреблять "Начало", Конец" в качестве скобок надо здесь вставить, чтобы сравнение было корректным, а вместо это надо было бы писать (..)". ;)

но это не надо представлять. Оно так и есть :)

Я все время путаюсь в скобках. Особенно в математических выражениях, когда в одном выражении больше 5-6 пар скобок. С begin/end у меня такой путаницы практически не возникает.

Пример такого математического выражения со скобками - в студию, а потом его же с begin/end вместо скобок :)


 
Просто Джо ©   (2005-06-13 21:47) [22]

2 Eugene74
Скобки (не важно, в какой форме) отнюдь не предназначены для "улучшения логики" кода. В приведенном Вами примере код настолько запутан логически, что его нужно упрощать. Расстановкой скобок здесь, повторю, дела не улучшишь.
Попробуйте выразить приведенный код обычными словами. Сходу это не получится, это и есть верный признак запутанного, иными словами, плохого кода. Используйте любые доступные методы рефакторинга и перепишите его.


 
Просто Джо ©   (2005-06-13 22:14) [23]

Да к тому же, еще и с синтаксическими ошибками.


 
Eugene74   (2005-06-13 22:39) [24]

Просто Джо
Скобки (не важно, в какой форме) отнюдь не предназначены для "улучшения логики" кода.
Но для её выражения.

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

Процедура предназначена для изменения значений SpinEdit- и CheckBox-контролов простой наводкой курсора поверх них и прокруткой колеса мыши.

Процедура вызывается по событию формы OnMouseWheel.
h - хэндл окна под курсором.
Делается цикл по всем child-компонентам формы.
Если текущий компонент - TsSpinEdit и его хэндл или хэндл кнопок прокрутки, встроенных в него (используются AlphaControls), равен h, то значение TsSpinEdit увеличивается или уменьшается в зависимости от направления прокрутки колеса мыши.
Если текущий компонент - TsCheckBox, то выполняется аналогичная проверка на Handle и галочка снимается или убирается.


 
Просто Джо ©   (2005-06-13 22:42) [25]

Как, минимум, нужно сделать:

1. Устранить синтаксическую ошибку:
for I in Self do begin
  if (I is TsSpinEdit) then

2. Дать переменным хорошие имена. I - переменная цикла, но никак не экземпляр объекта. Это тоже очень важно и способствует пониманию кода.


 
Просто Джо ©   (2005-06-13 22:47) [26]

Ах, черт, синтаксическую ошибку снимаю, это же Delphi 2005, насколько я понял?


 
Eugene74   (2005-06-13 22:51) [27]

Да к тому же, еще и с синтаксическими ошибками.
можно узнать, что это за ошибки (т.е. какое синтаксическое правило нарушено) и в каких именно местах?


 
Eugene74   (2005-06-13 22:58) [28]

Да, Delphi 2005 (но это imho влияет только на цикл for по элементам коллекции, которого не было в предыдущих версиях).

Дать переменным хорошие имена. I - переменная цикла, но никак не экземпляр объекта. Это тоже очень важно и способствует пониманию кода.
OK, учту. Хотя, I, в данном случае, как бы и то и другое.

Но ошибка в коде все-таки есть или нет?


 
Просто Джо ©   (2005-06-14 00:27) [29]

Я бы сделал так:


function InvertCBState (AState: TCheckBoxState): TCheckBoxState;
begin
case AState of
  cbChecked:
    Result := cbUnchecked;
  cbUnchecked:
    Result := cbChecked
  else
    Result := AState;
end;
end;

function HandleSpinEdit (AControl: TControl; AWheelDelta: Integer): Boolean;
begin
Result := AControl is TSpinEdit;
if Result then
  with TSpinEdit(AControl) do
    Value := Value + Sign(AWheelDelta)*Increment;
end;

function HandleCheckBox (AControl: TControl): Boolean;
begin
Result := AControl is TCheckBox;
if Result then
  with TCheckBox(AControl) do
    State := InvertCBState(State);
end;

function HandleWheel (AForm: TForm; Delta: Integer; MousePos: TPoint): Boolean;
var
 AControl: TControl;
begin
 Result := False;
 MousePos := AForm.ScreenToClient(MousePos);

 AControl := AForm.ControlAtPos(MousePos,False,True,True);

 Result := (Assigned(AControl)) and
   (HandleSpinEdit(AControl, Delta) or HandleCheckBox(AControl));
end;

// Собственно, сам обработчик события
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
 Handled := HandleWheel(Self,WheelDelta,MousePos)
end;


Каждая функция имеет свое четкое назначение, которое (я надеюсь) понятно из названия. Таким образом, вся логика легко выносится в отдельный юнит; место ошибки легко локализовать; необходимость сложных условий и циклов отпадает. Кроме того, очень легко расширить данный пример для обработки других контроллов не меняя уже отлаженную логику.


 
Просто Джо ©   (2005-06-14 00:48) [30]

[29] Просто Джо ©   (14.06.05 00:27)
В процедуре HandleWheel строка Result := False - разумеется, лишняя.

И, имхо, не стоит так поступать с чек-боксами, пользователь может случайно поставить/наснимать галок, сам того не заметив.


 
Eugene74   (2005-06-14 01:35) [31]

Просто Джо
Спасибо. Наверное, такой подход (модульность, разбиение кода на небольшие понятное кирпичики) действительно наиболее правильный.

Хотя это и означает, что синтаксис Delphi может быть понятным только в небольших кусочках линейного кода :(

Как бы то ни было, придется так и переделывать. Так что еще раз спасибо.

Я тем временем тоже еще подумал над своим примером.

Синтаксическая ошибка: отсутствует ";" в самом конце.

Логическая ошибка: else в середине цикла относится не к первому if, а ко второму, т.к. перед else нет ";". Но если поставить эту ";" - то этим самым не только второй, но и первый if "оформится" в отдельный оператор. Выход: обрамление скобками begin/end всего блока then первого if.

А вот как бы выглядел код цикла в стиле Python:

for I in Self:
   if (I is TsSpinEdit):
       with (I as TsSpinEdit):
           if (Handle = h) or (Button.Handle = h):
               Value += Increment * wd
               Handled = True
               Exit
   elif (I is TsCheckBox):
       with (I as TsCheckBox):
           if (Handle = h):
               if State = cbChecked:
                   State = cbUnchecked
               else
                   State = cbChecked
               Handled = True
               Exit

Насколько меньше знаков! А самое главное: все понятно. Логические отступы и определяют синтаксическую конструкцию!

Ну это так, отвлечение. Понятно, что такие радикальные изменения в Delphi никогда не будут внесены, т.к. нарушится совместимость с TurboPascal/ObjectPascal.

Спасибо Borland и за то, что в новых языковых конструкциях ("новых" - относительно "стариков" if и for из Pascal) типа try/finally/end  или объявлениях классов "end" уже по сути не является закрывающей скобкой для якобы подразумеваемого begin, а непосредственно закрывает try/type. (По крайней мере я так это понимаю.)


 
Eugene74   (2005-06-14 01:45) [32]

И, имхо, не стоит так поступать с чек-боксами, пользователь может случайно поставить/наснимать галок, сам того не заметив.
Ну, это я так, в качестве эксперимента :)
Хотя мне самому так управлять чекбоксом очень даже понравилось. Кликать мышкой уже лень :)


 
Просто Джо ©   (2005-06-14 01:51) [33]


> ry/finally/end  или объявлениях классов "end" уже по сути
> не является закрывающей скобкой для якобы подразумеваемого
> begin,

Ну, record-то был и в Pascal.

А по поводу Питона - ужасть :) Питона я боюсь, так как случайно/намеренно переформатировав код ты изменишь его смысл. Но такая "дискуссия" - не для этой ветки.

Но то, что мне не очень понравилось в твоем Делфовском коде,  присутствует и в псевдо-питонском коде. Например: наличие дублирующегося кода (Handled:=True), два Exit"а, большая (и ненужная) вложенность сравнений (ее можно легко избежать).
Это все, конечно, исключительно без претензий на непогришимость собственного мнения, так, простой имхо.


 
Eugene74   (2005-06-14 02:33) [34]

record-то был и в Pascal
ага, значит, они уже тогда чувствовали, что не надо совать begin/end куда-ни-попадя :)

Питона я боюсь, так как случайно/намеренно переформатировав код ты изменишь его смысл.
а мне он именно этим нравится, тем более что я форматирую код преимущественно намеренно :) ну а случайности - они при любой системе могут случиться

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

P.S. В случае чего, сегодня уже не отвечу, ухожу спать...


 
try..finally   (2005-06-14 06:28) [35]

А где, интересно, begin..end ©?


 
КиТаЯц ©   (2005-06-14 07:19) [36]

>-=XP=- ©   (13.06.05 20:18) [19]

Респект! :)



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

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

Наверх




Память: 0.59 MB
Время: 0.182 c
4-1116310493
Zhenja
2005-05-17 10:14
2005.07.11
Меняем частоту обновления экрана


1-1118584107
Genie™
2005-06-12 17:48
2005.07.11
Как быстро получить список авторов списка файлов


14-1117815608
Андрей Жук
2005-06-03 20:20
2005.07.11
О геноциде


14-1117902396
Pat
2005-06-04 20:26
2005.07.11
Кандидатский минимум. Философия


1-1118386901
Earth
2005-06-10 11:01
2005.07.11
Цвет текста в RichEdit