Форум: "Основная";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
ВнизОшибка доступа. Срочно ! Найти похожие ветки
← →
Сергей Резников (2003-12-12 12:15) [0]Следующая проблема:
МДИ-приложение; в дочерней форме объявлено:
type
TNewLang = (lngRus, lngEng);
в описании доч. формы:
public
{ Public declarations }
NewLang: TNewLang;
при вызове в доч. форме NewLang := lngRus; или в род. (MainForm.ActiveMDIChild as TNewChildForm).NewLang := lngRus; происходит ошибка доступа. Почему ?
← →
Sandman25 (2003-12-12 12:36) [1]Потому что MainForm.ActiveMDIChild = nil или указывает на объект, который не является TNewChildForm
← →
Сергей Резников (2003-12-12 12:42) [2]Я сам генирирую эту форму.
← →
Сергей Резников (2003-12-12 12:43) [3]Я сам генирирую эту форму. И кроме того, что мешает NewLang := lngRus; внутри дочерней ???
← →
Sandman25 (2003-12-12 12:45) [4]MainForm.ActiveMDIChild = nil
← →
Silver Alex (2003-12-12 12:48) [5]код бы глянуть
← →
Сергей Резников (2003-12-12 12:49) [6]Кхе, кхе: второе предложение: "что мешает NewLang := lngRus; внутри дочерней ???": то бишь, что мешает присвоить значение переменной формы внутри её же ?
← →
Плохиш_ (2003-12-12 12:52) [7]>Сергей Резников © (12.12.03 12:49) [6]
Все телепаты в зимней спячке!
А без них только ошибка в 17й строке виновата ;-)
← →
Sandman25 (2003-12-12 12:52) [8]Присоединяюсь к [5] Silver Alex © (12.12.03 12:48)
← →
Сергей Резников (2003-12-12 12:53) [9]
> Silver Alex © (12.12.03 12:48) [5]
> код бы глянуть
Короче: в "паблике" TNewChildForm прописано: NewLang: TNewLang;. При попытке: NewLang := lngRus; внутри NewChildForm происходит ошибка доступа. Тип TNewLang = (lngRus, lngEng);
← →
Сергей Резников (2003-12-12 12:55) [10]
> Плохиш_ (12.12.03 12:52) [7]
:-|
← →
Sandman25 (2003-12-12 12:55) [11]При попытке: NewLang := lngRus; внутри NewChildForm происходит ошибка доступа
Что такое внутри
← →
Сергей Резников (2003-12-12 13:00) [12]
> Sandman25 © (12.12.03 12:55) [11]
То бишь, даже не в основной форме код этот вызывает ошибку, но и в дочерней.
← →
Sandman25 (2003-12-12 13:03) [13][12] Сергей Резников © (12.12.03 13:00)
И какую ошибку?
type TChildForm = class...
...
NewLang: TNewLang;
end;
procedure TChildForm.AnyMethod;
begin
NewLang := TNewLang(lngRus);
вызывает Access Violation?
Не верю (c)
end;
← →
Сергей Резников (2003-12-12 13:07) [14]
> NewLang := TNewLang(lngRus);
А разве не NewLang := lngRus ?
← →
Sandman25 (2003-12-12 13:08) [15][14] Сергей Резников © (12.12.03 13:07)
Можно и так.
Все равно не верю :)
← →
Сергей Резников (2003-12-12 13:11) [16]Я сожелею конечно, но it doesn`t work !
← →
Sandman25 (2003-12-12 13:15) [17]А так?
NewLang := TNewLang(0)
То есть ставите break point на этой строке и при ее выполнении получаете AV???
← →
Сергей Резников (2003-12-12 13:19) [18]Никак !
> То есть ставите break point на этой строке и при ее выполнении
> получаете AV???
Да.
← →
Сергей Резников (2003-12-12 13:22) [19]Ещё раз подчеркну, что NewLang объявлена в Public declarations.
← →
Sandman25 (2003-12-12 13:26) [20][19] Сергей Резников © (12.12.03 13:22)
Да какая разница, где он объявлен.
Я в таком случае выхожу из Delphi и захожу заново. Обычно помогает.
← →
Сергей Резников (2003-12-12 13:29) [21]Это не тот случай, когда "обычно" :-((( Не помогло !
← →
Сергей Резников (2003-12-12 13:31) [22]И ещё: при сравнении в основной форме: if (MainForm.ActiveMDIChild as TNewChildForm).NewLang = lngRus та же ошибка.
← →
Sandman25 (2003-12-12 13:32) [23]Хотел спросить, какая версия Delphi, потом увидел.
Не зря я отказался от Delphi 7.
← →
Сергей Резников (2003-12-12 13:35) [24]Дельфи здесь не причём, ибо похожий проект с 6-го прекрасно работает.
← →
Sandman25 (2003-12-12 13:37) [25][24] Сергей Резников © (12.12.03 13:35)
Тогда хватит объяснять на словах. Пора уже нормально показать весь код, относящийся к делу.
← →
Сергей Резников (2003-12-12 13:44) [26]Дочерняя:
type
TChildForm = class(TForm)
PageControl: TPageControl;
.....................
private
{ Private declarations }
public
{ Public declarations }
ScriptLanguage: TScriptLanguage;
......................
published
{ Published declarations }
procedure SetParserLanguage(Lang: TScriptLanguage);
end;
procedure TChildForm.SetParserLanguage(Lang: TScriptLanguage);
begin
if Lang = slJS then
begin
ScriptLanguage := slJS;
..................................
end;
Основная:
procedure TMainForm.TBarLanguageChange(Sender: TObject;
const Text: String);
begin
if Text = "JavaScript" then MDIChild.SetParserLanguage(slJS);
.................
end;
где MDIChild := (MainForm.ActiveMDIChild as TChildForm)
в обе формы инклюдится файл, где
type
TScriptLanguage = (slVBS, slJS, slBAT);
← →
Sandman25 (2003-12-12 13:48) [27]в обе формы инклюдится файл, где
type
TScriptLanguage = (slVBS, slJS, slBAT);
Неправильно. Это получаются разные типы!
Оба модуля должны использовать (uses) файл, в котором в Interface описан этот тип.
← →
Сергей Резников (2003-12-12 13:49) [28]unit Common;
interface
type
TScriptLanguage = (slVBS, slJS, slBAT);
и во всех в uses Common
← →
Сергей Резников (2003-12-12 13:59) [29]Это я имею в виду, что у меня так и есть.
← →
Сергей Резников (2003-12-12 14:10) [30]Всё ! Всё работает !!! После перезагрузки винды ;-)))
← →
Плохиш_ (2003-12-12 14:15) [31]>Сергей Резников © (12.12.03 13:44) [26]
> где MDIChild := (MainForm.ActiveMDIChild as TChildForm)
MainForm.ActiveMDIChild = nil
← →
Sandman25 (2003-12-12 15:24) [32][30] Сергей Резников © (12.12.03 14:10)
Я обедал.
Я же говорил, что нужно из Delphi выйти :) Иногда и из Windows.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.01 c