Forward type not resolved ?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Forward type not resolved ?

Beitrag von pluto »

Hallo,
ich habe ein problem bei folgenden code:

Code: Alles auswählen

type
 
  { TmyList }
 
  TPaint2Main = class;
  end;

da kommt die fehlermeldung die oben im titel angezeigt wird.und ich weiß nicht warum.

Code: Alles auswählen

implementation
 
{ TmyList }
uses upaint2main;
 
function TmyList.GetItemIndex(x,y:Integer;Obj:TObjectList;state:TShiftState):Integer;
....

so sieht das ganze in etwa aus kann mir jemmand erklären warum hier eine fehlermeldung kommt ?
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

hinter dem class darf kein semikolon stehen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

dann kommt aber eine fehlermeldung das dort eine ; fehlt...
aber ich habe das problem jetzt umgang weil ich gesehen habe das ich es auf einen anderen weg zum meinem ziel schaffen kann !
MFG
Michael Springwald

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Beitrag von Euklid »

pluto hat geschrieben:dann kommt aber eine fehlermeldung das dort eine ; fehlt...


Ansonsten hätte ich jetzt vermutet, dass weiter oben ein ; fehlt.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

du meinst zweimal ; ?
kann ich ja nochmal testen bei gelegenheit !

vielen dank erstmal !
MFG
Michael Springwald

Peter
Beiträge: 12
Registriert: So 26. Nov 2006, 19:07

Beitrag von Peter »

Hallo,

die Fehlermeldung besagt, das ein Zugriff auf einen typ erfolgen soll, der noch nicht deklariert (angelegt) ist. Du must den Typ erst deklarieren, bevor Du ihn das erstemal benutzt.

Beispiel aus Pascal:

Procedure Berechne_etwas;
var
...
begin
Zeige_irgendeinentext;
....
end;
end;

Procedure Zeige_irgendeinentext;
begin
......
end;

Hier müsste die Procedure Zeige_irgendeinentext erst deklariert werden (im Quelltext oberhalb von Procedure Berechne_etwas stehen). Ansonsten mußt Du die Anweisung Forward einsetzen.

Gruß
Peter

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Leute schaut euich doch mal den code an und glaubt nicht immer gleich alles,

hier zum vergleich einmal die deklaration von einer Form:

TForm1 = class(TForm)
end;

Und was fällt uns da auf ?

Pluto ich wollt dazu eingentlich nicht nochmal was sagen aber bevor sich hier noch mehr leute verausgaben...

TPaint2Main = class; <<<< Forward Deklaration durch das ; denkt der compiler die eigentliche klassendeklaration kommt später irgendwo noch was nicht der fall ist wenn er den rest des programms geparst hat meckert er weil er die forward deklaration zurecht nicht gefunden hat.
end; <<< das macht dort im falle einer forward deklaration keinen sinn und fehlt woanders deshalb bekommst du ne fehlermeldung wenn du das ; hinter class wegnimmst.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

aber die klasse wird doch in einer andren unit defniert und aufgebaut... und diese unit habe ich doch unten angeben.....
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Was macht dann das end; dort ? Das ist doch dann vollends sinnlos.
Und wo hast du die angegeben ? Irgendwie nervig wenn ihr immer nur kleine brocken vom Source in die Fragen werft und dann eine korrekte antwort erwartet. Das selbe machen die im englischsprachigen Laz forum permanent.
Du hast da oben 2 brocken code in dien posting gesteckt die für mich keinen ersichtlichen zusammenhang haben. Also noch mal von vorn wo genau kommt nun die Fehlermeldung (auch die cursorposition) und was genau steht da drin.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Ei, ei.

Das sollte wohl ne forward-declaration a la Delphi werden. Das geht natürlich, aber dann mußt du das {end;} da wegnehmen. Dann haste Deinen Dummy.

Nur frag ich mich wozu soll das gut sein? Du kannst doch die Unit in der das Teil deklariert wird im interface aufnehmen, dann steht das mit seinem Classname direkt z.V. (zur Verfügung).

Sowas macht man eigentlich nur, wenn man vor der Deklaration der Klasse das Dings in einer anderen Klasse verwenden will, also direkt unter dem forward.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ich habe das problem jetzt in einem andren projekt:
unit uPaint2Object;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils;

type
TPaint2Object = class(TPersistent);
TPaint2Obj = class(TPaint2Object);


TonChangeObj = procedure(Newobj:TPaint2Obj) of object;

TPaint2Object = class(TPersistent)
private
fName:String;
procedure SetName(Value:String);
function GetName:String;
published
property Name:String read GetName write SetName;

end;

implementation

uses upaint2ObjBase;

jetzt kommt folgende fehlermeldung vom complier:
uPaint2Object.pas(17,19) Error: Duplicate identifier "TPaint2Object"
uPaint2Object.pas(27,1) Fatal: There were 1 errors compiling module, stopping
ich weiß einfach nicht wie ich es lösen soll
in der unit upaint2objBase sieht es so aus:

unit upaint2ObjBase;

{$MODE Delphi}

interface

uses
LCLIntf,SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Tools,StdCtrls,uPaint2Object;

const
nul1 = 0;
None = -1;
alt_Line = 0;
alt_Dreieck = 1;
alt_Vireck = 2;
alt_kreis = 3;
alt_Text = 4;
alt_Poligon = 5;
alt_agr = 6; // abgerundes Reckeck

