Форум: "Прочее";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
ВнизDelphi 2006 Найти похожие ветки
← →
Игорёк (2006-02-25 19:02) [0]Borland Developer Studio 2006.
Уже неделю смотрю на 4 установочных диска и всё никак не решусь переходить или нет со старой доброй 6-й:)
Поясните кто работает в ней, что принципиально новое, толковое появилось?
Да, две версии смогут работать вместе на одном компе?
Пишу так для себя, в свободное время.
Учить наверное дохрена прийдётся, так что если кто знает, подкиньте plees ссылки "для ума". Пока скачал только книгу Дарахвелидзе "Delphi 2005 для Win32".
← →
Суслик © (2006-02-25 19:08) [1]Речь про win32:
1. Вложенные в класс классы и другие типы.
2. Истинные private и protected методы - т.е. из модуля и другими хаками методы недоступны - только классу или потомкам, соответственно.
3. Классы хелперы (пока не разбирался, что это).
4. Переменные классов.
5. Константы в классах.
6. Пара новых визуальных компонентов.
7. Среда более навернутая.
Мое мнение, что язык стал лучше - они тянутся за net и java по ООП. Для любителей внятных ООП решений стало лучше.
← →
Piter © (2006-02-25 19:14) [2]Суслик © (25.02.06 19:08) [1]
Истинные private и protected методы - т.е. из модуля и другими хаками
ну во-первых, из модуля - это был не хак, а вполне задокументированные возможности аля дружественности классов :)
Во-вторых, сильно сомневаюсь, что хаками таки добраться действительно нельзя будет :)
Суслик © (25.02.06 19:08) [1]
4. Переменные классов.
это как?
← →
jack128 © (2006-02-25 19:17) [3]Piter © (25.02.06 19:14) [2]
Ttest = class
private
class var
FClassField: Integer; // единая переменная для всех экземпляров класса
var // начинаются обычные поля
FField: Integer;
end;
Суслик © (25.02.06 19:08) [1]
3. Классы хелперы (пока не разбирался, что это).type
TTest = class
end;
TTestHelper = class helper for TTest
public
class procedure TestProc;
end;
procedure TForm7.FormCreate(Sender: TObject);
begin
TTest.TestProc;
end;
{ TTestHelper }
class procedure TTestHelper.TestProc;
begin
ShowMessage("test");
end;
Так ты можешь создать свой метод(не обязательно классовый), например, в TDataSet, не переписывая исходников db.pas
← →
Гаврила © (2006-02-25 19:23) [4]+ методы в record
+ директива Final (запрет дальнейшего наследования)
удобно.
← →
jack128 © (2006-02-25 19:30) [5]Гаврила © (25.02.06 19:23) [4]
+ директива Final (запрет дальнейшего наследования)
это запрет ПЕРЕКРЫТИЯ виртуальных методов. А sealed не работает(в win32 по крайней мере)
← →
API (2006-02-25 19:32) [6]создать свой метод(не обязательно классовый), например, в TDataSet, не переписывая исходников db.pas
Класс! А зачем?
← →
Игорёк (2006-02-25 19:35) [7]Поставил всё-таки.
Главное и 6-я осталась работать (думал может где пересекутся).
Мда.., дохрена наворотили.
Теперь и си прийдётся учить, - привлекательно всё выгдядит.
Ещё бы эксплоиты никса компилила:)
Чёрт нашёл себе занятие на вечера, полгода наверное прийдётся учить.
Зато меньше водки теперь выпью:)
Насёт Helpers"а:
Using Class Helpers
The following code demonstrates the declaration of a class helper:
type
TMyClass = class
procedure MyProc;
function MyFunc: Integer;
end;
...
procedure TMyClass.MyProc;
var X: Integer;
begin
X := MyFunc;
end;
function TMyClass.MyFunc: Integer;
begin
...
end;
...
type
TMyClassHelper = class helper for TMyClass
procedure HelloWorld;
function MyFunc: Integer;
end;
...
procedure TMyClassHelper.HelloWorld;
begin
writeln(Self.ClassName); // Self refers to TMyClass type, not TMyClassHelper
end;
function TMyClassHelper.MyFunc: Integer;
begin
...
end;
...
var
X: TMyClass;
begin
X := TMyClass.Create;
X.MyProc; // Calls TMyClass.MyProc
X.HelloWorld; // Calls TMyClassHelper.HelloWorld
X.MyFunc; // Calls TMyClassHelper.MyFunc
Note that the class helper function MyFunc is called, since the class helper takes precedence over the actual class type.
← →
Гаврила © (2006-02-25 19:36) [8]
> jack128 ©
> это запрет ПЕРЕКРЫТИЯ виртуальных методов
Верно
> А sealed не работает(в win32 по крайней мере)
Неверно. Работает все
← →
Eraser © (2006-02-25 19:38) [9]
> Игорёк (25.02.06 19:35) [7]
> Теперь и си прийдётся учить
зачем?
> Чёрт нашёл себе занятие на вечера, полгода наверное прийдётся
> учить.
что учить то-то? по сравнению с 6 изменений не так уж и много в win32.
> Насёт Helpers"а:
ну да! справкой пользоваться вот уже научился :-)
← →
jack128 © (2006-02-25 19:43) [10]API (25.02.06 19:32) [6]
Ну как те сказать.. Вот например у TIBSQL нету такого метода FindParam(const ParamName: string): TIBXSQLVAR; есть только ParamByName , но мне лениво каждый раз прехватывать исключения. я написал функцию
function IBSQL_FindParam(SQL: TIBSQL; ParamName: string): TIBXSQLVAR; , но согласись, насколько более красиво смотрится
Param := IBSQL.FindParam("ParamName"); по сравнению с
Param := IBSQL_FindParam(IBSQL, ParamName);
И подобных функций у меня весьма приличное количество..
← →
API (2006-02-25 19:44) [11]Так все же, зачем помещать новый метод в готовый класс?
← →
Игорёк (2006-02-25 19:44) [12]
> > Теперь и си прийдётся учить
>
> зачем?
Никогда не помешает:)
Много есть интересного сишного кода, теперь переписывать не прийдётся, чуть подучить только, что бы ясно картину представлять.
← →
jack128 © (2006-02-25 19:46) [13]Гаврила © (25.02.06 19:36) [8]
Неверно. Работает все
БЛИН!!!! Глючит меня. Я всё пытался TTest = sealed class написать..
← →
API (2006-02-25 19:52) [14]2 jack128
Спасибо за объяснение.
Но такие вопросы обычно решаются путем наследования.
Вот я сижу и философствую о новой парадигме...
← →
Eraser © (2006-02-25 19:53) [15]
> Игорёк (25.02.06 19:44) [12]
так и раньше можно было! при помощи BC++ builder"а :-)
← →
jack128 © (2006-02-25 19:53) [16]API (25.02.06 19:52) [14]
Но такие вопросы обычно решаются путем наследования
и каким образом тебе бы помогло наследовае в данном случае? (жесткое условие - исходники ibsql - не трогать!)
← →
Гаврила © (2006-02-25 19:55) [17]
> API
> Но такие вопросы обычно решаются путем наследования.
Не всегда они решаются.
Вот как, например, добавить новый метод в TStrings?
если уже заведомо имеется множество готовых наследников
теже Tmemo.Lines, TComboBox.Items, и так далее
все наследовать?
← →
API (2006-02-25 19:56) [18]jack128 © (25.02.06 19:53) [16]
TIBSQLEx = class(TIBSQL)
public
function FindParam(const ParamName: string): TIBXSQLVAR;
end;
Как-то так, наверное...
← →
Piter © (2006-02-25 20:00) [19]jack128 © (25.02.06 19:17) [3]
private
class var
FClassField: Integer; // единая переменная для всех экземпляров класса
var // начинаются обычные поля
а-а-а, ясно... Типа как переменная в модуле, но доступная только классу, удобно!
jack128 © (25.02.06 19:17) [3]
Классы хелперы
а вот это здорово! Черт возьми, здорово! :)
Только по коду непонятно... Я, вероятно, должен наследоваться от класса хелпера - тогда получу весь функционал того класса + то что в хелпере реализовано?
jack128 © (25.02.06 19:17) [3]
class procedure TTestHelper.TestProc
соответственно, в такой процедуре (если не классовая) Self будет указывать на экземпляр TTest?
Вот это удобно.
А если в классе хелпере перекрывается метод? Он будет перекрыт на самом деле? А можно так перекрыть виртуальные методы?
← →
API (2006-02-25 20:04) [20]Гаврила © (25.02.06 19:55) [17]
Ага. Понятно. Машина времени...
← →
Eraser © (2006-02-25 20:06) [21]
> Piter © (25.02.06 20:00) [19]
> Я, вероятно, должен наследоваться от класса хелпера - тогда
> получу весь функционал того класса + то что в хелпере реализовано?
>
нет! то что ты описал - обычное наследование, а фишка в том, что экземпляры класса, к которому написан хелпер имеют свою функц-ть + хелпера.
> А если в классе хелпере перекрывается метод?
да.
← →
Piter © (2006-02-25 20:15) [22]Eraser © (25.02.06 20:06) [21]
нет! то что ты описал - обычное наследование
тьфу, меня проглючило :)
Eraser © (25.02.06 20:06) [21]
непонятен механизм работы. То есть, нужно только объявление хелпера? В любом модуле, подключенном к проекту есть объявление хелпера - и при компиляции он подключается, так?
А в какой последовательности? В последовательности инициализации модулей с хелперами?
Как пример - подключены 2 хелпера, оба из которых перекрывают метод класса-жертвы :)
В какой последовательности будет перекрытие и кто перекроет последним? :)
P.S. Подумав, решил... Функция, несомненно, ОООЧЕНЬ удобная, но все таки это костыль и уход от строгости ООП. Фактически, легкий способ заткнуть погрешности проектирования.
Создает неочевидность... Наследуешься от класса, видишь код этого класса - вроде все ок. А тут бац, а функционал при комплиляции как вариант оказывается немного другой.
← →
Eraser © (2006-02-25 20:20) [23]
> Piter © (25.02.06 20:15) [22]
> А в какой последовательности? В последовательности инициализации
> модулей с хелперами?
Я думаю, что если хелпер объявлен в интерфейсной части, то он будет применён ко всему модулю + модулям у которых данный модуль в uses. Если в раелизации модуля, то распространиться только на текущий модуль. Если внутри процедуры/метода, то на текущую процедуру/метод.
> P.S. Подумав, решил... Функция, несомненно, ОООЧЕНЬ удобная,
> но все таки это костыль и уход от строгости ООП. Фактически,
> легкий способ заткнуть погрешности проектирования.
с тобой согласны в Борланде ;-)
Class helpers provide a way to extend a class, but they should not be viewed as a design tool to be used when developing new code. They should be used solely for their intended purpose, which is language and platform RTL binding.
← →
API (2006-02-25 20:36) [24]А что слышно насчет багов?
Версия-то еще сырая пока.
← →
Eraser © (2006-02-25 20:47) [25]
> API (25.02.06 20:36) [24]
возможно баги и есть, но я вот уже несколько недель пользуюсь... IDE очень стабильная.
← →
Суслик © (2006-02-25 20:49) [26]да, забыл:
1. про sealed (вопреки мнению Jack128 для классов данная штука работает, т.е. класс унаследовать нельзя).
2. методы в записях + переопределение операций в записях (в классах нет).
большой недостаток - плохая документация. т.е. как пользоваться может и поймешь, но не исключительно из доки - нужно ставить опыты.
← →
Марик (2006-02-25 20:51) [27]Declaring Nested Types
The nestedTypeDeclaration follows the type declaration syntax defined in Declaring Types .
type
className = class [abstract | sealed] (ancestorType)
memberList
type
nestedTypeDeclaration
memberList
end;
Nested type declarations are terminated by the first occurance of a non-identifier token, for example, procedure, class, type, and all visibility scope specifiers.
The normal accessibility rules apply to nested types and their containing types. A nested type can access an instance variable (field, property, or method) of its container class, but it must have an object reference to do so. A nested type can access class fields, class properties, and class static methods without an object reference, but the normal Delphi visibility rules apply.
Nested types do not increase the size of the containing class. Creating an instance of the containing class does not also create an instance of a nested type. Nested types are associated with their containing classes only by the context of their declaration.
Declaring and Accessing Nested Classes
The following example demonstrates how to declare and access fields and methods of a nested class.
type
TOuterClass = class
strict private
myField: Integer;
public
type
TInnerClass = class
public
myInnerField: Integer;
procedure innerProc;
end;
procedure outerProc;
end;
To implement the innerProc method of the inner class, you must qualify its name with the name of the outer class. For example
procedure TOuterClass.TInnerClass.innerProc;
begin
...
end;
To access the members of the nested type, use dotted notation as with regular class member access. For example
var
x: TOuterClass;
y: TOuterClass.TInnerClass;
begin
x := TOuterClass.Create;
x.outerProc;
...
y := TOuterClass.TInnerClass.Create;
y.innerProc;
Nested Constants
Constants can be declared in class types in the same manner as nested type sections. Constant sections are terminated by the same tokens as nested type sections, specifically, reserved words or visibility specifiers. Typed constants are not supported, so you cannot declare nested constants of value types, such as Borland.Delphi.System.Currency , or Borland.Delphi.System.TDateTime .
Nested constants can be of any simple type: ordinal, ordinal subranges, enums, strings, and real types.
The following code demonstrates the declaration of nested constants:
type
TMyClass = class
const
x = 12;
y = TMyClass.x + 23;
procedure Hello;
private
const
s = "A string constant";
end;
begin
writeln(TMyClass.y); // Writes the value of y, 35.
end.
← →
Гаврила © (2006-02-25 20:53) [28]
> API
> Машина времени...
В каком смысле?
> А что слышно насчет багов?
Более-менее нормально все. С 2005 не сравнить
← →
Суслик © (2006-02-25 20:55) [29]abstract, хоть и декларирован, но не работает в win32.
← →
Суслик © (2006-02-25 20:57) [30]В ИДЕ есть еще такая фишка - регионы. Берешь кусок кода, за который тебе стыдно, но который делает кучу полезной работы, оборачиваешь его в регион, скрываешь. Более ты его не увидишь (если явно не раскроешь).
На мой взгляд полезная фича для оформления кода.
← →
iZEN © (2006-02-25 23:49) [31]>Игорёк (25.02.06 19:02)
>Пока скачал только книгу Дарахвелидзе "Delphi 2005 для Win32".
А можно ссылку для закачки этой книжки в izen@mail.ru ?
← →
0bsid © (2006-02-26 12:41) [32]
> >Игорёк (25.02.06 19:02)
> >Пока скачал только книгу Дарахвелидзе "Delphi 2005 для
> Win32".
> А можно ссылку для закачки этой книжки в izen@mail.ru ?
>
книжка весит 139 мегов
http://libray.narod.ru/PDF/delphi2005win32.htm
думаю проще в магазин схидить и купить
← →
@BraIN © (2006-02-26 14:00) [33]А кто-нибудь устанавливал BDS2006 (Ent) вместе с 2005 (Architect), с последующим удалением 2005? Возникали ли какие-либо проблемы при этом?
← →
ZeroDivide © (2006-02-26 14:32) [34]
> > А что слышно насчет багов?
>
>
> Более-менее нормально все. С 2005 не сравнить
Да дырявое все насквозь. Особенно убивает сообщение типа "Была ошибка в designide100. Все равно сохранить?".
Ну я и... сохранил однажды... и ДЕЙСТВИТЕЛЬНО очень сильно пожалел.
← →
iZEN © (2006-02-26 23:54) [35]0bsid © (26.02.06 12:41) [32],
сурово.
В HTML-формате есть?
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.013 c