Есть ли будущее у DELPHI?
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.43] |
|
|
Правила раздела:
| Страницы: (245) « Первая ... 107 108 [109] 110 111 ... 244 245 ( Перейти к последнему сообщению ) |
Есть ли будущее у DELPHI?
|
Сообщ.
#1621
,
|
|
|
|
Цитата [S]mike @ После знакомство с Джавой и Шарпом я в здравом уме не начну ни один проект на Дельфях. Потому что это неудобно и неэффективно, язык бедный, среда неполноценная и глючная вплоть до самых последних версий. Если бы ты сел в машину времени, вернулся на пару лет назад и сказал бы это себе самому тогдашнему, то вернулся бы с синяками на лице |
|
Сообщ.
#1622
,
|
|
|
|
Цитата DesweR @ Цитата ([S]mike @ 27.04.12, 01:43) или веб-разработке можно даже не мечтать. взгляни на первую демку http://unigui.com/demo Кстати у явистов это уже с 2006 года есть, причем бесплатно и от гугла: http://en.wikipedia.org/wiki/Google_Web_Toolkit |
|
Сообщ.
#1623
,
|
|
|
|
Цитата --Ins-- @ Цитата MyNameIsIgor @ Как code style вообще может быть каким-то препятствием для профессионального разработчика? Сбивает с толку и ухудшает восприятие кода. Кого? Стандарт кодирования как раз призван описать соглашения, которому будут следовать все члены команды. Это касается не только стиля именования. |
|
Сообщ.
#1624
,
|
|
|
|
Цитата Мяут-Настоящий @ Кстати у явистов это уже с 2006 года есть, причем бесплатно и от гугла: http://en.wikipedia.org/wiki/Google_Web_Toolkit Более того, это unigui использует разработку компании Sencha - ExtJS. Но Sencha - зарекомендовавшая себя компания, с кучей известных клиентов. А кто является автором UniGui? Будет ли он достаточное время поддерживать проект? Будет ли его развивать, обновлять? Вот почему для Шарпа и Джавы есть все, а Delphi как-то плетется позади, изредка только копируя (и чаще всего неудачно) уже известные проекты? Лично я уже понял, почему. Сейчас я бы тоже не начал ничего писать на Дельфи. |
|
Сообщ.
#1625
,
|
|
|
|
Цитата Астарот @ Если бы ты сел в машину времени, вернулся на пару лет назад и сказал бы это себе самому тогдашнему, то вернулся бы с синяками на лице ![]() На самом деле в перспективности и удобстве Дельфей у меня уже тогда появлялись сомнения. Но с одной стороны не видел альтернативы. С другой стороны ожидал каких-то изменений к лучшему. И свято верил, что Дельфи - это более быстрый нативный код, что дает фору по сравнению с Шарпом или Джавой. Вот например что меня напрочь убивало в Дельфях (модуль System): ![]() ![]() initialization {$IFDEF MSWINDOWS} _InitDelayHelp; InitializeMemoryManager; InitializeLocaleData; // !!! {$ENDIF} Эта процедура InitializeLocaleData имеет одно единственное предназначение: прочитать язык, выбранный по-умолчанию язык приложения в среде Delphi. Я когда-то поимел черт знает сколько мозгоклюйства, когда пробовал запустить на русской винде программу с русской локализацией вне среды. Оказалось эта зараза читает значение из реестра! Смотрим процедуру GetUILanguages. А среда, соответственно, это значение в реестр прописывает! Вот почему на Дельфях не пишут ОС Худшей залипухи я еще не видел.Да, такое есть во всех версиях Дельфи, во всех Дельфи-программах! Потому что модуль System подключается _всегда_. |
|
Сообщ.
#1626
,
|
|
|
|
Цитата [S]mike @ На самом деле в перспективности и удобстве Дельфей у меня уже тогда появлялись сомнения. Но с одной стороны не видел альтернативы. С другой стороны ожидал каких-то изменений к лучшему. И свято верил, что Дельфи - это более быстрый нативный код, что дает фору по сравнению с Шарпом или Джавой. Да нет, я не про то! Я про то, что вот так писать: это ужас-ужас-ужас, ты бы себе лицо за такое набил ![]() Скрытый текст Шучу ![]() |
|
Сообщ.
#1627
,
|
|
|
|
Граммар наци детектед
Скрытый текст Шучу ![]() |
|
Сообщ.
#1628
,
|
|
|
|
Цитата D_KEY @ Стандарт кодирования как раз призван описать соглашения, которому будут следовать все члены команды. Это касается не только стиля именования. Я про отсутствие такового стандарта |
|
Сообщ.
#1629
,
|
|
|
|
Цитата --Ins-- @ Цитата D_KEY @ Стандарт кодирования как раз призван описать соглашения, которому будут следовать все члены команды. Это касается не только стиля именования. Я про отсутствие такового стандарта Вроде как у всех команд он есть. |
|
Сообщ.
#1630
,
|
|
|
|
Цитата [S]mike @ Оказалось эта зараза читает значение из реестра! Смотрим процедуру GetUILanguages. А среда, соответственно, это значение в реестр прописывает! Что то я не нашел здесь упоминания о реестре. ![]() ![]() procedure InitializeLocaleData; begin InitializeCriticalSection(CrSec); CachedLangID := $7f; // LANG_INVARIANT UseThreadUILanguageAPI := (GetVersion and $000000FF) >= 6; if UseThreadUILanguageAPI then begin @GetThreadPreferredUILanguages := GetProcAddress(GetModuleHandle(kernel), 'GetThreadPreferredUILanguages'); @SetThreadPreferredUILanguages := GetProcAddress(GetModuleHandle(kernel), 'SetThreadPreferredUILanguages'); @GetThreadUILanguage:= GetProcAddress(GetModuleHandle(kernel), 'GetThreadUILanguage'); end; end; function GetUILanguages(const LANGID: WORD): string; function LastHyphenPos(S : String) : integer; var I: integer; begin for I := Length(S) downto 1 do if S[I] = '-' then exit (I-1); Result := 0; end; function ConvertResToUILanguages(ResBuffer: PAnsiChar): String; var I: Integer; Separator, ALanguage: String; begin Result := String(PAnsiChar(ResBuffer)); for I := 1 to Length(Result) do if Result[I] = ',' then exit; ALanguage := Result; Result := ''; while ALanguage <> '' do begin Result := Result + Separator + ALanguage; Separator := ','; ALanguage := Copy(ALanguage, 1, LastHyphenPos(ALanguage)); end; end; function GetPreferredLangForOldOS(LANGID: Word): string; var Language, Region : array[0.. LOCALE_NAME_MAX_LENGTH-1] of Char; H, L, I: Cardinal; begin Result := ''; // Lookup exceptional languages table. if (NumberOfLocaleData > 0) and (LocaleTable[0].ID <= LANGID) and (LANGID <= LocaleTable[NumberOfLocaleData-1].ID) then begin H := NumberOfLocaleData-1; L := 0; while H >= L do begin I := (H + L) div 2; if LocaleTable[I].ID > LANGID then H := I - 1 else if LocaleTable[I].ID < LANGID then L := I + 1 else begin Result := ConvertResToUILanguages(LocaleTable[I].List); Break; end; end; end; if (Result = '') and IsValidLocale(LANGID, LCID_SUPPORTED) then begin // Generate language names: <language>-<country> and <language> GetLocaleInfo(LANGID, LOCALE_SISO639LANGNAME, Language, LOCALE_NAME_MAX_LENGTH); GetLocaleInfo(LANGID, LOCALE_SISO3166CTRYNAME, Region, LOCALE_NAME_MAX_LENGTH); Result := String(Language) + '-' + String(Region) + ',' + String(Language); end; end; function CheckDifferentLanguageList(src1, src2: PWideChar; len: integer): boolean; begin Result := True; while len > 0 do begin if (src1^ <> src2^) then exit; inc(src1); inc(src2); dec(len); end; Result := False; end; function ThreadUILanguages(var bufsize: Integer): PWideChar; var I: Integer; begin Result := nil; bufsize := 0; if GetThreadPreferredUILanguages(MUI_LANGUAGE_NAME or MUI_UI_FALLBACK, @I, nil, @bufsize) then begin GetMem(Result, bufsize * sizeof(Char)); GetThreadPreferredUILanguages(MUI_LANGUAGE_NAME or MUI_UI_FALLBACK, @I, Result, @bufsize); end; end; function GetPreferredLangForNewOS(const LANGID: WORD): string; var SavedBufSize, BufSize: Integer; SavedUILanguages, UILanguages: PChar; I: integer; W: WORD; IDBuf: array[0..5] of WideChar; // four digits + two #0 const hexdig: AnsiString = '0123456789ABCDEF'; begin SavedUILanguages := nil; if GetThreadUILanguage <> LANGID then begin SavedUILanguages := ThreadUILanguages(SavedBufSize); W := LANGID; for I := 3 downto 0 do begin IDBuf[I] := WideChar(hexdig[1+ (W and $0F)]); W := W div 16; end; IDBuf[4] := #0; // Double null-terminator. IDBuf[5] := #0; SetThreadPreferredUILanguages(MUI_LANGUAGE_ID, @IDBuf, @I); end; UILanguages := ThreadUILanguages(BufSize); if UILanguages <> nil then begin for I := 0 to BufSize - 2 do if UILanguages[I] = #0 then UILanguages[I] := ','; Result := UILanguages; FreeMem(UILanguages); end; if SavedUILanguages <> nil then begin SetThreadPreferredUILanguages(0, nil, @I); UILanguages := ThreadUILanguages(BufSize); if (SavedBufSize <> BufSize) or CheckDifferentLanguageList(SavedUILanguages, UILanguages, BufSize) then SetThreadPreferredUILanguages(MUI_LANGUAGE_NAME, SavedUILanguages, @I); FreeMem(UILanguages); FreeMem(SavedUILanguages); end; end; var bufSize: Integer; UILanguages: PChar; I: Cardinal; numLang: integer; SavedThreadUILanguage: WORD; begin EnterCriticalSection(CrSec); if CachedLangID = LANGID then begin Result := CachedLanguageNames; LeaveCriticalSection(CrSec); exit; end; LeaveCriticalSection(CrSec); Result := ''; if IsValidLocale(LANGID, LCID_SUPPORTED) then begin if UseThreadUILanguageAPI then Result := GetPreferredLangForNewOS(LANGID) else begin Result := GetPreferredLangForOldOS(LANGID); if LangID <> GetSystemDefaultUILanguage then begin if Result <> '' then Result := Result + ','; Result := Result + GetPreferredLangForOldOS(GetSystemDefaultUILanguage); end; end; end; EnterCriticalSection(CrSec); CachedLangID := LANGID; lstrcpyn(CachedLanguageNames, PChar(Result), SizeOf(CachedLanguageNames)); LeaveCriticalSection(CrSec); end; |
|
Сообщ.
#1631
,
|
|
|
|
Цитата jack128 @ Что то я не нашел здесь упоминания о реестре. Смотри GetLocaleOverride. Добавлено Может оно и не явно вызывается в секции инициализации модуля System, но то что вызывается всегда при старте программы - это точно (в GetResourceModuleName). |
|
Сообщ.
#1632
,
|
|
|
|
О, вспомнил чего мне еще не хватает в Delphi (правда этого нет и в Джаве, как в C# — не знаю):
В Eiffel есть такой клевый терм same, означает он примерно "тот же класс, что и текущий" в контексте описания класса, т.е. например: ![]() ![]() class Object { public boolean equals(same other) { ... } } т.о. во всех наследниках Object метод equals будет требовать объект того же типа, что и сам наследник. Без этой фичи в Джаве местами весьма неудобно пользоваться дженериками. C++-ными шаблонами это хотя бы можно эмулировать. |
|
Сообщ.
#1633
,
|
|
|
|
Цитата korvin @ Это звучит оскорбительно! эмулировать. |
|
Сообщ.
#1634
,
|
|
|
|
Цитата Adil @ Цитата korvin @ Это звучит оскорбительно! эмулировать. ![]() Кстати, че-то не могу сообразить как это будет выглядеть, может подскажет кто? |
|
Сообщ.
#1635
,
|
|
|
|
Цитата korvin @ Кстати, че-то не могу сообразить как это будет выглядеть, может подскажет кто? Я вот тоже не могу представить. Ближайший аналог - имитация примесей при помощи шаблонов. |