Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

Помогите разобраться с принадлежностью к форме   Найти похожие ветки 

 
utter ©   (2005-06-02 10:47) [0]

Возникла небольшая проблемка.
Если мы пишем в основном коде программы, либо в коде процедуры, которая не озаглавлена "TForm1.xxx", а просто "xxx" простейший код, к примеру, Label1.Caption:="Проверка"; то он не прокатывает и требуется написать так: Form1.Label1.Caption:="Проверка";
Но, при этом всегда вылетает критическая ошибка: Debugger Exception Notification: "Project <имя_проекта.exe> raised exception class EAccessViolation with message "Access violation at address <адрес> in module "<имя_проекта.exe>". Read of address <адрес>. Process stopped. User Step or Run to continue."
Пробовал и в Delphi 6, и в 7 - ошибка одна.

Если же мы обзываем процедуру "TForm1.xxx", то Label1.Caption:="Проверка"; теперь прокатывает и ошибок не выдает, но как мы можем из основного кода программы вызвать эту процедуру: "TForm1.xxx"?
Если мы пишем TForm1.xxx; то при компиляции вылетает ошибка: "This form of method call only allowed for class methods". Если просто xxx; то такой процедуры не найдено.

Помогите пожалуйста разобраться в этой ситуации.


 
Ega23 ©   (2005-06-02 10:52) [1]

Бери книжку и читай про классы и методы классов, а также чем они отличаются от обычных процедур и функций.


 
ЮЮ ©   (2005-06-02 10:52) [2]

А что такое "основной код программы"? где ты его пишешь?


 
utter ©   (2005-06-02 10:57) [3]

A: А что такое "основной код программы"? где ты его пишешь?
Q: Код в конце программы, не в коде процедур, а в основном коде программы, непосредственно перед end."ом с точкой :)
Раньше программил на Pascal"е. С Delphi работал немного.


 
ЮЮ ©   (2005-06-02 11:03) [4]

В Delphi основной код программы - unit с расширением dpr.
непосредственно перед end."ом с точкой ничего писать нельзя
весь код следует писать в TForm1.xxx - обработчиках событий


 
utter ©   (2005-06-02 11:04) [5]

Ясно, спасибо.


 
Ega23 ©   (2005-06-02 11:05) [6]

2 utter ©   (02.06.05 10:57) [3]


unit UGFXTypes;

interface

uses SysUtils, Graphics, Classes, OpenGL;

type

TGfxTagStruct = packed record
 Tag           : Word;
 wParam        : Cardinal;
 lParam        : Cardinal;
 Offset        : Cardinal;
end;

type TGFXSelection = (gfxsNone, gfxsVertex, gfxsObject);
type TGFXVertex = array [0..2] of GLDouble;
type TGFXColor3 = array [0..2] of GLDouble;
type TGFXColor4 = array [0..3] of GLDouble;

type TGFXDRect = packed record
       Left: GLDouble;
       Top: GLDouble;
       Right: GLDouble;
       Bottom: GLDouble;
end;

function GFXColor3(R, G, B: GLUByte): TGFXColor3; overload;
function GFXColor4(R, G, B, A: GLUByte): TGFXColor4; overload;
function GFXColor3(Color: TColor): TGFXColor3; overload;
function GFXColor4(Color: TColor): TGFXColor4; overload;

procedure gluTessBeginPolygon (tess: GLUtesselator; polygon_data: Pointer); stdcall; external GLU32;

type
 TGFXObject = class
 private
   FEdgeWidth: GLDouble;
   FEdgeStyle: GLInt;
   FDrawOrder: integer;
   FUID: integer;
   FFillColor: TGFXColor4;
   FEdgeColor: TGFXColor4;
   FTransparentColor: TGFXColor3;

   FVerts: array of TGFXVertex;
   FVertsCount: integer;

   FDone: boolean;
   FSelection: TGFXSelection;
   FSelectedIndex: integer;

   function GetCount: integer;
   function GetRaster: TBitmap;
   function GetVertex(index: integer): TGFXVertex;
   procedure ReadStream(Stream: TStream); // !!!!!!!!!!!!!!!!!!!!!!!!
   procedure SetEdgeColor(const Value: TGFXColor4);
   procedure SetEdgeStyle(const Value: GLInt);
   procedure SetEdgeWidth(const Value: GLDouble);
   procedure SetFillColor(const Value: TGFXColor4);
   procedure SetRaster(const Value: TBitmap);

 public
   property UID: integer read FUID write FUID;
   property DrawOrder: integer read FDrawOrder write FDrawOrder;
   property EdgeStyle: GLInt read FEdgeStyle write SetEdgeStyle;
   property EdgeWidth: GLDouble read FEdgeWidth write SetEdgeWidth;
   property EdgeColor: TGFXColor4 read FEdgeColor write SetEdgeColor;
   property FillColor: TGFXColor4 read FFillColor write SetFillColor;
   property VertexCount: integer read GetCount;
   property Vertex[index: integer]: TGFXVertex read GetVertex;
   property Raster: TBitmap read GetRaster write SetRaster;
   property TransparentColor: TGFXColor3 read FTransparentColor write FTransparentColor;

   constructor Create;
   destructor Destroy; override;

   function LoadFromStream(Stream: TStream): integer;
   function SaveToStream(Stream: TStream): integer;

   function AddVertex(WX, WY, WZ: GLDouble): integer; virtual; abstract;
   function InsertVertex(Index: integer): integer; virtual; abstract;
   procedure DeleteVertex(Index: integer); virtual; abstract;

   procedure MoveTo(WX, WY: GLDouble); virtual; abstract;
   procedure Select(WX, WY: GLDouble); virtual; abstract;
   procedure Deselect; virtual; abstract;
   procedure Draw; virtual; abstract;
end;


вот в этом случае, функция function GFXColor3   может быть использована везде, где этот юнит в uses прописан.
А вот procedure SetEdgeColor(const Value: TGFXColor4); - это метод класса TGFXObject. Она не может быть выполнена вне этого класса. Более того, эта процедура объявлена в private-секции класса.
В общем почитай про область видимости процедур и функций.


 
utter ©   (2005-06-02 11:30) [7]

Спасибо


 
Anatoly Podgoretsky ©   (2005-06-02 11:34) [8]

utter ©   (02.06.05 10:47)  
Если мы пишем в основном коде программы, либо в коде процедуры, которая не озаглавлена "TForm1.xxx", а просто "xxx" простейший код, к примеру, Label1.Caption:="Проверка"; то он не прокатывает и требуется написать так: Form1.Label1.Caption:="Проверка";

Не требует, если ты будешь обращаться к переменной с именем Label1 и ее свойству/полю с именем Caption.
А если ты хочешь обратиться к какому то свойству/полю, то это просто невозможно без переменной, в данном случае Form1

Но, при этом всегда вылетает критическая ошибка: Debugger

Не всегда, а у тебя, поскольку у тебя в программе ошибка

Пробовал и в Delphi 6, и в 7 - ошибка одна.

Так она у тебя в коде, а не в Дельфи.

Если мы пишем TForm1.xxx; то при компиляции вылетает ошибка: "This form of method call only allowed for class methods". Если просто xxx; то такой процедуры не найдено.

Это другая ошибка - xxx не является методом класса.

Помогите пожалуйста разобраться в этой ситуации.

Ситуация связана с методом научного тыка, прекрати пользоваться им и ситуация исчезнет. Иначе будешь постоянно задавать ламерские вопросы на форумах. Хорошо если еще сможешь получать хоть какие то ответы, на серьезные особо не расчитывай, их не будут давать из-за уровня знаний. Чаще будет не так красиво.


 
evvcom ©   (2005-06-02 11:42) [9]


> В Delphi основной код программы - unit с расширением dpr.

unit в Delphi имеет расширение pas, а dpr - это program или library.


 
evvcom ©   (2005-06-02 11:44) [10]


> непосредственно перед end."ом с точкой ничего писать нельзя

initialization
 <код инициализации модуля>
finalization
 <код финализации модуля>
end. // как же это нельзя?


 
evvcom ©   (2005-06-02 11:48) [11]


> весь код следует писать в TForm1.xxx - обработчиках событий

необязательно.

unit test;

...

procedure xxx(AForm: TForm);
begin
 AForm.Label.Caption := "Проверка";
end;

procedure TForm1.xxx;
begin
 test.xxx(Self);
end;


 
evvcom ©   (2005-06-02 11:51) [12]

прошу прощения:
procedure xxx(AForm: TForm1);


 
Ega23 ©   (2005-06-02 11:54) [13]

2 evvcom ©   (02.06.05 11:51) [12]
прошу прощения:
procedure xxx(AForm: TForm1);


Прокатило бы и так, т.к. TForm1=class(TForm)


 
evvcom ©   (2005-06-02 12:04) [14]


> Прокатило бы и так

Не прокатило бы, т.к. у TForm нет Label.


 
Ega23 ©   (2005-06-02 12:18) [15]

А, ну да.
Всё равно так писать нельзя....   :о)



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

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.027 c
1-1118260453
Gopher
2005-06-08 23:54
2005.06.29
Синтаксис


3-1116718926
grol
2005-05-22 03:42
2005.06.29
Как из ADOQuery ков перенести информацию в Excel?


14-1117694349
YurikGL
2005-06-02 10:39
2005.06.29
Старая мама и COM-порт


1-1118217103
TAN_K
2005-06-08 11:51
2005.06.29
PageControl и PageControl


3-1115898208
-K2-
2005-05-12 15:43
2005.06.29
Проблемы при соединении с БД по локальной сети.