Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.007 c
11-1186050008
Andrey_rus
2007-08-02 14:20
2008.03.23
Выравнивание контролов


3-1194080441
aa
2007-11-03 12:00
2008.03.23
ADO Connection


2-1203946490
Alex8
2008-02-25 16:34
2008.03.23
Включение принтера


15-1202565066
vrem_
2008-02-09 16:51
2008.03.23
Фото участников форума, самые новые


4-1178650355
Strate
2007-05-08 22:52
2008.03.23
Опять ListView, изменение колонки.





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