Inc und PP Dateien

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Inc und PP Dateien

Beitrag von pluto »

Hallo,
ich habe bei meiner GUI heute alles auf PP und Inc Dateien umgestellt.

Als ich fertig wahr, bekomme ich vom Complier diese Meldung:
uMyGui.pp(121,14) Error: Forward declaration not solved "TmyShape.GetSitePen(LongInt):TPen"

das Komisch ist jetzt folgendes:

Code: Alles auswählen

{ $Id: uMyGui.pp $}
 
{
  Autor            : Michael Springwald
  Erstllungs Datum : Donnerstag, 24.Mai.2007
 
  upgedatet        :
}
 
unit uMyGui;
 
{$mode objfpc}{$H+}
 
interface
 
{$ifdef Trace}
{$ASSERTIONS ON}
{$endif}
 
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,Tools,types,uMyStyle,uMyObjManger;
 
const
  stVerti = 0;
  stHori  = 1;
  sBrush = 0;
  sPen   = 1;
  sFont  = 2;
 
type
  TChanged = array of Trect;
  tOnDraw = procedure() of Object;
 
  TMouseEV = procedure(Typ,x,y:integer;Shift:TShiftState) of Object;
  TOnBackupBuffer = procedure (t:Integer; r:TRect;sCanvas:TCanvas) of Object;
  TOnFocus = procedure of Object;
  TmyShapeStyle = (MssRectangle,MssElipsse);
 
 
  { TMyCompo }
  TMyCompo = class
  protected
    fEnabled: Boolean;
    frx,fry,frw,frh:Integer;
    fBrush:TBrush;
    fPen:TPen;
    fFont:TFont;
    fFocus: Boolean;
    fTest:Boolean;
    procedure SetValue(Index: integer; const AValue: Integer);Virtual;
    procedure SetName(const AValue: String); Virtual;
    procedure SetEnabled(const AValue: Boolean); Virtual;
    procedure SetVisible(const AValue: Boolean); Virtual;
    procedure BrushChange(Sender:TObject);Virtual;
 
  private
    fName: String;
    fvisible: Boolean;
    fHotStyle, fEnabledStyle:TmyStyle;
 
    function GetEnabled: Boolean;
    function GetEnabledStyle: TmyStyle;
    function GetHotStyle: TmyStyle;
    function GetValue(Index: integer): Integer;
    procedure SetEnabledStyle(const AValue: TmyStyle);
    procedure SetHotStyle(const AValue: TmyStyle);
  public
    onBackupBuffer:TOnBackupBuffer;
    // Für das Anzeigen
    OutCanvas:TCanvas;
    // Für den Internen Buffer
    fCanvas:TCanvas;
    // Sobald was Neu gezeichnet werden soll
    ChangeItems:TChanged;
    onDraw:TOnDraw;
 
   // FontColor,bgColor,fgColor:TColor;
    FocusStyl:TmyStyle;
    onMouseEV:TMouseEV;
 
    onFocus:TOnFocus;
    Parent:TMyCompo;
    procedure Clear(rrw:Integer = 0; rrh:Integer = 0);
 
    procedure AddRect(r:TRect);
    constructor Create;
    procedure SetFocus(const AValue: Boolean);Virtual;
 
    // Jede Komponente hat einen Eigene Draw Procdure
    procedure Draw;virtual;
    procedure SetStyle(index:Integer;Compo:TMyCompo = nil);
    procedure SetDefaultStyl(Index:Integer);
    function CanDraw:Boolean;
  published
    property rx:Integer index 0 read GetValue write SetValue;
    property ry:Integer index 1 read GetValue write SetValue;
    property rw:Integer index 2 read GetValue write SetValue;
    property rh:Integer index 3 read GetValue write SetValue;
 
    property EnabledStyle:TmyStyle read GetEnabledStyle Write SetEnabledStyle;
    property HotStyle:TmyStyle read GetHotStyle write SetHotStyle;
 
    property Brush:TBrush read fBrush write fBrush;
    property Pen:TPen read fPen write fPen;
    property Font:TFont read fFont write fFont;
 
    property Enabled:Boolean read GetEnabled write SetEnabled;
    property visible:Boolean read fvisible write SetVisible;
    property Name:String read fName write SetName;
    property Focus:Boolean read fFocus write SetFocus;
  end;
 
  { TmyShape }
  TmyShape = class(TMyCompo)
  private
    fFillBrush: TBrush;
    fFillRec: Boolean;
    fStyle: TmyShapeStyle;
    fViewLeftSite, fViewRightSize, fViewTopSite, fViewBottomSite:Boolean;
    fLeftPen, fRightPen, fTopPen, fBottomPen:TPen;
    function GetSitePen(Index: integer): TPen;
    function GetViewSite(Index: integer): Boolean;
    procedure SetFillBrush(const AValue: TBrush);
    procedure SetFillRec(const AValue: Boolean);
    procedure SetShapeStyle(const AValue: TmyShapeStyle);
    procedure SetSitePen(Index: integer; const AValue: TPen);
    procedure SetViewSite(Index: integer; const AValue: Boolean);
  protected
    procedure SetValue(Index: integer; const AValue: Integer);Override;
    procedure ChangePen(Sender:TObject);Virtual;
    procedure Draw; Override;
  public
    constructor Create;
    destructor Destroy;
  published
    property Style:TmyShapeStyle read fStyle write SetShapeStyle;
    property FillRec:Boolean read fFillRec write SetFillRec;
    property FillBrush:TBrush read fFillBrush write SetFillBrush;
 
    property ViewLeftSite:Boolean index 0 read GetViewSite write SetViewSite;
    property ViewRightSite:Boolean index 1 read GetViewSite write SetViewSite;
    property ViewTopSite:Boolean index 2 read GetViewSite write SetViewSite;
    property ViewBottomSite:Boolean index 3 read GetViewSite write SetViewSite;
 
    property LeftPen:TPen index 0 read GetSitePen write SetSitePen;
    property RightPen:TPen index 1 read GetSitePen write SetSitePen;
    property TopPen:TPen index 2 read GetSitePen write SetSitePen;
    property BottomPen:TPen index 3 read GetSitePen write SetSitePen;
  end;
