Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];

Вниз

Форма не уничтожается   Найти похожие ветки 

 
Viktor   (2003-05-15 17:31) [0]

Привет мастерам!
вызываю
with TFrmSelectionAccessories.Create(Self) do
begin
Caption := "Выбор комплектующих";
try
if ShowModal = mrOk then
begin
//
end
else
Exit;
finally
Free; ????????????????
end;
end;
При чем не всегда выдает эту ошибку:
Project Horizon.exe raised exception class EInvalidPointer with message
"Invalid pointer operation"
Process stopped. Use Step or Run to continue.

Может кто объяснит.
Заранее спасибо


 
Skier   (2003-05-15 17:34) [1]

else Exit; - это зачем ?


 
Smithson   (2003-05-15 17:34) [2]

На первый взгляд все правильно.
И еще - finally после exit, по-моему, не выполниться.
Зайди отладчиком во Free - посмотри, где рубится.


 
clickmaker   (2003-05-15 17:34) [3]

else
Exit;

А это зачем? От Exit до Free же ничего нет...

И посмотри, что удаляется при удалении формы. Какие-нить дочерние компоненты там, структурки и пр.


 
Skier   (2003-05-15 17:36) [4]

>Smithson © (15.05.03 17:34)

> И еще - finally после exit, по-моему, не выполниться.

Выполнится.


 
Smithson   (2003-05-15 17:37) [5]

Спасибо, буду знать.


 
Anatoly Podgoretsky   (2003-05-15 17:45) [6]

В приведеном коде ошибки нет, кроме Caption := "Выбор комплектующих"; это надо после try.


 
Serginio   (2003-05-15 18:01) [7]

Смотри внимательно
with TFrmSelectionAccessories.Create(Self) do
begin
Caption := "Выбор комплектующих";
try
if ShowModal = mrOk then
begin
//
end
else
Exit; // Выход без уничтожения формы по сути совсем не нужен
finally
Free; ????????????????
end;
end;


 
Serginio   (2003-05-15 18:05) [8]

Прочитал тоже более внимательно был не прав.Но Exit явно не нужен


 
Viktor   (2003-05-15 18:13) [9]

Нужен, если какие-то параметры не до-выбраны, поэтому сама форма не уничтожается


 
Viktor   (2003-05-15 18:18) [10]

Добавление:
Из одной формы вызываю модальную
with TFrmCreateStandartModel.Create(Self) do
begin
Caption := "Выбор стандартной модели окна";
try
if ShowModal = mrOk then
begin
//
end;
finally
Free;
end;
end;

из этой формы вызываю еще одну модальную
with TFrmSelectionAccessories.Create(Self) do
begin
Caption := "Выбор комплектующих";
try
if ShowModal = mrOk then
begin
//
end
else
Exit;
finally
Free;
end;
end;

Использую первую модальную для получения данных из нее же (может использоваться несколько раз от 1 до 15
procedure TFrmSelectionAccessories.BtnNextClick(Sender: TObject);
var
FormM: TFrmCreateStandartModel;
begin
FormM := TFrmCreateStandartModel(Self.Owner);

после ОК второй формы присваивается и первой
ошибка
Project Horizon.exe raised exception class EInvalidPointer with message
"Invalid pointer operation"
Process stopped. Use Step or Run to continue

В общем не нашел где ошибка


 
clickmaker   (2003-05-15 18:26) [11]

FormM := TFrmCreateStandartModel(Self.Owner);

А почему так? Она же так получается сама себе владельцем (если я код прально понял). Может так:

FormM := TFrmCreateStandartModel(Self);


 
Viktor   (2003-05-15 18:36) [12]

Да, так и должно быть, т.к. мы не выделили ей заголовок и память,
что бы потом к ней обращаться (где-то так)


 
Serginio   (2003-05-15 19:03) [13]

Сделай TFrmCreateStandartModel(Application);
Делая владельцем предыдущую форму можешь наткнуться на баги так как форма владелец при уничтожении удалит все дочерние компоннты.
А ты потом можешь вызвать уничтожение уже не существующей формы. Хота при модальных вызовах маловероятно если все правильно работает. Так при Exit форма не удаляется???


 
Viktor   (2003-05-15 20:21) [14]

>Serginio
Exit - это выход из процедуры
Free - удаление формы


 
Viktor   (2003-05-16 02:19) [15]

Никаких мыслей умных не подскажете?


 
Нуу   (2003-05-16 03:04) [16]

Не знаю насколько "умных", но одно замечание есть.
Для динамически создаваемой и уничтожаемой формы в рамках try finally, строка "with TFrmSelectionAccessories.Create(Self) do" выглядит весьма "коряво". Зачем назначать кого-бы то ни было (я имею в виду "Self") "Owner"ом данной формы?


 
Viktor   (2003-05-16 03:26) [17]

>Нуу
Может подскажешь тогда как мне вызвать модальную форму не "коряво", чтобы она перекрывала другие окна???


 
Нуу   (2003-05-16 04:33) [18]

Не уверен, что понял "перекрывала другие окна", но для динамически создаваемой и уничтожаемой формы в рамках try finally, стоит писать "with TFrmSelectionAccessories.Create(nil) do".

Кроме того прочитав весь пост обратил внимание на:
>Использую первую модальную для получения данных из нее же >может использоваться несколько раз от 1 до 15
>procedure TFrmSelectionAccessories.BtnNextClick(Sender: TObject);
>var
>FormM: TFrmCreateStandartModel;
>begin
> FormM := TFrmCreateStandartModel(Self.Owner);

>после ОК второй формы присваивается и первой ошибка

Использование локальной переменной для хранения глобальных данных - неверный путь.


 
Bel   (2003-05-16 09:17) [19]

Сдаётся мне, чего-то ты не договариваешь. Приведи кода побольше (реального), а то по этим кускам не совсем понятна конкретная ситуация.


 
Viktor   (2003-05-16 13:23) [20]

> Кода побольше

procedure TFrmMdi.dxBarButtonJournalDocClick(Sender: TObject);
begin
if not Assigned(FrmDocList) then
Application.CreateForm(TFrmDocList, FrmDocList);
FrmDocList.Show;
end;

procedure TFrmDocList.TBtnOfferClick(Sender: TObject);
begin
if TblDocList.FieldByName("IdType").Value = 1 then
begin
with TFrmCreateStandartModel.Create(Self) do
begin
Caption := "Выбор стандартной модели окна";
try
if ShowModal = mrOk then
begin
//
end;
finally
Free;
end;
end;
end
else if TblDocList.FieldByName("IdType").Value = 2 then
begin
if not Assigned(FrmBuisnessOffer) then
Application.CreateForm(TFrmBuisnessOffer, FrmBuisnessOffer);
FrmBuisnessOffer.Show;
end
else
MessageDlg("Предложение добавляется только к договору", mtWarning, [mbOK], 0);
end;


procedure TFrmCreateStandartModel.BtnOkClick(Sender: TObject);
begin
// всевозможные проверки
if WWidth.Text = "" then
begin
MessageDlg("Необходимо ввести высоту Рамы", mtWarning, [mbOK], 0);
WWidth.SetFocus;
Exit;
end;
.................
// Вызываем дополнительную форму
with TFrmSelectionAccessories.Create(Self) do
begin
Caption := "Выбор комплектующих";
try
if ShowModal = mrOk then
begin
//
end
else
Exit;
finally
Free;
end;
end;
// Сохраняем конфигурацию окна
CreateWindow;
ModalResult := mrOk;
end;


procedure TFrmSelectionAccessories.FormCreate(Sender: TObject);
var
FormM : TFrmCreateStandartModel;
i : Integer;
begin
// нарисовать и загрузить рисунок в Image
try
NBT := 0;
NBB := 0;
HBT := 0;
HBB := 0;
J := 0; // створка по счету 1 створка начинается с 0
Bmp := TBitmap.Create;
FormM := TFrmCreateStandartModel(Self.Owner);
HR := StrToInt(FormM.WHeight.text);
WR := StrToInt(FormM.WWidth.text);
Bmp.Canvas.Brush.Color := clAqua;
Bmp.Width := Round(WR/15);
Bmp.Height := Round(HR/15);
Bmp.Canvas.Rectangle(1, 1, Round(WR/15)-1, Round(HR/15)-1);
NP := FormM.W;
if FormM.BayTop.Checked = True then
begin
NBT := FormM.BT;
HBT := StrToInt(FormM.BayTopHeigh.Text);
end;
if FormM.BayBottom.Checked = True then
begin
NBB := FormM.BB;
HBB := StrToInt(FormM.BayBottomHeigh.Text);
end;
// сщздаем массив будущих створок с его координатами
SetLength(Array_Leaf, NBT+NBB+NP);
for i := 0 to (NBT+NBB+NP-1) do
begin
SetLength(Array_Leaf[i], 5);
end;
// рисуем в верхнем просвете количество створок
for i := 1 to NBT do
begin
Bmp.Canvas.Rectangle(5+Round((Round(WR/15)-5)*(i-1)/NBT), 5, Round(i*(Round(WR/15)-5)/NBT), Round(HBT/15)-5);
Array_Leaf[i-1, 0] := 5+Round((Round(WR/15)-5)*(i-1)/NBT);
Array_Leaf[i-1, 1] := 5;
Array_Leaf[i-1, 2] := Round(i*(Round(WR/15)-5)/NBT);
Array_Leaf[i-1, 3] := Round(HBT/15)-5;
end;
// рисуем в нижнем просвете количество створок
for i := 1 to NBB do
begin
Bmp.Canvas.Rectangle(5+Round((Round(WR/15)-5)*(i-1)/NBB), Round((HR-HBB)/15), Round(i*(Round(WR/15)-5)/NBB), Round(HR/15)-5);
Array_Leaf[i-1+NBT, 0] := 5+Round((Round(WR/15)-5)*(i-1)/NBT);
Array_Leaf[i-1+NBT, 1] := Round((HR-HBB)/15);
Array_Leaf[i-1+NBT, 2] := Round(i*(Round(WR/15)-5)/NBB);
Array_Leaf[i-1+NBT, 3] := Round(HR/15)-5;
end;
// рисуем количество створок
for i := 1 to NP do
begin
if FormM.BayTop.Checked = True then
begin
Bmp.Canvas.Rectangle(5+Round((Round(WR/15)-5)*(i-1)/NP), Round(HBT/15), Round(i*(Round(WR/15)-5)/NP), Round((HR-HBB)/15)-5);
Array_Leaf[i-1+NBT+NBB, 0] := 5+Round((Round(WR/15)-5)*(i-1)/NP);
Array_Leaf[i-1+NBT+NBB, 1] := Round(HBT/15);
Array_Leaf[i-1+NBT+NBB, 2] := Round(i*(Round(WR/15)-5)/NP);
Array_Leaf[i-1+NBT+NBB, 3] := Round((HR-HBB)/15)-5;
end
else
begin
Bmp.Canvas.Rectangle(5+Round((Round(WR/15)-5)*(i-1)/NP), 5+Round(HBT/15), Round(i*(Round(WR/15)-5)/NP), Round((HR-HBB)/15)-5);
Array_Leaf[i-1+NBT+NBB, 0] := 5+Round((Round(WR/15)-5)*(i-1)/NP);
Array_Leaf[i-1+NBT+NBB, 1] := 5+Round(HBT/15);
Array_Leaf[i-1+NBT+NBB, 2] := Round(i*(Round(WR/15)-5)/NP);
Array_Leaf[i-1+NBT+NBB, 3] := Round((HR-HBB)/15)-5;
end;
end;
dxGraphic.Picture.Bitmap := Bmp;
finally
QSash.Open;
QSmb.Open;
QLintelHor.Open;
QLintelVer.Open;
QNoLintel.Open;
QLeaf.Open;
QLintelLeaf.Open;
end;
end;



 
Viktor   (2003-05-16 13:28) [21]



procedure TFrmSelectionAccessories.BtnNextClick(Sender: TObject);
var
FormM: TFrmCreateStandartModel;
sss: String;
begin
if BtnNext.Caption <> "Готово" then
begin
FormM := TFrmCreateStandartModel(Self.Owner);
if J <> NP+NBT+NBB-1 then
begin
if (PageControl.ActivePage = TabSheet1) and
(BtnBack.Enabled = False) then
begin
PageControl.ActivePage := TabSheet2;
BtnBack.Enabled := True;
TabSheet1.Enabled := False;
Bmp.Canvas.Pen.Color := clRed; // меняет цвет линии
Bmp.Canvas.Rectangle(Array_Leaf[J,0], Array_Leaf[J,1],
Array_Leaf[J,2], Array_Leaf[J,3]);
dxGraphic.Picture.Bitmap := Bmp;
end
else if (TabSheet1.Enabled = False) and
(PageControl.ActivePage = TabSheet2) then
begin
QAccessoriesAuto.Close;
if (NBT <> 0) and (J <= NBT) then
begin
sss :="Select * From AccessoriesPack Where FromWidth<"+
IntToStr(Round((StrToInt(FormM.WWidth.Text))/NBT))+" and ToWidth>"+
IntToStr(Round((StrToInt(FormM.WWidth.Text))/NBT))+" and FromHeight<"+
IntToStr(HBT)+" and ToHeight>"+IntToStr(HBT);
end
else if (NBB <> 0) and (J <= NBB) then
begin
sss :="Select * From AccessoriesPack Where FromWidth<"+
IntToStr(Round((StrToInt(FormM.WWidth.Text))/NBB))+" and ToWidth>"+
IntToStr(Round((StrToInt(FormM.WWidth.Text))/NBB))+" and FromHeight<"+
IntToStr(HBB)+" and ToHeight>"+IntToStr(HBB);
end
else if (NP <> 0) and (J <= NP) then
begin
sss :="Select * From AccessoriesPack Where FromWidth<"+
IntToStr(Round((StrToInt(FormM.WWidth.Text))/NP))+" and ToWidth>"+
IntToStr(Round((StrToInt(FormM.WWidth.Text))/NP))+" and FromHeight<"+
IntToStr(HR)+" and ToHeight>"+IntToStr(HR);
end;
QAccessoriesAuto.SQL.Clear;
QAccessoriesAuto.SQL.Add(sss);
QAccessoriesAuto.Open;
Array_Leaf[J,5] := QAccessoriesAuto.FieldByName("Id").Value;
PageControl.ActivePage := TabSheet3;
end
else if (TabSheet1.Enabled = False) and
(PageControl.ActivePage = TabSheet3) then
begin
PageControl.ActivePage := TabSheet2;
Bmp.Canvas.Pen.Color := clBlack; // меняет цвет линии
Bmp.Canvas.Rectangle(Array_Leaf[J,0], Array_Leaf[J,1],
Array_Leaf[J,2], Array_Leaf[J,3]);
J := J + 1;
Bmp.Canvas.Pen.Color := clRed; // меняет цвет линии
Bmp.Canvas.Rectangle(Array_Leaf[J,0], Array_Leaf[J,1],
Array_Leaf[J,2], Array_Leaf[J,3]);
dxGraphic.Picture.Bitmap := Bmp;
end;
end
else
begin
Bmp.Canvas.Pen.Color := clBlack; // меняет цвет линии
Bmp.Canvas.Rectangle(Array_Leaf[J,0], Array_Leaf[J,1],
Array_Leaf[J,2], Array_Leaf[J,3]);
dxGraphic.Picture.Bitmap := Bmp;
PageControl.ActivePage := TabSheet3;
BtnOk.Enabled := True;
BtnNext.Caption := "Готово";
BtnNext.Enabled := False;
end;
end;
end;


procedure TFrmSelectionAccessories.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
QSash.Close;
QSmb.Close;
QLintelHor.Close;
QLintelVer.Close;
QNoLintel.Close;
QLeaf.Close;
QLintelLeaf.Close;
end;


 
Serginio   (2003-05-16 14:56) [22]

Во первых если хочешь, что бы форма уничтожалать при закрытии указывай Action явно caFree или caHide что бы сделать невидимым
Также и для FormM: TFrmCreateStandartModel;
И всеже еще раз посоветую FormM := TFrmCreateStandartModel(Application);



 
Viktor   (2003-05-16 19:32) [23]

Похоже проблема в не уничтожении формы а в чем-то другом
но ошибка с постоянством выскакивает таже
Project Horizon.exe raised exception class EInvalidPointer with message
"Invalid pointer operation"
Process stopped. Use Step or Run to continue.


 
Нуу   (2003-05-17 02:54) [24]

Ты по-прежнему используешь локальную переменную "FormM: TFrmCreateStandartModel" не понятно для чего!?
Локальная переменная такого типа годится (хотя и не нужна), в случаях когда данная форма создается и уничтожается в "области видимости" этой переменной.


 
Viktor   (2003-05-17 05:24) [25]

Действительно проблема была не в уничтожении формы, а в добавленном массиве.
Оказывается при создании динамического массива были нарушены
индексы данных массива, то бишь записывал данные в массив совсем под другими адресами и считывал, часть этой памяти оказалась выделенной под форму, которую и пытался уничтожить
Так, что делайте выводы.

Спасибо Всем кто принимал участие в этом вопросе.



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

Форум: "Основная";
Текущий архив: 2003.05.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.009 c
3-94685
Filat
2003-05-02 16:18
2003.05.29
Как красиво обработать отказ от логина к базе?


3-94734
Саня
2003-05-08 19:54
2003.05.29
Как подсоединиться к запароленному файлу


1-94955
Vulko
2003-05-17 22:44
2003.05.29
Как вызвать стандартный диалог выбора папки


7-95139
demonyator
2003-03-28 18:32
2003.05.29
Как программно запретить запуск определённых файлов?


3-94747
Andrey-k
2003-05-10 20:40
2003.05.29
Win9.x и клиент InterBase для них





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