Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблемы с интерфейсом


чувак ©   (2008-02-19 23:25:00) 

Ситуация такая: есть unit1.pas и unit2.pas . В 1-ом файле в разделе глобальных переменных записана переменная - интерфейс, а во втором некий класс, в одном из методов которого ведется работа с этим интерфейсом. Проблема в том что никакой работы не ведется, а вылетает ошибка "... read of adress 00000000" . Не пойму почему не работает. Может быть умные головы мне помогут ???


Джо   (2008-02-21 05:19:00) [1]

> Проще я думаю все-таки использовать глоб. переменную

Нет, это не проще. Ибо «неожиданности» изложенные в вашем самом первом посте — это только «цветочки».


чувак   (2008-02-21 04:16:00) [2]

> ЗАЧЕМ в глобальных переменных, если можно записать в поле
> класса?


Так можно сделать если класс всего один будет. Но у меня их несколько! И получится примерно такой ужас:

class2 := TClass2.Create(class1.FSome);.

Проще я думаю все-таки использовать глоб. переменную

var
a : TClass1; b : TClass2; c : ISome;

begin
a := TClass1.Create(c); b := TClass2.Create(c);
end.


Джо   (2008-02-21 01:12:00) [3]

> [15] чувак   (20.02.08 22:13)

> Но ведь параметр Some: ISome прежде чем передовать, нужно
> где-то записать ? Где еще как не в глобальных переменных

Ей, богу это даже смешным становится :) Вы читаете вообще?
ЗАЧЕМ в глобальных переменных, если можно записать в поле класса?


чувак   (2008-02-20 22:13:00) [4]

> Если же это не подходит в силу ряда причин


Да, не подходит, я уже писал почему.

> constructor TClass2.Create (const Some: ISome);


Но ведь параметр Some: ISome прежде чем передовать, нужно где-то записать ? Где еще как не в глобальных переменных ? В итоге получаются те же тапки только в профиль...


Джо   (2008-02-20 04:47:00) [5]

> [10] чувак   (20.02.08 02:51)
> > [8] Джо ©   (20.02.08 02:21)
>
>
> Спасибо, так работает. Только вся красота кода потерялась,
> приходиться теперь постоянно подставлять лишние параметры.

Убив ненужную глобальную переменную, мы УЖЕ сделали код «красивей», чем он был. Это раз.
И второе. Когда код нормально организован (например, без ненужных глоб. переменных), он гораздо лучше поддается рефакторингу.
Например, в случае, когда классу постоянно передается один и тот же параметр, разумно этот параметр сделать ЕГО внутренним полем. И ничего никуда передавать не нужно.
Если же это не подходит в силу ряда причин (лень не входит в их число), то можно еще проще — ссылку на интерфейс передавать ЕДИНОЖДЫ, например, в конструкторе:

TClass2 = class
private
 FSome: ISome;
public
 constructor Create (const Some: ISome);
 procedure DoIt1;
 procedure DoIt2;
end;

...
constructor TClass2.Create (const Some: ISome);
begin
 FSome := Some
end;

procedure TClass2.DoIt1;
begin
 FSome.Some();
end;

procedure TClass2.DoIt2;
begin
 FSome.Some2();
end;

И опять же ничего передавать не нужно будет.
И это есть «красиво».

А когда глобальная переменная, в которую каждый может залезть и записать туда чего хошь — это не «красиво».


Германн   (2008-02-20 03:30:00) [6]


> чувак   (20.02.08 03:17) [12]

И почему меня ругают все родственники, за мою "отрыжку"?


чувак   (2008-02-20 03:17:00) [7]

> [11] Германн ©   (20.02.08 02:55)


Я думаю что код здесь не играет никакой роли. Там примерно так:

unit1.pas

var
blabla : ISomeInterface;


unit2.pas

uses
unit1.pas

type someclass = class
procedure foo;
end;

procedure someclas.foo;
begin
blabla.somemethod; // ТУТ ОШИБКА ВЫВАЛИВАЕТСЯ
end;


Германн   (2008-02-20 02:55:00) [8]


> чувак   (20.02.08 02:51) [10]

А "Amoeba ©   (20.02.08 02:03) [7]" прочитал? Или проигнорировал, считая себя "крутым чуваком"?


чувак   (2008-02-20 02:51:00) [9]

> [8] Джо ©   (20.02.08 02:21)


Спасибо, так работает. Только вся красота кода потерялась, приходиться теперь постоянно подставлять лишние параметры.


Джо   (2008-02-20 02:21:00) [10]

Причем здесь вообще формы? Абсолютно не при чем.


Джо   (2008-02-20 02:21:00) [11]

> [6] чувак   (20.02.08 01:57)
> > [4] Джо ©   (20.02.08 01:11)
>
>
> Применить общий подход не представляется возможным, потому
> что в программе нет форм.

Нет ничего проще объявить этот интерфейс или приватным или публичным полем класса. А в классах, которые ее используют, передавать его в параметрах метода. Это как пример.
И вряд ли чего тут можно сказать более конкретное, ибо см.:  [7] Amoeba.


Amoeba   (2008-02-20 02:03:00) [12]

Код приведи, а то чего гадать, какой там у тебя глюкодром получился.


чувак   (2008-02-20 01:57:00) [13]

> [4] Джо ©   (20.02.08 01:11)


Применить общий подход не представляется возможным, потому что в программе нет форм.

С этим интерфейсом должны работать несколько классов и функций одновременно. Я ничего лучше не придумал, как записать его в отдельном файле в глоб. переменных, а потом просто подставлять куда нужно. И главное в функциях все прекрасно работает, а вот в методах классов нет .....


Германн   (2008-02-20 01:25:00) [14]


> Все просто и без сомнительных решений (глоб. переменные).
>
>

А всё равно работать не будет. "Коль сапоги начнёт тачать пирожник...". Чувакам не стоит программировать. Не их это дело. Что и подтверждается самим стилем вопроса.
:)


Джо   (2008-02-20 01:11:00) [15]

> [3] Джо ©   (20.02.08 01:09)
> Объясните, зачем «в 1-ом файле в разделе глобальных переменных
> записана переменная»?

Пока же, не зная ответ на этот вопрос, предлагаю общий подход:

TForm1 = class
private
 FSome: ISome;
end;

TForm2 = class
public
 procedure DoIt (const Some: ISome);
end;

Все просто и без сомнительных решений (глоб. переменные).


Джо   (2008-02-20 01:09:00) [16]

Объясните, зачем «в 1-ом файле в разделе глобальных переменных записана переменная»?


чувак   (2008-02-19 23:48:00) [17]

И ? Как нужно исправить программу чтобы все работало?


Leonid Troyanovsky   (2008-02-19 23:26:00) [18]


> чувак   (19.02.08 23:25)  

> Ситуация такая: есть unit1.pas и unit2.pas . В 1-ом файле
> в разделе глобальных переменных записана переменная -

Глобальные переменные - MD.

--
Regards, LVT.


Наверх

Титульная страница Поиск, карта сайта Написать письмо