Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.03.2011, 22:00
defff1 defff1 вне форума
Прохожий
 
Регистрация: 23.03.2011
Сообщения: 5
Репутация: 10
Восклицание ошибка памяти

Доброго времени суток.
Есть форма в которой динамически создается массив edit-ов.
Производится расчет. Далее форма закрывается.
При закрытии формы выдается ошибка памяти типа
"Access violation at address XXXXXXX in module XXXX. Read of address 00000000"
После долгих переборов вывел что все дело в
MatrEnd.free;
Что я упустил?

Код:

Код:
unit MEnd;

interface

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

type
  TMatrEnd = class(TForm)
    Button1: TButton;
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private

    { Private declarations }
  public
    { Public declarations }
  EditMas:array[1..30,1..30] of TMyEdit;
  end;

var
  MatrEnd: TMatrEnd;

implementation

uses MAI;

{$R *.DFM}

procedure TMatrEnd.FormShow(Sender: TObject);
var
x,y,c:integer;
kon,a,b:extended;
s:string;
begin

   For y:=1 to Form1.level[4]+1 do begin
      kon:=0;
      For x:=1 to Form1.Level[3]+2 do begin
          EditMas[y,x]:=TMyEdit.Create(self);
          EditMas[y,x].x:=x;
          EditMas[y,x].y:=y;
          EditMas[y,x].Parent:=self;
          EditMas[y,x].Top:=(y-1)*20+1;
          EditMas[y,x].left:=x*90-28;
          EditMas[y,x].Width:=90;
          EditMas[y,x].Height:=20;
          EditMas[y,x].ReadOnly:=True;
          If (y=1) and (x>1) then
             EditMas[y,x].text:=Form1.MasHide[0,x-1,Form1.level[2]+2];
          if x=1 then begin
             EditMas[y,x].Width:=150;
             EditMas[y,x].Left:=1;
             if y>1 then EditMas[y,x].Text:=Form1.Memos[4,y-1].Text;
                      end;
          if (x>1) and (y>1) and (x<Form1.Level[3]+2) then begin
             EditMas[y,x].text:=Form1.MasHide[x+Form1.level[2]-1,y-1,Form1.level[4]+2];
              //Теперь умножаем их на соответствующие коэффициенты
             val(EditMas[y,x].text,a,c);
             val(EditMas[2,x].Text,b,c);
             kon:=kon+(a*b);
                                                          end;

                                       end;
         Case Form1.Opt.col of
           one: EditMas[y,Form1.level[3]+2].color:=cl3DLight;
           all: begin
                   EditMas[y,Form1.level[3]+2].color:=cl3DLight;
                   For x:=2 to form1.level[3]+1 do
                      if (y mod 2)=0 then EditMas[y,x].color:=clSilver;
                end;
         end;
         Str(kon:8:8,s);
         EditMas[y,Form1.level[3]+2].Text:=s;
                                     end;
   EditMas[1,form1.level[3]+2].text:='Общие веса';
   If (Width>=screen.Width) or (Height>=screen.Height) then AutoScroll:=true
                                                       else AutoScroll:=false;
   Autosize:=True;
   If (Width>=screen.Width) or (Height>=screen.Height) then AutoScroll:=true
                                                       else AutoScroll:=false;
   Autosize:=False;
   if AutoScroll then height:=height+16;

end;

procedure TMatrEnd.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   MatrEnd.free;
   MatrEnd:=nil;
   Form1.N10.Enabled:=False;
   Form1.N15.Enabled:=False;
end;

end.
Ответить с цитированием
  #2  
Старый 23.03.2011, 22:06
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

если честно, редко пользуюсь ручным уничтожением. я бы убрал вообще из Close эти две строчки.

MatrEnd.free;
MatrEnd:=nil;
Я думаю система сама от них ресурсы освободит как надо....
Ответить с цитированием
  #3  
Старый 23.03.2011, 22:10
defff1 defff1 вне форума
Прохожий
 
Регистрация: 23.03.2011
Сообщения: 5
Репутация: 10
По умолчанию

У меня вообще очень странная штука происходит.
Если я их убираю то программа дальше работает.
Но при изменении некоторых параметров MainForm
Опять начинается...
Я уже всю голову сломал

Читал, что для удаления Free надо в FormCreate дописать создание MatrEnd.
Но по примеру у меня не получается.

Хотя.. сейчас прошелся по всему коду и нашел в кнопке MatrEnd.free;
Удалил.. Пока вроде все пашет )
Но все же хотелось бы понять почему )))))))))
Ведь отстранение от проблемы это не ее решение.

Последний раз редактировалось defff1, 23.03.2011 в 22:19.
Ответить с цитированием
  #4  
Старый 23.03.2011, 22:17
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

а каким образом ты форму закрываешь???
Ответить с цитированием
  #5  
Старый 23.03.2011, 22:22
defff1 defff1 вне форума
Прохожий
 
Регистрация: 23.03.2011
Сообщения: 5
Репутация: 10
По умолчанию

так как нет никаких кнопок закрытия и менюшек то
просто тыкаю на крестик.
Ответить с цитированием
  #6  
Старый 23.03.2011, 22:28
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

хрен знает, у тебя эта форма главная или дочерняя, что за форма form1??
Ответить с цитированием
  #7  
Старый 23.03.2011, 22:30
defff1 defff1 вне форума
Прохожий
 
Регистрация: 23.03.2011
Сообщения: 5
Репутация: 10
По умолчанию

Form1 это MainForm

Нашел еще MatrEnd.Destroy;
тоже не помогло.
Ответить с цитированием
  #8  
Старый 23.03.2011, 22:41
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

надо сам исходник смотреть....
Ответить с цитированием
  #9  
Старый 23.03.2011, 23:19
Janom Janom вне форума
Начинающий
 
Регистрация: 04.02.2011
Адрес: Москва
Сообщения: 148
Версия Delphi: 7
Репутация: 133
По умолчанию

Попробуй их местами поменять...
Код:
procedure TMatrEnd.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   MatrEnd:=nil;
   MatrEnd.free;
   Form1.N10.Enabled:=False;
   Form1.N15.Enabled:=False;
end;
Ответить с цитированием
  #10  
Старый 23.03.2011, 23:37
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Если форма не была создана "вручную", то TApplication сам освободит ресурсы. Если ты создавал форму самостоятельно - то и удаляй ее самостоятельно. Но уж НИ В КОЕМ СЛУЧАЕ нельзя освобождать объект внутри обработчика события этого объекта.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #11  
Старый 24.03.2011, 14:45
defff1 defff1 вне форума
Прохожий
 
Регистрация: 23.03.2011
Сообщения: 5
Репутация: 10
По умолчанию

Спасибо всем. Учту свою ошибку.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:42.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025