Форум: "Основная";
Текущий архив: 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.038 c