Autor |
Beitrag |
OsCor
Beiträge: 55
Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
|
Verfasst: 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.
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 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 Christian S.: Delphi- durch Prism-Tags ersetzt
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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:
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
Beiträge: 55
Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
|
Verfasst: 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.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| constructor MainForm; begin InitializeComponent(); fBitmap := new Bitmap(pbCanvas.Width, pbCanvas.Height); 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.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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
Beiträge: 55
Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
|
Verfasst: 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)'
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: String; override; 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
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 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 InitializeComponent(); fBitmap := new Bitmap(pbCanvas.Width, pbCanvas.Height); end;
method MainForm.Dispose(disposing: Boolean); begin if disposing then begin if assigned(components) then components.Dispose();
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 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
Beiträge: 55
Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
|
Verfasst: Mi 16.03.11 14:46
Wo ist er denn jetzt abgeblieben?
Oswald
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 16.03.11 16:59
OsCor hat folgendes geschrieben : | 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
Beiträge: 55
Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
|
Verfasst: 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
|
|