Здравствуйте, gandjustas, Вы писали:
g> Вопрос твой крайне глуп по своей постановке. Большинство программистов пишущих на этом самом делфи 7 не знают что такое генерики и с трудом понимают что такое юникод.
Да-да, только передовые шарпеи знают о генериках, и даже не бояться слова юникод
g> Я думаю если им объяснить про генерики, то многие очень захотят их использовать, но вот в vcl их применить негде.
Генерики вообще полезны лишь в алгоритмических частях, в прочем от них мало пользы.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
g>> Вопрос твой крайне глуп по своей постановке. Большинство программистов пишущих на этом самом делфи 7 не знают что такое генерики и с трудом понимают что такое юникод.
H>Да-да, только передовые шарпеи знают о генериках, и даже не бояться слова юникод
Слава богу о генериках многие знают, но среди делфистов таких меньшинство.
Ты вместе оперирования фактами, статистикой и другими более-менее объективными вещами начинаешь какой-то фигней заниматься.
g>> Я думаю если им объяснить про генерики, то многие очень захотят их использовать, но вот в vcl их применить негде. H>Генерики вообще полезны лишь в алгоритмических частях, в прочем от них мало пользы.
И где ты такой бред прочитал.
Считай ты сказал что "контроль типов полезен только в алгоритмических частях".
Здравствуйте, Ночной Смотрящий, Вы писали:
НС> НС>> 2) Где обработка ошибок?
НС> H>Что там сложного If GetWindowDirectory(...) = 0 Then RaiseLastOSError;
НС> Ишь какой хитрый. Ты полностью пример приводи.
SetLength(s, MAX_PATH);
If GetWindowsDirectory(PChar(s), Length(s)) = 0 Then
RaiseLastOSError;
SetLength(s, StrLen(PChar(s)));
Этот код не учитывает, что размера буфера не хватит, как и твой.
НС> НС>> 3) Даже в таком виде дельфовый вариант все же посложнее выглядит.
НС> H>Не смеши мои тапки. Либо в Delphi — только строка и все, либо в шарпе всякие стринг-билдеры.
НС> В шарпе StringBuilder это точно так же просто mutable строка.
Это не важно, важно что сущность лишняя простоты не добавляет.
НС> H> Да потом еще и в строку переводить.
НС> Смотря что ты потом с результатом делать будешь.
Неважно что, просто на выходе нужна строка. А то ведь я тоже могу SetLength опустить
Здравствуйте, gandjustas, Вы писали:
g> g>> Вопрос твой крайне глуп по своей постановке. Большинство программистов пишущих на этом самом делфи 7 не знают что такое генерики и с трудом понимают что такое юникод.
g> H>Да-да, только передовые шарпеи знают о генериках, и даже не бояться слова юникод
g> Слава богу о генериках многие знают, но среди делфистов таких меньшинство. g> Ты вместе оперирования фактами, статистикой и другими более-менее объективными вещами начинаешь какой-то фигней заниматься.
Да-да, давай уже статистику, а то ты только ла-ла и можешь
g> g>> Я думаю если им объяснить про генерики, то многие очень захотят их использовать, но вот в vcl их применить негде.
g> H>Генерики вообще полезны лишь в алгоритмических частях, в прочем от них мало пользы.
g> И где ты такой бред прочитал. g> Считай ты сказал что "контроль типов полезен только в алгоритмических частях".
Здравствуйте, Ночной Смотрящий, Вы писали:
НС> НС>> H> SetLength(s, GetWindowsDirectory(PChar(s), Length(s)));
НС> H>function GetWindowsDirectory(lpBuffer: PWideChar; uSize: UINT): UINT; stdcall;
НС> А как, кстати, насчет того, что функция ждет юникод, а PChar вроде как однобайтный?
Этот код универсальный. На анси-версиях Delphi это будет анси-строка, на юникод — юникод. PChar аналогично, на анси — PAnsiChar, на юникод PWideChar.
Здравствуйте, hattab, Вы писали:
H>Этот код не учитывает, что размера буфера не хватит, как и твой.
Его не может не хватить, MAX_PATH это константа ОС.
НС>> В шарпе StringBuilder это точно так же просто mutable строка.
H>Это не важно, важно что сущность лишняя простоты не добавляет.
Она не лишняя. И уж про количество типов строк я бы, в случае Дельфи, помолчал бы.
НС>> Смотря что ты потом с результатом делать будешь.
H>Неважно что, просто на выходе нужна строка.
Важно. StringBuilder, повторюсь, это не специальнохитрый класс, а базовая часть библиотеки. И, кстати, если уж так хочется, можно и иммутабельный string использовать.
H> А то ведь я тоже могу SetLength опустить
И получить глюки в коде, который будет читать длину из заголовка, а не нулевой байт искать.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС> H>Этот код не учитывает, что размера буфера не хватит, как и твой.
НС> Его не может не хватить, MAX_PATH это константа ОС.
Я просто уточнил, а то вдруг ты снова прикопаться решишь, как с обработкой ошибок.
НС> НС>> В шарпе StringBuilder это точно так же просто mutable строка.
НС> H>Это не важно, важно что сущность лишняя простоты не добавляет.
НС> Она не лишняя. И уж про количество типов строк я бы, в случае Дельфи, помолчал бы.
Конечно лишняя В Delphi то она нафиг не упрелась, а мы тут как бы о простоте. На счет типов строк... Это называется гибкость, к тому же они все совместимы по присваиванию.
НС> НС>> Смотря что ты потом с результатом делать будешь.
НС> H>Неважно что, просто на выходе нужна строка.
НС> Важно. StringBuilder, повторюсь, это не специальнохитрый класс, а базовая часть библиотеки. И, кстати, если уж так хочется, можно и иммутабельный string использовать.
Я же сказал — на выходе строка. Что непонятного? т.е. от .ToString(0, len) ты никуда не денешься.
НС> H> А то ведь я тоже могу SetLength опустить
НС> И получить глюки в коде, который будет читать длину из заголовка, а не нулевой байт искать.
А со стринг билдером так не будет Ты уж давай адекватно сравнивай.
SD>>Есть еще Named folders SD>>Другая мощная штука — AltHistory SD>>Есть ли для Тотала такие плюшки?
I>Для тотала вагоны плагинов если ты не в курсе.
Вопрос был не достаточно конкретный? Мне не нужны вагоны с плагинами. Я писал о вполне конкретных двух фичах, которые я активно использую.
Кстати, какие там есть полезные плагины к Тоталу, кроме плагинов файловой системы, отображателей для Lister'a?
I>Например есть плагин, в котором на панели тотала будет консоль с фаром. I>А вот найди как плагин, что бы _на_панели_ фара был запущен тотал. Слабо ?
Про свистнуть жопой CreatorCray уже ответил, разделяю мнение. Т.е. плюс Тотала в том, что его юзерям может понадобиться FAR в панели? Мне Тотал как-то вообще не нужен в панели FAR.
I>Это у тебя хрен знает где. У меня — только там где мне надо.
Ок. Расскажи про опцию, которая заставляет окошки (того же Lister'а) открываться ровно над окошком Тотала? Т.е. позиция подправится, если я перетяну Тотал в другое место или разверну на весь экран.
I>Нахрена именно внутренний редактор ? Если например редактор нужен все время работы, что делать ? Запускать еще инстанцы фаров ?
Потому что он удобный, функциональный и лёгкий. И да, FAR поддерживает многооконность. Если использовать Conemu, то они даже отображаются так тобою любимым тулбаром.
I><...> I>Перечисли, что из этого умеет фар ?
Условно не умеет on top, to tray, transparent. Ибо это можно реализовать плагином, или даже сторонней софтиной.
Фолдинг я вроде видел, но точно не уверен. Ну и шрифт задается глобально для консоли. Что такое в данном контексте "reuse window" я не знаю.
Как минимум встроенный редактор на 99% покрывает мои нужды. Если что-то не хватает, всегда можно настроить запуск внешнего.
Ассоциации можно настроить не только на запуск (Enter), но и на Ctrl-PgDn (вход в файл-архив), на F3, Alt-F3, F4, Alt-F4. Можно выставить глобальные альтернативные вьювер и редактор.
Здравствуйте, hattab, Вы писали:
H>Конечно лишняя В Delphi то она нафиг не упрелась
В Дельфи точно так же уперлась, там все строки мутабельные. А вот то что там нет иммутабельной строки, Дельфи совсем не красит.
H>Это называется гибкость
Т.е. наличие отдельно мутабельной и иммутабельной строк это избыточность, а пучек исключительно мутабельных строк это гибкость?
НС>> Важно. StringBuilder, повторюсь, это не специальнохитрый класс, а базовая часть библиотеки. И, кстати, если уж так хочется, можно и иммутабельный string использовать.
H>Я же сказал — на выходе строка. Что непонятного?
StringBuilder это и есть строка. Что непонятного?
H> т.е. от .ToString(0, len) ты никуда не денешься.
И длину указывать не надо, маршаллер об этом сам позаботится. Достаточно просто ToString без параметров.
НС>> И получить глюки в коде, который будет читать длину из заголовка, а не нулевой байт искать.
H>А со стринг билдером так не будет
Здравствуйте, Ночной Смотрящий, Вы писали:
НС> H>Конечно лишняя В Delphi то она нафиг не упрелась
НС> В Дельфи точно так же уперлась, там все строки мутабельные. А вот то что там нет иммутабельной строки, Дельфи совсем не красит.
Есть константные параметры
НС> H>Это называется гибкость
НС> Т.е. наличие отдельно мутабельной и иммутабельной строк это избыточность, а пучек исключительно мутабельных строк это гибкость?
Тот пучек для совершенно разных вещей. Там где .net будет маршалить, в Delphi достаточно использовать конкретный тип.
НС> НС>> Важно. StringBuilder, повторюсь, это не специальнохитрый класс, а базовая часть библиотеки. И, кстати, если уж так хочется, можно и иммутабельный string использовать.
НС> H>Я же сказал — на выходе строка. Что непонятного?
НС> StringBuilder это и есть строка. Что непонятного?
Проходили уже.
This class represents a string-like object whose value is a mutable sequence of characters.
ToString у строки... ну-да, ну-да.
НС> H> т.е. от .ToString(0, len) ты никуда не денешься.
НС> И длину указывать не надо, маршаллер об этом сам позаботится. Достаточно просто ToString без параметров.
Еще и маршалер включается в работу... то-то ганджустас распевался об эффективности .net'а
НС> НС>> И получить глюки в коде, который будет читать длину из заголовка, а не нулевой байт искать.
НС> H>А со стринг билдером так не будет
НС> Нет, не будет.
Ну да, коли уже кто-то правит размер так оно конечно, только в таком случае и мне никто не мешает
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>>> H> SetLength(s, GetWindowsDirectory(PChar(s), Length(s))); H>>function GetWindowsDirectory(lpBuffer: PWideChar; uSize: UINT): UINT; stdcall; НС>А как, кстати, насчет того, что функция ждет юникод, а PChar вроде как однобайтный?
Начнём с того что функции GetWindowsDirectory не существует вовсе.
В kernel32.dll есть только GetWindowsDirectoryA и GetWindowsDirectoryW
Один работает с ANSI буфером, другой с UTF16LE (вернее с UCS2)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC> НС>>> H> SetLength(s, GetWindowsDirectory(PChar(s), Length(s)));
CC> H>>function GetWindowsDirectory(lpBuffer: PWideChar; uSize: UINT): UINT; stdcall;
CC> НС>А как, кстати, насчет того, что функция ждет юникод, а PChar вроде как однобайтный?
CC> Начнём с того что функции GetWindowsDirectory не существует вовсе.
Да ладно, понятно же, что он проецируется на W в случае .NET'а. У дельфей в анси версии на A, в юникод на W. Но есть и декларация без спецификатора, для универсальности.
CC> В kernel32.dll есть только GetWindowsDirectoryA и GetWindowsDirectoryW CC> Один работает с ANSI буфером, другой с UTF16LE (вернее с UCS2)
Здравствуйте, CreatorCray, Вы писали:
CC>Был плагин который на панели FAR просмотр картинок делал. CC>Так что можно всё.
Можно, но не все. Буквально то что я сказал еще ни один плагин не делает
I>>Нахрена именно внутренний редактор ? Если например редактор нужен все время работы, что делать ? Запускать еще инстанцы фаров ? CC>Там вообще то между окнами (редактор/просмотр/панели) можно переключаться. И соотвественно редакторов и просмотров может быть много.
Ога, круто — переключаться между редакторами, когда можно обойтись без этого.
var docs = Application.Documents;
var currentDoc = docs.Current;
var someObjects = currentDoc.SomeObjects;
За каким хреном нужно писать код выше вместо
Application.Documents.Current.SomeObjects
Можешь сходу сказать ?
Лично мне не нравится писать десять строчек вместо одной и я называю это "париться", потому что не дай бог забудешь, косяки может понадобиться искать неделями.
I>>Без этого стоит раз вызвать примерно такое Application.Documents.CurrentDocument и прога не закроется когда надо. G>Закроется. Хотя может ты что-то другое имеешь ввиду.
Я начинаю сомневаться в твоих регалиях
Кто по твоему закроет Эксель если счетчи ссылок на него нулю не равен ?
Ввести дополнительную фичу "Эксель остается запущеным после того как наши репорты отработали" ?
Здравствуйте, std.denis, Вы писали:
I>>Для тотала вагоны плагинов если ты не в курсе. SD>Вопрос был не достаточно конкретный? Мне не нужны вагоны с плагинами. Я писал о вполне конкретных двух фичах, которые я активно использую.
Если тебе нужн делать нечто постоянно, удобно, быстро, то попробуй погуглить.
А если ты хочешь, что бы Тотал работал точь в точь как Фар то это к доктору.
Ты заметил, что перечисляешь не потребности и даже не юзкейсы, а какие то огрызки ?
"фичи" которые ты перечислил, есть в тотале "искаропки".
SD>Кстати, какие там есть полезные плагины к Тоталу, кроме плагинов файловой системы, отображателей для Lister'a?
Если в гугле забанили то помочь конечно сложно. Всего 4 вида плагинов.
I>>А вот найди как плагин, что бы _на_панели_ фара был запущен тотал. Слабо ? SD>Про свистнуть жопой CreatorCray уже ответил, разделяю мнение. Т.е. плюс Тотала в том, что его юзерям может понадобиться FAR в панели? Мне Тотал как-то вообще не нужен в панели FAR.
Это не свистнуть жопой. Это консоль в панели тотала, что бы не надо было дурью маяться. В некоторых случаях очень удобно — получаешь как бы консольное ГУИ приложение, что бы не надо было запускать доп инстанцы всякой дряни.
Как в тотале, так это свистнуть жопой, а как фича для фара(сonemu), так это круто.
Консольщики такие консольщики
I>>Это у тебя хрен знает где. У меня — только там где мне надо. SD>Ок. Расскажи про опцию, которая заставляет окошки (того же Lister'а) открываться ровно над окошком Тотала? Т.е. позиция подправится, если я перетяну Тотал в другое место или разверну на весь экран.
Не интересовался. Расскажи, как это делается для Фара ?
I>>Нахрена именно внутренний редактор ? Если например редактор нужен все время работы, что делать ? Запускать еще инстанцы фаров ? SD>Потому что он удобный, функциональный и лёгкий. И да, FAR поддерживает многооконность. Если использовать Conemu, то они даже отображаются так тобою любимым тулбаром.
Они просто табами отображаются, а не тулбаром.
Conemu это сильно для консольщиков, только нахрена нужно, не ясно, если у меня консольных прог то не осталось
SD>Фолдинг я вроде видел, но точно не уверен.
Фолдинг в консольном редакторе ? Круто, круто Я как бы тоже видел, но дерьма стараюсь не употреблять.
>Ну и шрифт задается глобально для консоли. Что такое в данном контексте "reuse window" я не знаю.
reuse window — это когда у тебя одно и то же окно используется для разных файлов. Это как раз то ради чего может быть нужен внешний редактор. Цель этой фичи — избежать большого кол.ва окон когда ты просматриваешь много файлов.
SD>Как минимум встроенный редактор на 99% покрывает мои нужды. Если что-то не хватает, всегда можно настроить запуск внешнего.
Твои — возможно. Мои — давно уже как не покрывает.
SD>Ассоциации можно настроить не только на запуск (Enter), но и на Ctrl-PgDn (вход в файл-архив), на F3, Alt-F3, F4, Alt-F4. Можно выставить глобальные альтернативные вьювер и редактор.
Можно, я в курсе. Только я не про это говорил.
Собственно, видно что ты тотала вобщем то не видел и не пробовал толком, но мнение имеешь
Здравствуйте, пыщьх, Вы писали:
П>Здравствуйте, BlackEric, Вы писали:
П>>>Ну вот, C# — Delphi 4:0. А что нужное есть в Delphi, чего нет в C#?
BE>>1. Работает на голом Win32. П>0.0001% юзкейсов, где это действительно нужно BE>>2. Ручное управление памятью. П>IDisposable
IDisposable не имеет прямого отношения к управлению памятью. Что угодно там писать можно.
Главное — КАК реализовано! Допускается появление "полумертвых" объектов, которые очищены, но не ушли из области видимости,
и на эту чушь надо ветки ставить в каждой реализации интерфейса!
Казалось бы, что мешало сделать базовый класс с дефолтной реализацией — нет, нада интерфейс зачем-то.
Интересный эффект, если при реализации (очередной версии) класса понадобилось добавить поддержку IDisposable (а вдруг возникла необходимость дернуть неуправляемый код)
Это ВО ВСЕХ зависимых приложениях как минимум надо понавтыкать using,
а уж если класс был вложен в другой, то и тому другому классу тоже надо прикрутить IDisposable и тоже в его использовании понавтыкать using.
А если зависимых классов много, совсем весело становится.
То же — в случае отказа от IDisposable.
Итого злостное, корявое нарушение принципов ООП: изменение внутренней реализации влечет переделку пользователей открытого интерфейса класса.
Добавим к этому, что для сборщика мусора вообще нет никаких хинтов в IDisposable,
соответсвенно, сборка мусора возбудится, только когда прилетит ошибка ОС о нехватке свободной памяти или о еще какой ж... в ресурсах.
( Это если я забил и не стал переделывать зависимые приложения или не знал, что где-то в зависимой компоненте вдруг добавили вызов неуправляемого кода (о ужас! всех надо срочно поставить в известность!!!)
Ведь у нас один волшебный IDisposable на все виды ресурсов, да?
Нет специального по сокетам, окнам, временным файлам?
BE>>3. И там где нужны первые 2 пункта гораздо проще в работе чем C++ П>COM/PInvoke
COM/PInvoke проще в работе? Вместо объявления сигнатуры функций писать какую-то муть, чтобы ручками копировать память туда-сюда?