Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизПомогите разобраться с принадлежностью к форме Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.042 c