Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.011 c
2-1141048637
Hadroran
2006-02-27 16:57
2006.03.19
Обновление с проблемой


5-1127302633
RDS
2005-09-21 15:37
2006.03.19
Access violation in design time


2-1141574369
Ventures
2006-03-05 18:59
2006.03.19
Как открыть файл.


2-1140208811
Saimon
2006-02-17 23:40
2006.03.19
Как добиться в дельфи, чтобы форма была на уровне рабочего...


6-1133221717
Volf_555
2005-11-29 02:48
2006.03.19
Как в Delphi изменить IP и MAC-адреса сетевой карты?





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