//noch mehr code              
 
implementation
{$I uMyCompo.inc}
{$I uMyShape.inc}
 
{$I uMyListbox.inc}
{$I uLabel.inc}
{$I uMyCheckbox.inc}
{$I uProssesbar.inc}
{$I uMyStatusbar.inc}
{$I uMyButton.inc}
{$I uMyTrackbar.inc}
 
end.
so MyCompo Geht... so wie gewünscht,
Aber leider geht myShape nicht wegen dieser Fehler Meldung....

Kann mir da jemand weiter Helfen ?

edit00:
jetzt habe ich den Inhalt von uMyShape in uMyCompo kopiert und siehe da: es geht...
Heißt das jetzt: ich kann den Code nicht auf mehrer Dateien aufteilen ?
MFG
Michael Springwald

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

das heißt es sicher nicht, schau doch mal in ne andere Unit, beispielsweise in forms.pp sind x Includ-Dateien:

Code: Alles auswählen

//==============================================================================
 
{$I controlscrollbar.inc}
{$I scrollingwincontrol.inc}
{$I scrollbox.inc}
{$I customframe.inc}
{$I customform.inc}
{$I customdockform.inc}
{$I screen.inc}
{$I application.inc}
{$I applicationproperties.inc}
{$I hintwindow.inc}
 
 
//==============================================================================
Johannes

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

Beitrag von pluto »

Danke, das habe ich schon gemacht.

Jetzt geht es komischer weise... aber verstehen tue ich es nicht ganz.
ich habe jetzt bei
TMyCompo
TMyShape,
TMyLabel.
darunter habe ich den inlcude befehle gesetzt und bei uMyCompo habe ich:
implementation
gesetzt, aber nur dort....

Wenn erwünscht, kann ich ja die betreffende units hochladen..... es sind ja nur ein paar....
MFG
Michael Springwald

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

Beitrag von pluto »

jetzt habe ich das Problem: ich möchte eine Forwad Defnieren aber es klappt nicht:

Code: Alles auswählen

