Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2012, 19:31   #1
yaapelsinko
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 67
По умолчанию Очередной Access Violation после Dialog.Execute

Кароче. Весь гугл я уже прочитал, ничего не помогло.

Есть программка, в ней объявляю диалог на открытие файла. Объявляю корректно, это проверено. Когда делаю Диалог.Экзекут - вылетает access violation.

Путём долгих ковыряний я выяснил, что ошибка пропадает, если перестать использовать один мой самописный класс в другом юните.

Интересно то, что перед вызовом диалога я не делаю ничего. Запускается программа, там по созданию формы ничего не происходит, просто инициализируются кинутые на форму визуальные компоненты. Проблемный класс объявлен в приватных (делал и глобальной) переменных формы, создаётся по отдельному событию, не связанному с вызовом диалога и не предшествующим ему.

Иду в меню, щёлкаю на пункт вызова диалога - и трындец.

Код проблемного класса:

Код:
{Модуль доступа к базе данных.}

unit DataAccess;

interface

uses
  Forms, SysUtils, ADODB, DB, Settings;
type

  TSQLSource = class(TObject)
    Connection: TADOConnection;
    Query: TADOQuery;
    Source: TDataSource;

    Constructor Create();
    function ExecuteQuery(Command: string): TDataSource;
  private
  public
  end;

implementation

{Инициализация обёртки}
Constructor TSQLSource.Create();
begin
  //Создаём подключение
  Connection := TADOConnection.Create(nil);

  //Строка подключения формируется в модуле Settings
  Connection.ConnectionString := GetConnectionString();
  Connection.LoginPrompt := false;

  //Создаём запрос
  Query := TADOQuery.Create(nil);
  Query.Connection := Connection;

  //Создаём DataSource для передачи в таблицы и прочие датаконтролы
  Source := TDataSource.Create(nil);
  //Связываем запрос с источником данных
  Source.DataSet := Query;

  //Перерезаем ленточку
  Connection.Open;
end;

// Выполняем запрос Command, возвращаем датасурс,
// который можно передать датаконтролам или промежуточным объектам
// и в дальнейшем все Edit() и Post() вызывать через них.
function TSQLSource.ExecuteQuery(Command: String): TDataSource;
begin
  //Проверка, если вдруг уже открыто
  if not Connection.Connected
    then
      Connection.Open();

  Query.Close();
  Query.SQL.Clear();
  Query.SQL.Add(Command);
  Query.Open();

  //Возвращается свойство TSQLSource.Source, которое уже связано с запросом
  //при инициализации обёртки. Защиты от намеренной отвязки Query от Source нет.
  //Если задать какой-то другой Source.DataSet, то будет возвращаться он, а не
  //датасет запроса.
  result := Source;
end;

end.
Собственно, всё, что там можно напортачить - это указывать нилы при создании, да. Но раньше всё работало и так (в т.ч. и с диалогами). Потом, видимо, где-то ещё в проекте заюзал неправильно. Ладно, я передавал в конструктор те формы, которы создают экземпляры этого класса, и подставлях их в конструкторы компонентов. Не помогло. Все формы сделаны так, что креатятся непосредственно перед использованием и фрятся после закрытия. Все экземпляры этого класса, котрые создаются, объхявлены в переменных самих форм, и, как я понимаю, должны уничтожаться при закрытии оных.

ЧЯДНТ?
yaapelsinko вне форума Ответить с цитированием
Старый 12.02.2012, 19:54   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

1. В деструкторе вашего класса должно быть уничтожение объектов созданных в классе
2. Объект вашего класса никак форме не указывает, что его нужно уничтожать при уничтожении формы. Или укажите или убивайте объекты при уничтожении формы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.02.2012, 20:16   #3
yaapelsinko
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 67
По умолчанию

Не помогло. Даже собственный метод ему написал, который перекрывал базовый деструктор обджекта.

Я тут экспериментировал, сделал тестовый проект в котором заюзал этот модуль. И всё-то там работает. То есть, это в основном проекте я написал какую-то юзалку класса, которая ещё до каких-то действий умудряется что-то поломать. Что там можно такого написать ещё?
yaapelsinko вне форума Ответить с цитированием
Старый 12.02.2012, 21:05   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас в названии теме написано одно, а в теме другое.

так где проблема то?
где процедура с этим диалогом?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.02.2012, 23:17   #5
yaapelsinko
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 67
По умолчанию

