webForumDet fria alternativet

Komma år procedurer i inkluderad fil

Programmering

6 svar · 196 visningar · startad av Alpha II

Medlem sedan maj 20002 993 inlägg
Frågan#1

Jag inkluderar filen fonts så här:

uses
  Windows,
  Messages,
  Classes,
  SysUtils,
  OpenGL,
  glAux,
  [b]Font in 'Font.pas',[/b]
  ASCLoader in 'ASCLoader.pas';

Men när jag anropar procedurer i Font.pas säger kompilatorn att de inte existerar, vad är fel???

Medlem sedan juli 2002145 inlägg
#2

Har du lagt till Font under uses i den unit där du anropar procedurerna? Koden ovan ser ut att vara från dpr-filen... Är det där du anropar procedurerna? Ligger i så fall font.pas i samma bibliotek som projektet?

Medlem sedan maj 20002 993 inlägg
#3

Ja jag anropar procedurerna ifrån dpr filen.
Vad menar du med det där om bibliotek?

Medlem sedan juli 2002145 inlägg
#4

Om du skriver Font in 'Font.pas' måste filen Font.pas ligga i samma bibliotek på disken som dpr-filen. Om den inte gör det kan du antingen ange hela sökvägen till filen under uses, t ex Font in 'C:\MittDelphiProjekt\Font.pas' eller ta bort sökvägen helt och hållet, dvs bara skriva Font under uses. I det senare fallet måste sökvägen till stället där filen ligger finnas med antingen i Library path i Environment options eller i Search path i Project options för att kompilatorn ska hitta den.

Vad får du för felmeddelande?

Om kompilatorn inte hittar filen Font.pas borde den säga File not found: 'Font.dcu'.

Om kompilatorn säger Undeclared identifier: 'MinProcedur' så tyder det på att du inte deklarerat proceduren under interface-delen i Font.pas.

Medlem sedan maj 20002 993 inlägg
#5

Så här ser Font.pas ut:

unit Font;

interface

uses
  Windows,
  OpenGL,
  glAux;

var
  Base: GLuint;
  Texture: array[0..2] of GLuint;

implementation

procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;

procedure LoadFont;
var
  TextureImage: PTAUX_RGBImageRec;
begin
  TextureImage := auxDIBImageLoadA('Font.bmp');
  if not Assigned(TextureImage) then
    Halt(1);

  glGenTextures(1, texture[0]);
  glBindTexture(GL_TEXTURE_2D, texture[0]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage^.sizeX, TextureImage^.sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage^.data);

  FreeMem(TextureImage^.data);
  FreeMem(TextureImage);
end;

procedure BuildFont;
var
  Loop: GLuint;
  cx: double;
  cy: double;
begin
  Base := glGenLists(256);
  glBindTexture(GL_TEXTURE_2D, Texture[0]);
  for loop := 0 to 255 do begin
    cx := (loop mod 16)/16.0;
    cy := (loop / 16)/16.0;

    glNewList(base+loop, GL_COMPILE);
      glBegin(GL_QUADS);
        glTexCoord2f(cx,1-cy-0.0625);
        glVertex2i(0,0);
        glTexCoord2f(cx+0.0625,1-cy-0.0625);
        glVertex2i(16,0);
        glTexCoord2f(cx+0.0625,1-cy);
        glVertex2i(16,16);
        glTexCoord2f(cx,1-cy);
        glVertex2i(0,16);
      glEnd();

      glTranslated(10,0,0);
    glEndList();
  end;
end;

procedure KillFont;
begin
  glDeleteLists(base,256);
end;

procedure glText(x, y: GLint; S: String);
var
  i: Integer;
begin
  glBindTexture(GL_TEXTURE_2D, Texture[0]);
  glDisable(GL_DEPTH_TEST);
  glMatrixMode(GL_PROJECTION);
  glPushMatrix;
  glLoadIdentity();
  glOrtho(0,640,0,480,-1,-1);
  glMatrixMode(GL_MODELVIEW);
  glPushMatrix();
  glLoadIdentity();
  
  glTranslated(x,y,0);
  glListBase(base-32+128);
  for i := 0 to Length(S)-1 do
    glCallLists(Ord(S[i]), GL_BYTE, @S);

  glMatrixMode(GL_PROJECTION);
  glPopMatrix();
  glMatrixMode(GL_MODELVIEW);
  glPopMatrix();
  glEnable(GL_DEPTH_TEST);
end;

end.
Medlem sedan maj 20002 993 inlägg
#6

...och font.pas ligger i samma mapp

Medlem sedan juli 2002145 inlägg
#7

Om du exempelvis vill anropa LoadFont från din dpr-fil måste du lägga upp procedur-deklarationen i interface delen. Det är bara den som "syns utifrån". Så här alltså:

unit Font;

interface

uses
  Windows,
  OpenGL,
  glAux;

[RED]procedure LoadFont;[/RED]

var
  Base: GLuint;
  Texture: array[0..2] of GLuint;

implementation

procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;

procedure LoadFont;
var
  TextureImage: PTAUX_RGBImageRec;
begin
  TextureImage := auxDIBImageLoadA('Font.bmp');
  if not Assigned(TextureImage) then
    Halt(1);

  glGenTextures(1, texture[0]);
  glBindTexture(GL_TEXTURE_2D, texture[0]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage^.sizeX, TextureImage^.sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage^.data);

  FreeMem(TextureImage^.data);
  FreeMem(TextureImage);
end;

procedure BuildFont;
var
  Loop: GLuint;
  cx: double;
  cy: double;
begin
  Base := glGenLists(256);
  glBindTexture(GL_TEXTURE_2D, Texture[0]);
  for loop := 0 to 255 do begin
    cx := (loop mod 16)/16.0;
    cy := (loop / 16)/16.0;

    glNewList(base+loop, GL_COMPILE);
      glBegin(GL_QUADS);
        glTexCoord2f(cx,1-cy-0.0625);
        glVertex2i(0,0);
        glTexCoord2f(cx+0.0625,1-cy-0.0625);
        glVertex2i(16,0);
        glTexCoord2f(cx+0.0625,1-cy);
        glVertex2i(16,16);
        glTexCoord2f(cx,1-cy);
        glVertex2i(0,16);
      glEnd();

      glTranslated(10,0,0);
    glEndList();
  end;
end;

procedure KillFont;
begin
  glDeleteLists(base,256);
end;

procedure glText(x, y: GLint; S: String);
var
  i: Integer;
begin
  glBindTexture(GL_TEXTURE_2D, Texture[0]);
  glDisable(GL_DEPTH_TEST);
  glMatrixMode(GL_PROJECTION);
  glPushMatrix;
  glLoadIdentity();
  glOrtho(0,640,0,480,-1,-1);
  glMatrixMode(GL_MODELVIEW);
  glPushMatrix();
  glLoadIdentity();
  
  glTranslated(x,y,0);
  glListBase(base-32+128);
  for i := 0 to Length(S)-1 do
    glCallLists(Ord(S[i]), GL_BYTE, @S);

  glMatrixMode(GL_PROJECTION);
  glPopMatrix();
  glMatrixMode(GL_MODELVIEW);
  glPopMatrix();
  glEnable(GL_DEPTH_TEST);
end;

end.
255 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)