Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.23;
Скачать: CL | DM;

Вниз

проблемы с интерфейсом   Найти похожие ветки 

 
чувак   (2008-02-19 23:25) [0]

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


 
Leonid Troyanovsky ©   (2008-02-19 23:26) [1]


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

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

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

--
Regards, LVT.


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

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


 
Джо ©   (2008-02-20 01:09) [3]

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


 
Джо ©   (2008-02-20 01:11) [4]

> [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:25) [5]


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

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


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

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


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

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


 
Amoeba ©   (2008-02-20 02:03) [7]

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


 
Джо ©   (2008-02-20 02:21) [8]

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

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


 
Джо ©   (2008-02-20 02:21) [9]

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


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

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


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


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


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

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


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

> [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 03:30) [13]


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

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


 
Джо ©   (2008-02-20 04:47) [14]

> [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 22:13) [15]

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


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

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


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


 
Джо ©   (2008-02-21 01:12) [16]

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

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

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


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

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


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

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 05:19) [18]

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

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



Страницы: 1 вся ветка

Текущий архив: 2008.03.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
15-1202669039
NaRuTo
2008-02-10 21:43
2008.03.23
Вхождение в другой компьютер!


11-1186397670
Александр 2006
2007-08-06 14:54
2008.03.23
Снова про Proxies.dcu


2-1203861728
batya-x
2008-02-24 17:02
2008.03.23
мерцание на Timage


2-1203691632
махс
2008-02-22 17:47
2008.03.23
TLabeledEdit


2-1203944488
tytus
2008-02-25 16:01
2008.03.23
как Определить имя компа в локальной сети по IP адресу?