TMyCompo=class;
  TmyShape = class(TMyCompo)
 
  { TMyCompo }
  TMyCompo = class
  protected
    fEnabled: Boolean;
    frx,fry,frw,frh:Integer;
    fBrush:TBrush;
    fPen:TPen;
    fFont:TFont;
    fFocus: Boolean;
    fTest:Boolean;
    procedure SetValue(Index: integer; const AValue: Integer);Virtual;
    procedure SetName(const AValue: String); Virtual;
    procedure SetEnabled(const AValue: Boolean); Virtual;
    procedure SetVisible(const AValue: Boolean); Virtual;
    procedure BrushChange(Sender:TObject);Virtual;
    procedure SetStyleA(const AValue: TmyShape);
  private
    fName: String;
    fvisible: Boolean;
    fHotStyle, fEnabledStyle:TmyStyle;
    fStyle: TmyShape;
 
    function GetEnabled: Boolean;
    function GetEnabledStyle: TmyStyle;
    function GetHotStyle: TmyStyle;
    function GetValue(Index: integer): Integer;
    procedure SetEnabledStyle(const AValue: TmyStyle);
    procedure SetHotStyle(const AValue: TmyStyle);
  public
    onBackupBuffer:TOnBackupBuffer;
    // Für das Anzeigen
    OutCanvas:TCanvas;
    // Für den Internen Buffer
    fCanvas:TCanvas;
    // Sobald was Neu gezeichnet werden soll
    ChangeItems:TChanged;
    onDraw:TOnDraw;
 
   // FontColor,bgColor,fgColor:TColor;
    FocusStyl:TmyStyle;
    onMouseEV:TMouseEV;
 
    onFocus:TOnFocus;
    Parent:TMyCompo;
    procedure Clear(rrw:Integer = 0; rrh:Integer = 0);
 
    procedure AddRect(r:TRect);
    constructor Create;
    procedure SetFocus(const AValue: Boolean);Virtual;
 
    // Jede Komponente hat einen Eigene Draw Procdure
    procedure Draw;virtual;
    procedure SetStyle(index:Integer;Compo:TMyCompo = nil);
    procedure SetDefaultStyl(Index:Integer);
    function CanDraw:Boolean;
  published
    property rx:Integer index 0 read GetValue write SetValue;
    property ry:Integer index 1 read GetValue write SetValue;
    property rw:Integer index 2 read GetValue write SetValue;
    property rh:Integer index 3 read GetValue write SetValue;
 
    property EnabledStyle:TmyStyle read GetEnabledStyle Write SetEnabledStyle;
    property HotStyle:TmyStyle read GetHotStyle write SetHotStyle;
 
    property Brush:TBrush read fBrush write fBrush;
    property Pen:TPen read fPen write fPen;
    property Font:TFont read fFont write fFont;
 
    property Enabled:Boolean read GetEnabled write SetEnabled;
    property visible:Boolean read fvisible write SetVisible;
    property Name:String read fName write SetName;
    property Focus:Boolean read fFocus write SetFocus;
    property Style:TmyShape read fStyle write SetStyleA;
  end;
  {$I uMyCompo.inc}
bei der Zweiten meint er immer
uMyGui.pp(41,28) Error: Forward declaration of class "TMyCompo" must be resolved here to use the class as ancestor
Dabei gibt es den Header weiter Unten... im Code oder geht das nicht weil die anderen sachen nicht dabei sind also der aus gefühlte code ?
MFG
Michael Springwald

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

Beitrag von theo »

Zu *.pp: Wozu soll das gut sein? Um den Code vor Delphi zu verstecken? ;-)

Zu *.inc: Ne Inc Datei ist nur ein ausgelagerter Fetzen Quellcode.
Wenn die Deklarationen nicht korrekt sind, dann sind sie es auch im gleichen File nicht.
Will sagen: Dein Problem hat mit .inc wahrscheinlich gar nichts zu tun.

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

Beitrag von pluto »

Ja, du hast recht. Ich Dachte halt, ich muss ja eine Forward Definieren, das kann ich jedoch nicht weil der Code der jeweiligen Klassen in unterschiedliche Units aufgeteilt ist.

und pp habe ich genommen, weil die kein Interface Teil Brauchen... oder spielt das keine rolle ?

ich arbeite zum ersten mal mit PP und Inc Dateien.Ich habe mir eine Delphi 6 Hilfe Datei von meinen Sicherungen gesucht, doch das bringt mich auch nicht weiter.

Mein Ziel ist es:
ich möchte TMyShape in TmyCompo Definieren, daran scheitert es....
im Internet habe ich immer noch keine Passende Lösung gefunden.

Wenn ich uMyShape in uMyCompo eintrage gibt es die bekannte Fehler Meldung, weil ich uMyCompo schon in uMyShape verwende.

Ich sehe da nur noch eine Lösung: Alles in eine Unit Packen.

Aber das möchte ich natürlich nicht, weil es unübersichtlich währe. Selbst die Notlösung nur uMyCompo und uMyShape zusammen zu Tuen gefällt mir irgendwie nicht.

Gibt es keine Praktische Lösung für dieses Problem ?
ich weiß einfach nicht mehr weiter...

Wobei diese Inc Dateien habe noch den nachteil das sie so arbeiten wie eine normale unit.
Also die Klassen müssen in der Richtigen Reinfolge Denifert werden.

Habt ihr noch Vorschläge ?
MFG
Michael Springwald

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

Beitrag von theo »

pluto hat geschrieben: und pp habe ich genommen, weil die kein Interface Teil Brauchen... oder spielt das keine rolle ?
Nö. pp hat nur einen Effekt, nämlich dass Delphi damit nicht kann.
pluto hat geschrieben: Wobei diese Inc Dateien habe noch den nachteil das sie so arbeiten wie eine normale unit.
Also die Klassen müssen in der Richtigen Reinfolge Denifert werden.
Inc Dateien "arbeiten" überhaupt nicht. Es sind nur Fetzen von Quellcode, die statt in einer Datei in einer anderen stehen. Das ist alles!
pluto hat geschrieben: Habt ihr noch Vorschläge ?
Nachdenken! Zugegeben, es ist manchmal schon nervig, vor allem mit diesen Kreuzreferenzen.
Ein Patentrezept gibt's dafür glaub ich nicht.

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

Beitrag von pluto »

Schade !
ich lese immer wieder in diesem Zusammenhang, das Packte oder Interfaceses eine Lösung sein sollen, aber genau kann ich mir das nicht vorstellen, wie das gehen soll.....
MFG
Michael Springwald

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

Beitrag von theo »

Naja, aber was du da machst ist schon sehr seltsam.
Du benutzt in der Definition einer Klasse (TMyCompo) das Feld einer von der selben Klasse abgeleiteten Klasse (fStyle: TmyShape;). Das gibt zumindest Kopfschmerzen, selbst wenn es kompiliert.

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

Beitrag von pluto »

verstehe ich nicht ganz, ist das nicht sin und zweck der OOP ?
Wiederverwendung ?

TMyShape ist ja von TmyCompo abgeleitet.

ich habe jetzt notgedrungen die beiden Units zusammen geführt und es geht.
Ist zwar nicht besonders schön, aber was sollst, wenn Object Pascal sowas nicht kann.... muss man es halt umschiffen...

ob sowas als Anregung für eine sinnvolle Verbesserung währe, für den Kompiler ?

Wenn der Kompiler sowas schon erkennen kann, warum kann, kommt dann überhaupt diese Fehler Meldung ?
ich weiß wohl die 1. Unit wird in der Zweiten Unit aufgerufen und unbekehrt.
Der Kompiler müsste also nur verhindern, das er in eine Endlos schleife Gerät, oder sehe ich das falsch ?
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 »

Wiederverwendung gut und schön. Aber der Code ist schon etwas Sinnbefreit.
Was macht denn deine Style Property eigentlich ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Beitrag von pluto »

mit dem habe ich die Möglichkeit ein Viereck in Vier Verschinde Style zu zeichnen.

ich habe mir ein Klasse geschrieben, die ein Viereck zeichnet, bestehen aus 4 Linen. Diese Linen können andere Farben, stärken und so was haben.

Praktisch alles was TPen bittet.
Der Gedanke wahr jetzt: Das alle meine Komponenten, diese Komponente benutzen. Damit habe ich mehr spiel Raum.

im Anhang habe ich mal ein Bild hoch geladen, die es zeigen sollen, was ich genau meine !

Im Moment geht es nur bei zwei Komponenten, die ich geschrieben habe:
MyLabel, MyButton.

Und damit ich nicht 1000 mal das gleiche schreiben muss, dachte ich halt, warum nicht so:
Ich habe jetzt in TMyCompo, eine Variable von typ TmyShap.

Edit00
Das inneren Rechteck ist auch von typ TmyShape

Edit01
Wobei das stimmt auch wieder nicht so ganz.
Es ist von Typ TMyLabel und somit hat es auch ein typ TmyShape *G*
Dateianhänge
25.05.2007_GUI Test Anwendung_05.png
25.05.2007_GUI Test Anwendung_05.png (8.8 KiB) 2041 mal betrachtet
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 »

Und warum soll bitteschön Style die selbe Klasse haben wie die Komponente selbst ? Das macht NULL Sinn.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Beitrag von pluto »

Naja, eigentlich hast du recht, aber, ich nutzte in TmyStyle die gleichen Variablen und Methoden.
Darum. Ich zeichne ja ein Rechteck und dann habe ich die Variablen: rx,ry,rw,rh, visible, Enabled,
die ich auch dort nutzte. Letztendlich währe das gar nicht mal weiter Wild. aber ich dachte das währe schöner und Praktischer.

achja ich habe noch Focus... unter bestimmten Voraussetzungen kann TmyShape auch ein Focus enthalten.
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 »

versteh ich nicht wenn die Style klasse das zeichnen übernimt, wozu brauchst du dann diese Varialen/routinen nochmal in der Hauptklasse ? Umgedreht genauso.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten