Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2015, 17:14   #1
bosyak
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 29
По умолчанию Frame в delphi

Здравствуйте, не могли бы вы помочь в решении проблемы
у меня есть класс
TFrameViev = class(TFrame);
мне нужно при создании программы размещать на форме этот фрейм
Вот код размещения:
Код:
...
frame:TFrameViev;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
 frame.Create(self);
 frame.Parent:=form1;
 frame.Align:=alClient;

end;
Однако когда я компилирую программу, программа ругается на ошибку доступа, пример ошибки в скрине

реализация TFrameViev выглядит так
Код:
unit frame;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Menus,
  Forms, Dialogs, ExtCtrls,dglopengl,funct, Vcl.AppEvnts;

type
  TFrameViev = class(TFrame)
   procedure AppEventsIdle(Sender: TObject; var Done: Boolean);

 protected
    class var
      FPixelFormat:integer;
    var
      FDC:HDC;
      FRC:HGLRC;
    class constructor Create;
    procedure SetupRC;
  public
    procedure OnCreate( var msg:TMessage ); message WM_CREATE;
    procedure OnDestroy( var msg:TMessage ); message WM_DESTROY;
    procedure OnPaint( var msg:TWMPaint ); message WM_PAINT;
    procedure OnEraseBackground( var msg:TMessage ); message WM_ERASEBKGND;
    procedure OnSize( var msg:TMessage ); message WM_SIZE;
    procedure Render;
  end;


implementation

{ TProfile3d }


{ TFrameviev }

procedure TFrameViev.AppEventsIdle(Sender: TObject; var Done: Boolean);
begin
  Render;
  Done := false;
end;

class constructor TFrameViev.Create;
begin
   FPixelFormat := 0;
end;

procedure TFrameViev.OnCreate(var msg: TMessage);
begin
   FDC := GetDC( Handle );
  SetDCPixelFormat(FDC);
  FRC := wglCreateContext( FDC );
  wglMakeCurrent( FDC, FRC );
  SetupRC;
end;

procedure TFrameViev.OnDestroy(var msg: TMessage);
begin
  wglMakeCurrent( 0, 0 );
  wglDeleteContext( FRC );
  ReleaseDC( Handle, FDC );
end;

procedure TFrameViev.OnEraseBackground(var msg: TMessage);
begin
  msg.Result := 1;
end;

procedure TFrameViev.OnPaint(var msg: TWMPaint);
  var ps:TPaintStruct;
begin
  BeginPaint( Handle, ps );
  Render;
  EndPaint( Handle, ps );
end;

procedure TFrameViev.OnSize(var msg: TMessage);
begin
  glViewport( 0,0, LOWORD(msg.LParam), HIWORD(msg.LParam));
  glMatrixMode( GL_PROJECTION );
  glLoadIdentity;
  gluPerspective( 45, LOWORD(msg.LParam)/HIWORD(msg.LParam), 1.0, 101.0 );
  glMatrixMode( GL_MODELVIEW );
  glLoadIdentity;
  InvalidateRect( Handle, nil, false );
end;

procedure TFrameViev.Render;
begin
  glClearColor(0,0,0,0);
  glClear( GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT );

  SwapBuffers( FDC );
end;

procedure TFrameViev.SetupRC;
begin
  glClearColor( 0.5, 0.5, 0.5, 1.0 );
  glEnable( GL_DEPTH_TEST );
end;

end.
Изображения
Тип файла: png 1.png (5.9 Кб, 72 просмотров)
bosyak вне форума Ответить с цитированием
Старый 23.11.2015, 17:18   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
///frame:TFrameViev;
...
procedure TForm1.FormCreate(Sender: TObject);
var
frame:TFrameViev;
begin
 frame:=TFrameViev.Create(self);
 frame.Parent:=form1;
 frame.Align:=alClient;

end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 23.11.2015, 17:27   #3
bosyak
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 29
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
///frame:TFrameViev;
...
procedure TForm1.FormCreate(Sender: TObject);
var
frame:TFrameViev;
begin
 frame:=TFrameViev.Create(self);
 frame.Parent:=form1;
 frame.Align:=alClient;

end;
блин не заметил,глупая ошибка,спасибо! Однако теперь стала вылазить еще более непонятная проблема, resource TFrameViev not found
Хотя форма этого фрейма есть .dfm
bosyak вне форума Ответить с цитированием
Старый 23.11.2015, 17:44   #4
bosyak
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 29
По умолчанию

проблема решилась добавление после
implementation
этой строки
{$R *.dfm}
однако ошибка доступа все же осталась
появляется форма, однако она какая то прозрачная пример на скрине
Изображения
Тип файла: jpg 1.jpg (37.4 Кб, 124 просмотров)
bosyak вне форума Ответить с цитированием
Старый 23.11.2015, 18:08   #5
bosyak
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 29
По умолчанию

Нашел источник проблемы однако как решить не знаю
Ошибка доступа выскакивает когда я присваиваю Frame.parent
bosyak вне форума Ответить с цитированием
Старый 23.11.2015, 18:43   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Переменная Form1 инициализирована?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.11.2015, 18:46   #7
bosyak
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 29
По умолчанию

Код:
...
Form1:TForm1
...
Все я решил проблему, спасибо, могу показать решение.
Form1 моя главная форма, и я в ее инициализации писал код

Последний раз редактировалось bosyak; 23.11.2015 в 18:52.
bosyak вне форума Ответить с цитированием
Старый 23.11.2015, 18:55   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Form1 вообще-то всего лишь указатель на форму. И значение в него нужно присвоить. Если форма создается автоматически, то там присваивается. При программном создании программист должен позаботиться о содержимом глобальной переменной Form1, если собирается её использовать. Это так, по поводу Form1 моя главная форма
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.11.2015, 19:26   #9
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

На самом деле это быдлокод. В методах класса нельзя обращаться к экземплярам класса через внешние (глобальные) переменные. Должно быть так:
Код:
begin
  ...
  frame.Parent := Self; // или (Sender as TComponent)
end;
Vapaamies вне форума Ответить с цитированием
Старый 23.11.2015, 19:30   #10
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

В методах класса старайтесь не использовать подобные переменные (ссылки на экземпляры того же класса) никогда ! В случае необходимости, как тут - используйте псевдоидентификатор Self указывающий на объект (экземпляр класса) для которого сейчас выполняется метод класса.
Тем более, что Вы же его(селф) вот строчкой выше используете.
И не забывайте пользоваться отладкой с евалюэйшеном - при наведении мыши на идетификатор при запаузеной программе или полноценные Watches
Читайте мануал по грамотной работе с отладкой тут http://www.delphikingdom.ru/asp/view...catalogid=1392 (глава 2) и вообще можно всю статью почитать, и вообще можно хоть всего GunSmoker'a прочитать.

P.S. Долго печатал, Vapaamies чуть опередил.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FRAME MirtMacline HTML и CSS 2 22.10.2011 13:58
Frame tgm Microsoft Office Excel 2 02.01.2011 14:51
Прокрутить Frame во время работы в Delphi Polotenchik Общие вопросы Delphi 2 31.01.2010 16:10
Frame in frame avalon8 Работа с сетью в Delphi 1 31.07.2008 16:14
Frame Zeraim Общие вопросы Delphi 1 25.05.2008 23:17