PDA

View Full Version : تشریح کد های Delphi



Armin060
یک شنبه 27 دی 1388, 13:15 عصر
من یه مدت دنبال کتاب واسه OpenGL در ++C گشتم که فارسی باشه، ولی پیدا نکردم. از این رو مجبور شدم مراجعه کنم به کتاب های زبان اصلی که یه 30، 40 صفحه ای خوندم، فهمیدم که هنوز زبانم خیلی ضعیف هست. ( از هر 10 تا کلمه باید 4 تاش رو از تو دیکشنری نگاه می کردم که طول هم می کشید ببینم کدوم معنی کلمه اینجا منظور هست، اخه خیلی از اون ها معانی زیادی داشتند و یا چند معنی با معنای متفاوت در اونجا جمله رو بی معنی نمی کردم که نمی دونستم منظور کدوم هست و ... ).
خلاصه بگم مجبور شدم کتاب فارسی OpenGL که با زبان Delphi آموزش می داد رو مطالعه کنم. حالا بعضی جاها من به مشکل بر می خورم و نمی دونم که این کد در دلفی یعنی چی. خیلی ممنون میشم که به من کمک کنید.

Felony
یک شنبه 27 دی 1388, 13:26 عصر
اولا کدوم کد ؟
دوما بهتره زبانت رو قوی کنی و بری همون کتاب های زبان اصلی رو بخونی ، مقالات ترجمه شده به فارسی فقط برای بهتر روشن شدن موضوع هستن و در فهمیدن موضوع هیچ نقشی ندارن ، وقت خودت رو باهاشون تلف نکن .

Armin060
یک شنبه 27 دی 1388, 13:38 عصر
اصلا فکر نمی کردم به این زودی جواب بگیرم.....:متفکر:

اون موقع که داشتم می نوشتم باید می رفتم کاری انجام، این شد که وقت نشد کد رو بنویسم.
و اینکه دارم زبونم رو قوی می کنم.
اون تیکه هایی که از کتاب های زبان اصلی خوندم، تقریبا انگار نویسنده ی این مقاله برداشته همون رو ترجمه کرده و کد ++C رو حذف کرده و به جاش Delphi گزاشته. هر چند با این حال اون کتاب ها خیلی بهتر بودن. :متفکر:

خوب اینم کد. ممنون میشم من رو راهنمایی کنید، این طوری هم مشکل اصلیم حل میشه و هم کمی بیشتر Delphi یاد می گیرم.




unit ch02;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, OpenGL;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
hrc: HGLRC; // Permanent Rendering Context
f_Hdc : LongInt;
implementation
{$R *.DFM}
procedure InitGL; // All Setup For OpenGL Goes Here
begin
// select clearing color
glClearColor( 0, 0, 0, 0);
// initialize viewing values
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glOrtho( 0, 1, 0, 1, -1, 1);
end;
procedure DrawGLScene();
// Here's Where We Do All The Drawing!!!
//Right after glLoadIdentity and before DrawGLScene:=true
begin
// Enable depth testing and clear the color and depth buffers.
glEnable(GL_DEPTH_TEST);
// Clear The Screen And The Depth Buffer
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION); // Select The Projection Matrix

glLoadIdentity(); // Reset The View
glOrtho( 0, 1, 0, 1, -1, 1);
// Set the drawing color to blue.
glColor3f(1.0, 1.0, 1.0);
glBegin (GL_POLYGON);
glVertex3f (0.25, 0.25, 0);
glVertex3f (0.75, 0.25, 0);
glVertex3f (0.75, 0.75, 0);
glVertex3f (0.25, 0.75, 0);
glEnd;
// Flush the drawing pipeline.
glFlush;
end;
procedure CleanUp(Handle: HDC); //Properly Kill The Window
begin
if hrc<> 0 then //Is There A Rendering Context?
begin
//Are We Able To Release Dc and Rc contexts?
if (not wglMakeCurrent(handle,0)) then
MessageBox(0,'Release of DC and RC failed.'
,' Shutdown Error',MB_OK or MB_ICONERROR);
//Are We Able To Delete The Rc?
if (not wglDeleteContext(hRc)) then
begin
MessageBox(0,'Release of Rendering Context failed.',
' Shutdown Error',MB_OK or MB_ICONERROR);
hRc:=0; //Set Rc To Null
end;
end;
end;
procedure SetDCPixelFormat(Handle: HDC;ColorBits,DepthBufferBits:integer);
var
pfd: TPixelFormatDescriptor;
nPixelFormat: Integer;
begin
FillChar(pfd, SizeOf(pfd), 0);
with pfd do begin
nSize := sizeof(pfd); // Size of this structure
nVersion := 1; // Version number
dwFlags := PFD_SUPPORT_OPENGL Or PFD_DRAW_TO_WINDOW
Or PFD_TYPE_RGBA; // Flags
iPixelType:= PFD_TYPE_RGBA; // RGBA pixel values
cColorBits:= ColorBits; // 24-bit color
cDepthBits:= DepthBufferBits; // 32-bit depth buffer
iLayerType:= PFD_MAIN_PLANE; // Layer type
end;
nPixelFormat := ChoosePixelFormat(Handle, @pfd);
//Did We Find A Matching Pixelformat?
if (nPixelFormat=0) then
begin
CleanUp(handle); //Reset The Display
MessageBox(0,'Cant''t Find A Suitable PixelFormat.'
,'Error',MB_OK or MB_ICONEXCLAMATION);

