Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> A call to an OS function failed, Что за сообщение? 
:(
    Опции темы
ilya198293
Дата 30.5.2007, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 17.3.2007
Где: Сириус, созвездие Большого Пса

Репутация: нет
Всего: нет



В моём приложении несколько форм:
из формы 1 вызываю форму 2:
Код

Application.CreateForm(TForm2, Form2);
Form2.Show;

при закрытии формы 2 стоит обработчик событий:
Код

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Form2.Free;
end;

без такого обработчика форма не закрывается, а просто становится невидимой.
последовательность открытия и закрытия делаю 24 раза и на 25 выходит сообщение "Error reading ComboBox1.Items.Strings: A call to an OS function failed."
Причём первых 24 раза обрабатывается всё нормально. Результат работы формы 2 зависит от настроек формы 1. При разных настройках всё тоже работает, но до 25 раза.
Что это значит и как это победить?
--------------------
Недавно пытался объяснить сыну, кто такой модератор. Сошлись на Мойдодыре.
PM MAIL   Вверх
ama_kid
Дата 30.5.2007, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Цитата(ilya198293 @  30.5.2007,  08:58 Найти цитируемый пост)
Что это значит и как это победить?
Это значит, что у тебя идет неправильная работа с памятью... Я с такой проблемой не сталкивался, ибо таким варварским способом не освобождал форму, навскидку вижу проблему в том, что у тебя из обработчика формы непосредственно идет вызов деструктора. А ведь сказано в хелпе:
Цитата
Warning:    Never explicitly free a component within one of its own event handlers or the event handler of a component it owns or contains.

Код
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Form2.Free;
end;
Как думаешь, для чего придуман параметр Action:TCloseAction? Если ты сделаешь
Код
Actio:=caFree;
ты достигнешь того же самого результата, но вполне разрешенным способом... 


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
MetalFan
Дата 30.5.2007, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



так же добавлю, что нельзя убивать форму методом Free в обработчиках событий, описанных в ней же...  для этого необходимо использовать метод Release.
ну это так, на всякий случай для общего развития. в приведенном случае правильно делать так, как сказал ama_kid.

Это сообщение отредактировал(а) MetalFan - 30.5.2007, 09:28


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
ilya198293
Дата 30.5.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 17.3.2007
Где: Сириус, созвездие Большого Пса

Репутация: нет
Всего: нет



Теперь ещё несколько моментов, которые возможно помогут прояснить ситуацию.
В обработчике событий TForm1.FormCreate стоит запуск формы 8, в которой в два потока производится SQL запрос и прогон ProgressBar(зависит от времени - 20 сек - типа "подготовка к работе"). при завершении ProgressBar вызываю Form8.Close. При этом возвращаюсь в форму 1 и сразу делаю Form8.Free. В этом месте пробовал ставить обработчик TForm8.FormClose с текстом Action:=caFree, но тогда форма 8 закрывается (не знаю закрывается или просто становится невидимой), а форма 1 не визуализируется, а в диспетчере задач приложение остаётся (ресурсы при этом не жрёт).Так что пока оставил Form8.Free в тексте процедуры TForm1.FormCreate.
Далее настройка всего в форме 1 и потом пошёл каскад открываний и закрываний формы 2. Поменял в TForm2.FormClose Form2.Free на Action:=caFree получил как и посоветовали - эквивалент Free (по крайней мере пока работает так как надо).
Но ошибка осталась всё равно.
По идее 24 раза она же почему-то отработала.
--------------------
Недавно пытался объяснить сыну, кто такой модератор. Сошлись на Мойдодыре.
PM MAIL   Вверх
ama_kid
Дата 30.5.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



какой ужас...  smile 
Цитата(ilya198293 @  30.5.2007,  10:49 Найти цитируемый пост)
Теперь ещё несколько моментов, которые возможно помогут прояснить ситуацию.
Лично для меня все еще более запуталось...  Лучше бы код привел или тестовый проект выложил...  smile 
Цитата(ilya198293 @  30.5.2007,  10:49 Найти цитируемый пост)
По идее 24 раза она же почему-то отработала.
Пока система имеет возможность выделять тебе дополнительную память - все работает... Проверь утечки памяти хотя бы через диспетчер задач (а по хорошему - надо через модуль MemCheck)...

P.S. Вообще, плохая практика в обработчике OnCreate одной формы создавать другую... Не будет ли правильнее создавать необходимую тебе Form8 перед созданием Form1?


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Rennigth
Дата 30.5.2007, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Ну так Action := caFree и вызывает в итоге Release. smile

Код

procedure TCustomForm.Close;
var
  CloseAction: TCloseAction;
begin
  if fsModal in FFormState then
    ModalResult := mrCancel
  else
    if CloseQuery then
    begin
      if FormStyle = fsMDIChild then
        if biMinimize in BorderIcons then
          CloseAction := caMinimize else
          CloseAction := caNone
      else
        CloseAction := caHide;
      DoClose(CloseAction);
      if CloseAction <> caNone then
        if Application.MainForm = Self then Application.Terminate
        else if CloseAction = caHide then Hide
        else if CloseAction = caMinimize then WindowState := wsMinimized
        else Release;
    end;
end;





--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
ilya198293
Дата 31.5.2007, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 17.3.2007
Где: Сириус, созвездие Большого Пса

Репутация: нет
Всего: нет



Попробовал найти ошибки в программе просто создав новый проект и постепенно перенося процедуры из старого проекта...так столько ошибок повылезало...причём не могу понять как они в старом проекте проходили...например брал дату и конвертировал в строку в формате 'dd/mm/yy'. потом при раскладке считывал символы 1+2,4+5,7+8+9+10 и он считывал. в новом проекте даёт ошибку, причём логичную ошибку...ещё в нескольких местах такая же ерунда...когда считывалось из стринга больше символов чем там есть вообще...так что там нужно весь проект пересматривать...
я по крайней мере грешу на установку всех сервиспаков и апдейтов...без них как-то логичнее всё работало, хотя и вылетали ошибки - ошибки у самого делфи, но не у разрабатываемого проекта.
--------------------
Недавно пытался объяснить сыну, кто такой модератор. Сошлись на Мойдодыре.
PM MAIL   Вверх
ilya198293
Дата 31.5.2007, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 17.3.2007
Где: Сириус, созвездие Большого Пса

Репутация: нет
Всего: нет



Сейчас просто эксперементировал с двумя формами и получил такие результаты:
Form1
Здесь форма создаётся как модальная, а в проекте нет, но сути это не меняет
Код

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private{Private declarations}
  public{Public declarations}
  end;
var
  Form1: TForm1;
implementation
uses Unit2;{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
  try Form2.Visible:=true                                       //проверка на то существует форма или нет
    except
      on EAccessViolation
      do begin
        Application.CreateForm(TForm2, Form2);
        Form2.ShowModal;
        Form2.Free;
      end;
  end;
end;
end.


Forma2
Код

unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private{Private declarations}
  public{Public declarations}
  end;
var
  Form2: TForm2;
implementation
uses Unit1;{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
  Form2.Close;
end;
end.

Ошибка появляется когда вводится проверка try в форме1. 
как ещё можно проверить существование формы (видимой и не видимой) для того, чтоб не запускать их несколько штук?
--------------------
Недавно пытался объяснить сыну, кто такой модератор. Сошлись на Мойдодыре.
PM MAIL   Вверх
ama_kid
Дата 31.5.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



Мысли проще:
Код
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 try
  Form2.ShowModal;
 except
  Form2:=TForm2.Create(Self);
  Form2.ShowModal;
 end;
 Form2:=nil;
end;

end.


Код
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action:=caFree;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
 Close;
end;

end.

Естессно, вторую форму желательно убрать из списка автосоздаваемых...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
ilya198293
Дата 31.5.2007, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 17.3.2007
Где: Сириус, созвездие Большого Пса

Репутация: нет
Всего: нет



Форма 2 из автосоздания убрана была.
Когда проверка такая:
Код

 try
  Form2.ShowModal;
 except
  Form2:=TForm2.Create(Self);
  Form2.ShowModal;
 end;
 Form2:=nil;
end;

то второй раз нажать на кнопку на форме 1 не предоставляется возможным до тех пор пока она не закрыта...в этом случае try можно и не ставить, просто написать Action:=caFree; и всё.
но в случае когда форма не модальная, тогда при нажатии плодятся новые формы...суть то всей задачи запретить открывать несколько вторых форм, но при этом иметь доступ к форме 1, из неё могут запускаться другие формы с такими же проверками.
--------------------
Недавно пытался объяснить сыну, кто такой модератор. Сошлись на Мойдодыре.
PM MAIL   Вверх
MetalFan
Дата 31.5.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(ilya198293 @  31.5.2007,  11:02 Найти цитируемый пост)
 try
  Form2.ShowModal;
 except
  Form2:=TForm2.Create(Self);
  Form2.ShowModal;
 end;
 Form2:=nil;
end;

руцки бы паатрыфалл за такое....
типа: ...."АГА!" сказали сибирские мужыки и пашли пилить дальше двуручной пилой


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
ama_kid
Дата 31.5.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 15
Всего: 95



MetalFan
Что конкретно не нравится?  smile Уже лет пять пользуюсь таким способом и ни разу еще на грабли не наткнулся... В чём пила? Знаю тебя по форуму как человека, не бросающимся такими заявлениями беспочвенно, поэтому вдруг взял страх за свои проекты smile

Цитата(ilya198293 @  31.5.2007,  11:02 Найти цитируемый пост)
суть то всей задачи запретить открывать несколько вторых форм, но при этом иметь доступ к форме 1, из неё могут запускаться другие формы с такими же проверками.
Выстави просто флаг какой-нибудь при создании второй формы и сбрасывай при закрытии, а перед созданием - проверяй его. Или юзай мьютексы...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
ilya198293
Дата 31.5.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 17.3.2007
Где: Сириус, созвездие Большого Пса

Репутация: нет
Всего: нет



О-о-о-о-о-о-о-о, а флаг это идея...как я сам не догадался...тармажу...спасибоsmile
--------------------
Недавно пытался объяснить сыну, кто такой модератор. Сошлись на Мойдодыре.
PM MAIL   Вверх
aktuba
Дата 31.5.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата

Код

 try
  Form2.ShowModal;
 except
  Form2:=TForm2.Create(Self);
  Form2.ShowModal;
 end;
 Form2:=nil;
end;



ЖЭСТЬ!!! Куда мир катиться...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
MetalFan
Дата 31.5.2007, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



ama_kid, зачем доводить до того, что может возникнуть исключение? да еще и скорее всего AV. если можно обойтись, как ты сам и сказал, проверкой и установкой флага...
нет, конечно бывают моменты, когда исключения используются для уведомления... например в тех же индейцах это сплошь и рядом...
но когда таким образом осуществляется проверка на "живость" объекта... брр..


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.