Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.5 MB
Время: 0.041 c
1-1118129890
ORMADA
2005-06-07 11:38
2005.06.29
DragDrop


1-1117782191
BigBan
2005-06-03 11:03
2005.06.29
Операции со строками


14-1117735860
seregka
2005-06-02 22:11
2005.06.29
Теор.вероятности


14-1117951008
Гарри Поттер
2005-06-05 09:56
2005.06.29
Костя проиграл бой.


4-1114793145
Grell
2005-04-29 20:45
2005.06.29
Изменение BorderStyle





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский