| Структура программирования, программирование, языки программирования, книги программирование | На сайте представлена информация про программирование в Интернете и работу |
|
Дружественные классы в Delphi, Как бы сделать? КВадратное уравнение, обычная программа с дискриминантом :Определитель номера, :Определитель номера I/O Error 32 при редактировании файла Как запонить StringGrid из текстового файла Подобие Drag&Drop Как можно связать TTreeView с базой?, может кто сталкивался? Разделу нужна помощь, Заполнение FAQ Cоединение 2-х html-ин, в дельфе ???, Есть процеда, или все ручками делать ??? Компоненты Current Project, AllDataBaseDiagrams Блокировка клавиатуры (временная), в WinXP ??? - вместо текста Delphi without BDE, Установка Delphi RichEdit, Подсветка синтаксиса! |
Платные хостинги Раскрутка сайта Книги по программированию Дружественные классы в Delphi, Как бы сделать?
- Здравствуйте! Идея такая. Есть два класса A и B. Они находятся в разных файлах. У класса A есть свойство типа B, а у класса B есть свойство типа A. Можно ли как-нить это дело организоват? Половинчатное решение я уже нашёл... А теперь перейдём к дружественным классам. Можно ли в Delphi сделать так, чтобы класс A имел доступ к private-свойствам класса B, если эти классы находятся в разных файлах? В C++ для этого есть специальное ключевое слово friend для указания дружественного класса, а вот как в Delphi сделать - не знаю Помогите, пожалуйста, советом!Спасибо! - Vitalik В Дельфи понятия дружественных классов нет Это сообщение отредактировал <Spawn> - 11.11.2004, 14:33 - <Spawn>, а можно как-нибудь добиться похожего эфекта?Ну просто очень нужно решить эту проблему. Есть два больших класса и я разбил их на два файла. Но ээти классы немного связаны друг с другом и один класс должен иметь доступ к private-свойствам другого класса. Пока что я просто эти свойства объявил как public, но это не есть хорошо - Сорри, предыдущий пост был мой.Это я с компьютера брата сообщение хотел отослать и забыл перелогиниться - Можно через include файл - т.е. физически файлов будет 2, но логически Дельфи их будет интерпретировать как один... - Но весь класс со всеми функциями наверное не получится выделить в один файл. Ведь interface и implementation секций в файле может быть только по одной?А если выделить в файл только функции, то нельзя будет пользоваться всеми прелестями Delphi (Ctrl+Shift+Вниз, Ctrl+[щелчек по функции] и т.д...)! Неужели решения этой проблемы не существует? - Думаю что не существует - http://www.google.kz/search?q=cache:rLQadD...lient=firefox-aИнтересно, что имел ввиду автор?Вот прямой линк, без подсветки слов. http://books.dore.ru/bs/f11bid821.html - Возможно он говорил про классы в одном юните... - Я нашел решение неплохое решение второй проблемы (про дружественные классы)Правда private-переменные придётся сделать protected - но это того стоит.Ниже привожу рабочий пример решения следующей проблемы: Есть класс MainClass, который должен получить доступ к private-переменной класса SomeClass (правда через protected-свойство).Код unit MainClass;interfaceuses SomeClass;type { Главный класс программы } TMainClass = class private { Дополнительный класс программы, но главный класс должен иметь полный доступ к его свойствам } SomeClass: TSomeClass; public { Конструктор главного класса } constructor Create(); { Процедура, в которой осуществляется доступ к private-переменной класса TSomeClass } function SetPrivateProperty(Value: integer): integer; end;type { Гениальная идея предложенная Rouse_ } TMySomeClass = class(TSomeClass);implementationconstructor TMainClass.Create();begin SomeClass := TSomeClass.Create();end;function TMainClass.SetPrivateProperty(Value: integer): integer;begin TMySomeClass(SomeClass).SomeProperty := Value; Result := SomeClass.GetPrivateProperty;end;end.highlightSyntax('delphijJlODc','delphi');Код unit SomeClass;interfacetype { Дополнительный класс программы, но главный класс должен иметь полный доступ к его свойствам } TSomeClass = class private { Скрытое свойство, которое не должен видеть никто, кроме TMainClass } fPrivateProperty: integer; { Процедура установки значения fPrivateProperty } procedure SetPrivateProperty(Value: integer); public { Только для проверки правильности работы } function GetPrivateProperty(): integer; protected { Свойство, через которое TMainClass получает доступ к fPrivateProperty } property SomeProperty: integer read GetPrivateProperty write SetPrivateProperty; end;implementationprocedure TSomeClass.SetPrivateProperty(Value: integer);begin fPrivateProperty := Value;end;function TSomeClass.GetPrivateProperty(): integer;begin Result := fPrivateProperty;end;end.highlightSyntax('delphiGJmN2Q','delphi');Проверка работы:Код procedure TForm1.Button1Click(Sender: TObject);var MainClass: TMainClass;begin MainClass := TMainClass.Create(); Label1.Caption := IntToStr(MainClass.SetPrivateProperty(StrToInt(Edit1.Text)));end;highlightSyntax('delphijZjRlY','delphi'); - По-моему я тебе эту идею говорил больше года назад... Ты сказал тогда что это не то... - В принципе есть половинчитое решение: объявить нужное свойство protected, а в другом юните унаследовать от него fake класс, в котором это свойство передекларировать. Тогда можно свойство останеться невидимым для клиента, но будет видимым для твоего второго класса. Не знаю, это ли решение ты имел в виду. Добавлено @ 20:13 Ага, ну вот это же самое и я имел в виду. - Fantasist - может через множественное наследование интерфейсов можно выкрутится? |