Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TFrame


Автор: Mephisto 18.10.2005, 13:41
Добрый день. Столкнулся со следующей проблемой. Необходимо выгружать фрейм из памяти и освобождать объектную переменную. Во время этой процедуры высвечивается ошибка "Abstact error". Может кто-то сталкивался с подобной проблемой? Как этого избежать?
Кстати, после ошибки фрейм все-таки выгружается. smile
За ранее спасибо.

Автор: _hunter 18.10.2005, 13:57
самый банальный способ: засунуть код в try except.
а вообще код показывай -- не должно такого быть...

Автор: Alex 18.10.2005, 15:09
Ошибка в 17 строке...

Автор: Mephisto 20.10.2005, 15:52
Вот небольшой проектик. Состоит из одной формы и фрейма.
Не могу понять почему при второй выгрузке выскакивает ошибка?

Код формы (нажать Alt+F12)
Код
object Form1: TForm1
  Left = 230
  Top = 162
  Width = 696
  Height = 480
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object pMain: TPanel
    Left = 64
    Top = 64
    Width = 409
    Height = 249
    Caption = 'pMain'
    TabOrder = 0
  end
  object cmdOpenFrame: TButton
    Left = 344
    Top = 360
    Width = 75
    Height = 25
    Caption = 'Load Frame'
    TabOrder = 1
    OnClick = cmdOpenFrameClick
  end
end

Код фрейма (нажать Alt+F12)
Код
object fMemo: TfMemo
  Left = 0
  Top = 0
  Width = 320
  Height = 240
  TabOrder = 0
  object Memo1: TMemo
    Left = 32
    Top = 32
    Width = 153
    Height = 161
    Lines.Strings = (
      'Memo1')
    TabOrder = 0
  end
  object cmdExit: TButton
    Left = 216
    Top = 32
    Width = 75
    Height = 25
    Caption = 'cmdExit'
    TabOrder = 1
    OnClick = cmdExitClick
  end
end



Код модуля фомы
Код
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    pMain: TPanel;
    cmdOpenFrame: TButton;
    procedure cmdOpenFrameClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  var fMain:TfMemo;

implementation


{$R *.dfm}

procedure TForm1.cmdOpenFrameClick(Sender: TObject);
begin
  if fMain = nil Then
  begin
    fMain := TfMemo.Create(pMain);
    fMain.Parent := pMain;
    fMain.Align := alClient;
  end
  else
    ShowMessage('TTT');
end;

end.


Код модуля фрейма.
Код
unit Unit2;

interface

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

type
  TfMemo = class(TFrame)
    Memo1: TMemo;
    cmdExit: TButton;
    procedure cmdExitClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

uses Unit1;

{$R *.dfm}

procedure TfMemo.cmdExitClick(Sender: TObject);
begin
  Free;
  Unit1.fMain:= nil;
end;

end.


В первом же случае на фрейме присутствуют Query. Так вот после закрытия последнего програма выдает критическую ошибку.

Автор: _hunter 20.10.2005, 16:36
Код

procedure TfMemo.cmdExitClick(Sender: TObject);    
begin    
  Free;

нельзя самоудалением заниматься...

Автор: Mephisto 20.10.2005, 16:54
Цитата(_hunter @ 20.10.2005, 16:36)
нельзя самоудалением заниматься...

А как лучше? Мне совсем нужно выгрузить фрейм из памяти.

Автор: Rennigth 20.10.2005, 17:09
Mephisto
Нельзя дестроить объект из самого себя, функции
procedure TfMemo.cmdExitClick(Sender: TObject);
некуда возвращаться. Есть много вариантов решения проблемы.
1. Дестhоить из вне класса TfMemo.
2. Дестроить в функции вызванной в PostMessage.
3. с Action-ами наверное можно возиться и настроить на удаление.
...

Автор: _hunter 20.10.2005, 17:56
тут:
http://forum.vingrad.ru/index.php?showtopic=66834
такая же проблема решалась ( и решилась ) посмотри последние посты и сделай так же.
( там на билдере, но смысл, думаю, понятен )

Автор: Girder 21.10.2005, 13:51
Цитата(_hunter @ 20.10.2005, 17:36)
нельзя самоудалением заниматься...
Кто тебе енто сказал?
http://forum.vingrad.ru/index.php?showtopic=47381&view=findpost&p=369164

Автор: _hunter 21.10.2005, 14:06
это, конечно, хорошо, но что будет если у той Button1 назначен еще и OnMouseUp?
+ ладно, скажу не "нельзя", а "очень не желательно".

Автор: Girder 21.10.2005, 14:09
Цитата(_hunter @ 21.10.2005, 15:06)
но что будет если у той Button1 назначен еще и OnMouseUp?
Оно не будет обработанно.

Автор: Mephisto 24.10.2005, 09:52
2Girder
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
 Button1.Free;
end;


Вот именно так я и выгружаю долбанный фрейм.
Кстати, я заметил что ошибка вылетает если на нем существует TQuery. Я пытаюсь удалить фрейм после его закрытия.
Блин, сейчас не могу скинуть исходник. Мне его надо предварительно распотрошить. Потому как он ОЧЕНЬ огромен. А это лиш один из немногих фреймов. smile

2_hunter, прикольный кодик на билдере. Мне понравилось. smile Попробую че-нить в этом духе... Если получится, выложу сюда. smile
Добавлено @ 09:54
Цитата(Mephisto @ 20.10.2005, 16:54)
Цитата (_hunter @ 20.10.2005, 16:36)
нельзя самоудалением заниматься...


А как лучше? Мне совсем нужно выгрузить фрейм из памяти.

Может напится и забытся? smile

Автор: Girder 24.10.2005, 10:01
Цитата(Mephisto @ 24.10.2005, 10:52)
Вот именно так я и выгружаю долбанный фрейм.
Если посмотриш внимательно по ссылке... то там не так smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)