Форум: "Начинающим";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];
Внизпроблемы с интерфейсом Найти похожие ветки
← →
чувак (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.pasvar
blabla : ISomeInterface;
unit2.pasuses
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c