Хотите процедуру? А вот она:
Код:
procedure TForm1.ImportXMLClick(Sender: TObject);
begin
  SaveDialog1.Execute;
end;
До неё не происходит вообще ничего, только инициализируется главная форма:
Код:
  TForm1 = class(TForm)
  {тут накиданые на форму стандартные компоненты}
  private
    FilterColumn: string;
    Connection: TSQLSource;
    Bill : ViewRegistry.TBill;
    Sort: string;
    Order: string;
  public
    { Public declarations }
  end;
Никаких дополнительных обработчиков на инициализацию нет. А аксес - виолейшын.

Сомневаюсь, что стало яснее.

Проблема отсутствует на более старых версиях проекта (проверял), хотя там ровно тот же самый предположительно проблемный класс TSQLSource, просто с тех пор что-то было дописано (дополнительные формы, также вызывающие этот класс, но использующие его точно так же, как и те, что сделаны раньше).

Проблема исчезает, если я в главной форме удаляю свойство Connection: TSQLSource, а во всех использующих его процедурах прячу строки с коннекшыном под комментарий. Причём, так эти процедуры заведомо работать не будут (например, DBGrid с неприсвоенным датасетом пошлёт при попытке поредактировать данные), но эти процедуры не выполняются перед попыткой вызова диалога, так что ошибок не возникает. И аксес виолейшена - тоже.

Стоит только вновь всё раскомментировать и сделать возможной работу с коннекшеном - опять ошибка.

Это что, я что-то такое написал, что программа даже компилируется криво?
yaapelsinko вне форума Ответить с цитированием
Старый 12.02.2012, 23:22   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если ошибка возникает при SaveDialog1.Execute(кстати кто проверять результат будет?)
значит у вас не создан этот обьект.

не вижу на форме обьявления этого диалога.
и соответственно возможно он не создан?

вам стоит отладить приложение и выследить причину.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.02.2012, 23:23   #7
dima num
Новичок
Джуниор
 
Регистрация: 12.02.2012
Сообщений: 1
По умолчанию

слушайте и помогите как скачать этот файл или скачать http://dsx86.patrickaalto.com/ dsx86.ini
dima num вне форума Ответить с цитированием
Старый 13.02.2012, 00:37   #8
yaapelsinko
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 67
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
если ошибка возникает при SaveDialog1.Execute(кстати кто проверять результат будет?)
значит у вас не создан этот обьект.

не вижу на форме обьявления этого диалога.
и соответственно возможно он не создан?

вам стоит отладить приложение и выследить причину.
Он кинут на форму в качестве визуального компонента. Следовательно, создан и инициализирован при загрузке. В этом ошибки нет.
yaapelsinko вне форума Ответить с цитированием
Старый 13.02.2012, 00:51   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Он кинут на форму в качестве визуального компонента
Компонент никак не визуальный. А события на компоненте есть прописанные? И вообще, что из вас по слову вытягивать. Если есть возможность проект заархивировать и сюда выложить, то сделайте это. А так ошибки искать пустая трата времени
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.02.2012, 02:04   #10
yaapelsinko
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 67
По умолчанию

Я уже писал - никаких событий перед вызовом компонента не обрабатывается. Вообще. Ни на создание формы, ни на какие-либо действия, совершаемые перед вызовом диалога. Есть обработчики пунктов меню, например - но я вызываю только тот обработчик, который собственно и делает Dialog.Execute.

Проект запросто, только там около сотни килобайт кода в десятке модулей. В аттаче.

Прямо вот запускаете и сразу же бежите в "Файл - Загрузить счёт из файла". Там диалог сохранения на самом деле, а не открытия, но это роли не играет - проблема в самом вызове диалога.
Другие пункты щёлкать смысла нет - либо не заработает, либо будет ошибка, так как требуется сперва подключиться к базе.
Вложения
Тип файла: rar FOMSEditor.rar (494.2 Кб, 7 просмотров)
yaapelsinko вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
access violation ho_N Компьютерное железо 2 30.11.2011 08:36
access violation после завершения работы процедуры Dreanks Помощь студентам 4 15.10.2011 14:02
После выгрузки библиотеки Access Violation evgeso Общие вопросы Delphi 0 13.02.2011 05:27
Что вызывется после Execute у потока? TwiX Общие вопросы Delphi 6 06.05.2010 02:03
Что происходит с потоком после выполнения процедуры Execute? TwiX Общие вопросы Delphi 7 13.12.2009 12:33