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

Вниз

Отображение 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.027 c
14-1116797256
Piter
2005-05-23 01:27
2005.07.11
Вспоминая старое...


6-1112793722
Alexander Panov
2005-04-06 17:22
2005.07.11
Получение кода ошибки в Indy.


4-1116163651
iskatel
2005-05-15 17:27
2005.07.11
рабочая группа


3-1117630917
Orel
2005-06-01 17:01
2005.07.11
таблицу (TTable) базы данных отправить в MS WORD


1-1119530052
$HiC0
2005-06-23 16:34
2005.07.11
TListView и цвета отдельных итемов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский