Autor Beitrag
OsCor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
BeitragVerfasst: Di 15.03.11 10:56 
Hallo,

beim Reinschnuppern in Prism über den Primer von ChristianS. habe ich beim Einrichten einer Schnittstellenklasse ein Verständnisproblem. Beim folgenden Quelltext erhalte ich den Fehler PE86 (Sichtbarkeitsbezeichner sind in Schnittstellen nicht zulässig). Wenn ich die Methode ohne private und Co deklariere, bekomme ich eine ganze Latte von Fehlermeldungen.

ausblenden Delphi-Prism-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
namespace OOPSample;

interface

uses
  System.Drawing;

type
  IDrawableObject = public interface
//  private
  protected
  public
    method DrawOn(aBmp : Bitmap);
  end;
  
implementation
method IDrawableObject.DrawOn(aBmp : Bitmap);
begin
  if aBmp = nil then
  exit;
  using gr := Graphics.FromImage(aBmp) do
    gr.DrawRectangle(Pens.Black, X, Y, Width, Height);

end;

end.


Kann mich da jemand auf den Pfad der Tugend führen? Im Moment tappe ich ziemlich im Nebel rum.

Oswald

Moderiert von user profile iconChristian S.: Delphi- durch Prism-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20413
Erhaltene Danke: 2231

Win 10
C# (VS 2017)
BeitragVerfasst: Di 15.03.11 10:59 
Hallo!

Ein Interface legt ja nur die Schnittstelle fest, da hat die Implementation erstmal nichts zu suchen. Du musst eine Klasse erstellen, die dieses Interface implementiert und der kommt dann auch die Implementation der Methode:

ausblenden Delphi-Prism-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
namespace OOPSample;

interface

uses
  System.Drawing;

type
  IDrawableObject = public interface
     method DrawOn(aBmp : Bitmap);
  end;

  DrawableObject = public class(IDrawableObject)
  public
    method DrawOn(aBmp : Bitmap);
  end;
  
implementation

method DrawableObject .DrawOn(aBmp : Bitmap);
begin
  if aBmp = nil then
  exit;
  using gr := Graphics.FromImage(aBmp) do
    gr.DrawRectangle(Pens.Black, X, Y, Width, Height);

end;

end.


Grüße,
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
OsCor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
BeitragVerfasst: Di 15.03.11 12:06 
Weia, da waberts mächtig in meinem Hirn.

Nachdem jetzt wenigstens die Schnittstellenklasse aussieht, wie sie sollte, gibt es aber immer noch Probleme:
- in der IDrawableObjects.pas wird in der Fehlerliste der unbekannte Bezeichner X moniert, der in der MyGeomObject.pas brav wie auch Y als public property deklariert ist.
- in der MyRectangle.pas PE48: Schnittstellenmethode ist nicht implementiert "OOPSample.IDrawableObject.DrawOn(aBmp: System.Drawing.Bitmap)
- den hier deklarierten Bezeichner fBitmap findet er auch nicht.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
constructor MainForm;
begin
  //
  // Required for Windows Form Designer support
  //
  InitializeComponent();
  fBitmap := new Bitmap(pbCanvas.Width, pbCanvas.Height);
  //
  // TODO: Add any constructor code after InitializeComponent call
  //
end;

Nachdem ich mich durch die anderen Bereiche des Crash-Kurses durchgewühlt habe, stehe ich hier noch ziemlich auf dem Schlauch.

Oswald
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20413
Erhaltene Danke: 2231

Win 10
C# (VS 2017)
BeitragVerfasst: Di 15.03.11 12:10 
Hallo!

Ohne Deinen Quelltext zu sehen, kann ich da leider nicht viel helfen. Am Besten postest Du die relevanten Ausschnitte hier mal :-)

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
OsCor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
BeitragVerfasst: Di 15.03.11 23:20 
Kommt morgen.

BTW: Wieso habe ich den Eintrag von 11:10 den ganzen Tag über nicht sehen können? Auf dem Schlauch stehend Tomaten auf den Augen - ist ja fast zirkusreif :-)

Oswald

Edit: Hier ist die MyRectangle.pas mit der Fehlermeldung 'error PE48: Schnittstellenmethode ist nicht implementiert "OOPSample.IDrawableObject.DrawOn(aBmp: System.Drawing.Bitmap)'

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
namespace OOPSample;

interface

uses
  System.Collections.Generic,
  System.Text;

type
  MyRectangle = public class(MyGeomObject, IDrawableObject)
  private
    fWidth, fHeight: Single;
    method set_Width(value: Single);
    method set_Height(value: Single); 
  protected
    method GetArea: Single; override;
    
  public
    property Width: Single read fWidth write set_Width;
    property Height: Single read fHeight write set_Height;
    method ToString: Stringoverride;
  end;

implementation

method MyRectangle.GetArea: Single;
begin
  result := self.Height * self.Width;