Neu_Line = 30;
Neu_Dreieck = 31;
Neu_Vieck = 32;
Neu_Kreis = 33;
Neu_Text = 34;
Neu_Poligon = 35;
Neu_agr = 36; // abgerundes Recheck

Allgemein_cf = 60; // Farbf�ller;
Allgemein_cp = 61; // Farbfinder

Extras_ImageListA = 80;
Extras_ImageListB = 81;

type
TonAddDaten = procedure(var list:TStringList) of Object;

TPoint2 = class(TPersistent)
private
fx,fy:Integer;
published
property x:integer read fx write fx;
property y:Integer read fy write fy;

end;

TPaint2Obj = class(TPaint2Object)
protected

stdObj:TPaint2Obj;
fPosition,FSize:TPoint2;

fBrush:TBrush;
fPen:TPen;
fFont:TFont;
fVisible,fsel:Boolean;
buffer:TBitMap;
SizePoint:array of Trect;
fPointModus:Integer;
oldbrush:TBrush;
oldpen:TPen;
fFest:Boolean;
fMoved:Boolean;
procedure SetPosition(Value:TPoint2);
procedure SetSize(Value:TPoint2);

procedure SetBrush(value:TBrush);
procedure SetPen(value:TPen);
procedure SetFont(Value:TFont);
procedure SetVisible(Value:Boolean);
function GetPosition:TPoint2;
function GetSize:TPoint2;
function GetBrush:TBrush;
function GetPen:Tpen;
function GetFont:TFont;
function GetVisible:Boolean;
procedure SetObjTyp(Value:Integer);
function GetobjTyp:Integer;
procedure SetSel(Value:Boolean);
function GetSel:Boolean;
function GetPointsModus:Integer;
procedure SetPointsModus(Value:Integer);
procedure SetMoved(Value:Boolean);

published
property Position:TPoint2 read GetPosition write SetPosition;
property Size:TPoint2 read GetSize write SetSize;

property Brush:TBrush read GetBrush write SetBrush;
property Pen:TPen read GetPen write SetPen;

property Font:TFont read GetFont write SetFont;
property Visible:Boolean read GetVisible write SetVisible;
property fest:Boolean read fFest write fFest default False;

public
fTyp:integer;
pointDrawMove,pointDrawDown:Integer;
onChangeobj:TonChangeObj;

changePos:TPoint2;
changeSize:TPoint2;

property isMoved:Boolean read fMoved write SetMoved;
property Typ:Integer read GetobjTyp write SetObjTyp;
property PointsModus:Integer read getPointsModus write SetPointsModus;
property Sel:Boolean read GetSel write SetSel;
constructor Create(value:TBitMap);
procedure Draw(buffer:TBitMap;fissel:Boolean);virtual;
procedure SetSizePointIndex(x,y:Integer;Shfit:TShiftState);
procedure ChangeSizeObj(x,y:Integer);
end;
function pointTOTPoint2(x,y:Integer):TPoint2;

implementation


ps: seltsamm ich konnte diesen text nut in der console kopieren... keiner meiner programm die ich nutzen wollte dafür ging es. immer wen nich bei lazarus oder bei meinem eigenen editor diesen text makieren und kopieren wollte hat sich das programm beendet !
so langsamm nerft das das uBuntu nicht mal dazu in der lage ist !
(bin ist vor kurtzem umgestiegen von WinXp auf ubuntu, weil mir geviel ist beim testen der lieve CD und ich wollte einfach mal was neues ausbrobieren, evlt. kenne ich noch nicht die tricks wenn es um kopieren von Texten in lazraus oder in einer andren anwendung geht ! vileicht bin ich noch zu sehr an windows gewönt dor lief das meiste und es wurde irgenwann langweilig ! ich werde aber versuchen linux dismal so lange drauf zu behalten wie es nur geht !)
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Kannst du mal Schnullerbacke's Frage beantworten wozu das gut sein soll?

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Ist schon klar, der forward darf nicht so aussehen:

Code: Alles auswählen

uses 
   Classes, SysUtils;
 
type
  TPaint2Object = class(TPersistent);
  TPaint2Obj = class(TPaint2Object);


sondern so geht geht das:

Code: Alles auswählen

uses 
   Classes, SysUtils, upaint2ObjBase; // !!!!!!!
 
type
  TPaint2Object = class; //  !!!!!!!!!
 
  TonChangeObj = procedure(Newobj:TPaint2Obj) of object;
 
  TPaint2Object = class(TPersistent)
  private
     fName:String;
     procedure SetName(Value:String);
     function GetName:String;
  published
    property Name:String read GetName write SetName;
  end;
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

wenn ich das so mache kommt ne fehlermeldung das überkreuzung zweier unit oder so änlich... ich konnte dieses problem wieder umgehen !

ich habe das ereignis überschrieben.... so brauche ich keine forward defniation....
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Das mit dem zirkulären Zugriff war auch irgendwie klar. Du hast das Dings in der 2 unit aufgerufen und dafür das Teil in der uses angeben. Das Problem wird dir noch öfter begegnen. Versuch es grundsätzlich mit einfachen Typen, also zum Bleistift mit TForm oder ähnlich, soweit das geht.

Ansonsten muß ich mal tief in meinen Chatserver steigen, da hab ich ein Beispiel wie man sowas geschickt umgehen kann.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Antworten