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

Вниз

Ошибка EAccessViolation   Найти похожие ветки 

 
Jaxtor   (2002-05-06 11:27) [0]

Подскажите, пожалуйста, как избавиться от ошибки EAccessViolation во время выполнения программы. У меня программа содержит модуль,отображающий главное окно с параметром FormStyle = fsMDIForm и вспомогательное окно со свойством FormStyle = fsMDIChild, в котором находится компонент TMemo.
Задача состоит в том, чтобы при нажатии кнопки TButton на
главной форме в файл сохранялось содержимое TMemo.

Вот код обработчика в главном модуле:

procedure TMainForm.Button1Click(Sender: TObject);
begin
If SaveResultAsDialog.Execute then
SaveResultAsDialog.FileName else
Exit;
MDIChild.Memo1.Lines.SaveToFile(SaveResultAsDialog.FileName);
end;

MDIChild: TMDIChild; - объявление во вспомогательном модуле.


 
Song   (2002-05-06 11:31) [1]

а что такое ... then SaveResultAsDialog.FileName? - это свойство


 
Jaxtor   (2002-05-06 11:37) [2]

SaveResultAsDialog.FileName - это имя выбираемого файла
через SaveResultAsDialog: TSaveDialog;


 
gek   (2002-05-06 11:38) [3]

> Song © (06.05.02 11:31)
Ну а мне, вообще, что-то непонятное...


 
gek   (2002-05-06 11:43) [4]

Эта строчка
If SaveResultAsDialog.Execute then
SaveResultAsDialog.FileName

крайне непонятна. Что именно должно происходить?


 
Jaxtor   (2002-05-06 11:45) [5]

Вот и не получается ничего сделать...
У MDI проекта свои особенности...
Может это глюк в DELPHI?


 
Jaxtor   (2002-05-06 11:54) [6]

If SaveResultAsDialog.Execute then
SaveResultAsDialog.FileName - вызывает диалоговое окно
сохранения файла.


 
gek   (2002-05-06 11:59) [7]

procedure TMainForm.Button1Click(Sender: TObject);
begin
If SaveResultAsDialog.Execute then
MDIChild.Memo1.Lines.SaveToFile(SaveResultAsDialog.FileName)
end


 
Anatoly Podgoretsky   (2002-05-06 12:01) [8]

Приведи реализацию метода SaveResultAsDialog.FileName


 
Jaxtor   (2002-05-06 12:05) [9]


procedure TMainForm.Button1Click(Sender: TObject);
begin
If SaveResultAsDialog.Execute then
MDIChild.Memo1.Lines.SaveToFile(SaveResultAsDialog.FileName)
end

Все равно возникает такая же ошибка!



 
Jaxtor   (2002-05-06 12:11) [10]

Еще раз привожу исходный код:

procedure TMainForm.Button1Click(Sender: TObject);
begin
If SaveResultAsDialog.Execute then
SaveResultAsDialog.FileName else
Exit;
MDIChild.Memo1.Lines.SaveToFile(SaveResultAsDialog.FileName);
end;

Этот метод Button1Click работает при нажатии кнопки типа
TButton на главной форме.
SaveResultAsDialog.Execute - вызывает диалоговае окно сохранения
файла. Exit - это если нажата отмена в окне.
Ошибку EAccessViolation вызывает строка:

MDIChild.Memo1.Lines.SaveToFile(SaveResultAsDialog.FileName);


 
Anatoly Podgoretsky   (2002-05-06 12:15) [11]

Это все понятно, но где реализация метода SaveResultAsDialog.FileName


 
Jaxtor   (2002-05-06 12:20) [12]

Метод SaveResultAsDialog.FileName
- это стандартный метод DELPHI.


 
Anatoly Podgoretsky   (2002-05-06 12:31) [13]

Ты имеешь в виду метод класса TSaveDialog
Так там нет такого метода, а есть свойство строкового типа!
Поэтому конструкция If SaveResultAsDialog.Execute then SaveResultAsDialog.FileName неправомочна.


 
Jaxtor   (2002-05-06 12:36) [14]

Давайте по-другому.
Вот код:

procedure TMainForm.Button1Click(Sender: TObject);
begin
MDIChild.Memo1.Lines.SaveToFile("C:\1.txt");
end;

Возникает такая же ошибка!


 
Anatoly Podgoretsky   (2002-05-06 12:45) [15]

Ошибка где то в MDIChild или около, смею предположить, что MDIChild не существует или имеет неверное значение


 
gek   (2002-05-06 12:47) [16]

EAccessViolation стандарная ошибка.
Нарушениедоступа.
Объект, к которому ты обращаещься скорее всего не создан.


 
Song   (2002-05-06 12:47) [17]

2Jaxtor (06.05.02 12:36)
FileName - это свойство, потому как оно у Вас написано, оно даже не должно компилиться.


 
Jaxtor   (2002-05-06 12:49) [18]

Вот код второго модуля:

unit childwin;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TMDIChild = class(TForm)
Memo1: TMemo;
private
{ Private declarations }
public
{ Public declarations }
end;

var
MDIChild: TMDIChild;

implementation

{$R *.dfm}

end.

Основной модуль использует этот модуль через

uses childwin;


 
Jaxtor   (2002-05-06 12:55) [19]

Song, давайте забудем про FileName.
Вот более упрощенный код(еще раз его пишу):

procedure TMainForm.Button1Click(Sender: TObject);
begin
MDIChild.Memo1.Lines.SaveToFile("C:\1.txt");
end;




 
Nikolay M.   (2002-05-06 13:11) [20]

procedure TMainForm.Button1Click(Sender: TObject);
begin
MDIChild.Memo1.Lines.SaveToFile("C:\1.txt");
end;


почему не поставить breakpoint на эту строчку, если AV вылезает именно на ней?
возможно, MDIChild.Memo1.Lines или MDIChild.Memo1 или MDIChild равны nil?


 
gek   (2002-05-06 13:14) [21]

У тебя создано MDIChild.Memo1 или нет?
т.е. memo вставил туда?


 
Jaxtor   (2002-05-06 13:16) [22]

Да, действительно MDIChild равно nil.
Я думаю, что нужно попробовать создать
объект MDIChild с помощью метода Create.


 
cpp   (2002-05-06 13:21) [23]

Товарищ создай сначала MDIChild. Как только ты его создашь, так сразу у тебя исчезнет твоя ошибка


 
Jaxtor   (2002-05-06 13:28) [24]

Спасибо всем, принявшим участие в этой дискуссии.
Мне стало понятно, почему возникает эта ошибка.



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

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

Наверх




Память: 0.52 MB
Время: 0.019 c
4-64869
Serd_hhc
2002-03-17 10:44
2002.05.20
Хук (или ещё что), не использубю DLL.


1-64750
ymin
2002-05-07 08:58
2002.05.20
А как сделать, чтобы например форма1


3-64554
Vov
2002-04-24 09:56
2002.05.20
Как на клиенте ловить сообщения об update таблицы


1-64646
anod
2002-05-08 11:06
2002.05.20
Множества


3-64547
Hamster
2002-04-24 12:36
2002.05.20
Ещё раз про BDE без Delphi..