end;

method MyRectangle.set_Width(value: Single);
begin
  if value > 0 then
    fWidth := value;
end;

method MyRectangle.set_Height(value: Single);
begin
  if value > 0 then
    fHeight := value;
end;

method MyRectangle.ToString: String;
begin
  result := 'Rectangle @ ('+ X.ToString+', '+Y.ToString+') : '+ Width.ToString + ' x '+Height.ToString;
end;


end.


Das ist die Main.pas, in der fBitmap als unbekannter Bezeichner moniert wird. Ferner fehlt ein Semikolon

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
namespace OOPSample;

interface

uses
  System.Drawing,
  System.Collections,
  System.Collections.Generic,
  System.Windows.Forms,
  System.ComponentModel;

type
  /// <summary>
  /// Summary description for MainForm.
  /// </summary>
  MainForm = partial class(System.Windows.Forms.Form)
  private
    method CreateGeomObject: MyGeomObject;
    method btnArea_Click(sender: System.Object; e: System.EventArgs);
    method btnAdd_Click(sender: System.Object; e: System.EventArgs);
    method btnDraw_Click(sender: System.Object; e: System.EventArgs);
  protected
    method Dispose(disposing: Boolean); override;
  public
    constructor;
  end;

implementation

{$REGION Construction and Disposition}
constructor MainForm;
begin
  //
  // Required for Windows Form Designer support
  //
  InitializeComponent();
  fBitmap := new Bitmap(pbCanvas.Width, pbCanvas.Height);
  //
  // TODO: Add any constructor code after InitializeComponent call
  //
end;

method MainForm.Dispose(disposing: Boolean);
begin
  if disposing then begin
    if assigned(components) then
      components.Dispose();

    //
    // TODO: Add custom disposition code here
    //
  end;
  inherited Dispose(disposing);
end;
{$ENDREGION}

method MainForm.CreateGeomObject : MyGeomObject;
begin
  if tcGeometricalObjects.SelectedTab = tpRectangle then
    result := new MyRectangle(
    Height := Single.Parse(tbHeight.Text),
    Width := Single.Parse(tbWidth.Text)
    );
   if tcGeometricalObjects.SelectedTab = tpCircle then
    result := new MyCircle(
    Radius := Single.Parse(tbRadius.Text)
    );
end;

method MainForm.btnArea_Click(sender: System.Object; e: System.EventArgs);
begin
    var geomObject := CreateGeomObject;
  MessageBox.Show(geomObject.Area.ToString);
end;

method MainForm.btnAdd_Click(sender: System.Object; e: System.EventArgs);
begin
    var geomObject := CreateGeomObject;
  geomObject.X := Single.Parse(tbX.Text);
  geomObject.Y := Single.Parse(tbY.Text);
  lbGeometricalObjects.Items.Add(geomObject);
end;

method MainForm.btnDraw_Click(sender: System.Object; e: System.EventArgs);
begin
    using gr := Graphics.FromImage(fBitmap) do
    gr.Clear(Color.White);
  for g : MyGeomObject in lbGeometricalObjects.Items do      //  <<-- hier wird ein fehlendes Semikolon angemahnt. Wieso?
    if g is IDrawableObject then
    IDrawableObject(g).DrawOn(fBitmap);
    pbCanvas.Image := fBitmap;
end;

end.


Bei Bedarf poste ich hier auch andere *.pas-Dateien (damit es nicht zu unübersichtlich wird).
OsCor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
BeitragVerfasst: Mi 16.03.11 14:46 
Wo ist er denn jetzt abgeblieben?

Oswald :?:
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20413
Erhaltene Danke: 2231

Win 10
C# (VS 2017)
BeitragVerfasst: Mi 16.03.11 16:59 
user profile iconOsCor hat folgendes geschrieben Zum zitierten Posting springen:
Wo ist er denn jetzt abgeblieben?
Wie meinen?


Die Fehlermeldung in Verbindung zu dem Quelltext its doch irgendwie klar: Du hast in der MyRectangle-Klasse keine Methode DrawOn, die muss ja aber da rein, wenn die Klasse IDrawableObject implementiert. Also so, wie ich es Beispielhaft in der Klasse DrawableObject gemacht habe.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
OsCor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
BeitragVerfasst: Mi 16.03.11 17:16 
Hallo Christian,

ich bin zwar Uraltprogrammierer, aber ich programmiere erst seit Neuestem wieder regelmäßig, weil viele Jahre mit anderen Aufgaben betraut.
Wie man mit Klassen, Schnittstellen und Methoden umgeht, ist für mich tatsächlich weitgehend Neuland - richtiggehende Gehirnakrobatik sozusagen.
Deshalb bin ich ja sehr dankbar, mit dem Primer und deiner Unterstützung dazu zu lernen. Da helfen auch die anderen Forumsthreads enorm weiter.

Oswald