Halt(1); { Halt right here! }
end;
//Are We Able To Set The Pixelformat?
if (not SetPixelFormat(Handle, nPixelFormat, @pfd)) then
begin
CleanUp(handle); //Reset The Display
MessageBox(0,'Cant''t set PixelFormat.'
,'Error',MB_OK or MB_ICONEXCLAMATION);
Halt(1); { Halt right here! }
end;
hrc := wglCreateContext(Handle);
if (hRc=0) then
begin
CleanUp(handle); //Reset The Display
MessageBox(0,'Cant''t create a GL rendering context.'
,'Error',MB_OK or MB_ICONEXCLAMATION);
Halt(1); { Halt right here! }
end;
//Are We Able To Activate The Rendering Context?
if (not wglMakeCurrent(Handle, hrc)) then
begin
CleanUp(handle); //Reset The Display
MessageBox(0,'Cant''t activate the GL rendering context.'
,'Error',MB_OK or MB_ICONEXCLAMATION);
Halt(1); { Halt right here! }
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
f_Hdc:=GetDC(Handle);
// Create a rendering context.
SetDCPixelFormat(f_Hdc,16,16);
InitGL;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
// Clean up and terminate.
CleanUp(f_Hdc);
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
// Draw the scene.
wglMakeCurrent(f_Hdc,hrc); //activate the RC
DrawGLScene;
end;
procedure TForm1.FormResize(Sender: TObject);
begin
// Redefine the viewing volume and viewport
//when the window size changes.
wglMakeCurrent(f_Hdc, hrc);

// Reset The Current Viewport And Perspective
// Now, set up the viewing area-select the full client area
glViewport( 0, 0, Width , Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); // Reset The Projection Matrix
gluOrtho2D(0, Width, 0, Height);
DrawGLScene();
end;
end.


خوب اولین سوالم در مورد کد بالا این هست که منظور از کلمه interface در اول کد چی هست؟

Felony
یک شنبه 27 دی 1388, 13:47 عصر
Interface اسکلت کلی برنامه رو در دلفی تشکیل میده ، یعنی تمام کدهای اصلی برنامه بعد از این کلمه کلیدی قرار میگیرند .

در ضمن فکر نمیکنم کسی اینقدر وقت داشته باشه که این کدها رو برای شما تشریح کنه ، این جور چیزها پیش پا افتاده در دلفی رو میتونید از تو هر کتاب آموزشی پیدا کنید و فرا بگیرید و منتظر پاسخ دیگران نمونید .

Armin060
یک شنبه 27 دی 1388, 13:58 عصر
اوووه :اشتباه: ببخشید. شما درست می گید. خوب من الان میرم به مقاله واسه Delphi می گیرم و اگر چیز مبهی برام باقی موند، گمونم باید مزاحم بشم. ببخشید واقعا، هیچ حواسم نبود.

Armin060
یک شنبه 27 دی 1388, 18:53 عصر
اینطوری خیلی بهتر شد، تقریبا دارم کل کد ها رو متوجه میشم. اما یه جا به مشکل بر خوردم. ممنون میشم کمک کنید.


procedure SetDCPixelFormat(Handle: HDC;ColorBits,DepthBufferBits:integer);


و یه مشکل دیگه که نفهمیدم. آیا Delphi بین حروف کوچک و بزرک فرق میزاره؟

Felony
یک شنبه 27 دی 1388, 19:01 عصر
اینطوری خیلی بهتر شد، تقریبا دارم کل کد ها رو متوجه میشم. اما یه جا به مشکل بر خوردم. ممنون میشم کمک کنید.


procedure SetDCPixelFormat(Handle: HDC;ColorBits,DepthBufferBits:integer);


و یه مشکل دیگه که نفهمیدم. آیا Delphi بین حروف کوچک و بزرک فرق میزاره؟
چیه این کد براتون نامفهومه ؟

در مورد تفاوت میان حروف بزرگ و کوچک هم خیر ، تفاوتی قائل نمیشه ، به عبارت دیگه Case Sensitive نیست .

Armin060
یک شنبه 27 دی 1388, 19:07 عصر
چرا بعد از Handle: HDC سمی کالن گزاشته و ColorBits هیچ نوعی نداره! آیا اینجا منظور اینه که ColorBits هم از نوع HDC هست؟

Felony
یک شنبه 27 دی 1388, 19:25 عصر
چرا بعد از Handle: HDC سمی کالن گزاشت
سمی کالن برای این هست که به کامپایلر بگه معرفی متغیر اول تمام شد .


ColorBits هیچ نوعی نداره!
نوع داره ، نوعش Integer هست .


آیا اینجا منظور اینه که ColorBits هم از نوع HDC هست؟
وقتی از , استفاده شده یعنی : ColorBits و DepthBufferBits از نوع Integer هستند .