Форум: "Основная";
Текущий архив: 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