![]() |
Delphi XE2 eigene Klasse nicht gefunden
Moin,
nach langer Abstinenz habe ich doch mal wieder eine Frage. Ich habe Delphi XE2 Professional und das TMS Component Pack frisch auf meinem Rechner isntalliert. Für eine erweiterung der TMSPolyList habe ich ein eigenes Package erstellt, darin von einer TMS Komponente abgeleitet und die Klasse mit:
Code:
registriert.
procedure Register;
begin RegisterPolyItem(TMPWedgeItem); RegisterClass(TMPWedgeItem); end; Das funktioniert auch alles wie gewünscht. Wenn ich jetzt Delphi neustarte und ein Projekt öffne, dass diese Klasse einbindet, bekomme ich die Meldung "Klasse XYZ nicht gefunden". Das lässt sich nur lösen, wenn ich das Package de- und wieder neuinstalliere. Dann funktioniert es zumindest bis zum nächsten Programmstart ;) Unter "Komponente -> Packages isntallieren" wird mit das Package auch mit einem Haken angezeigt. Hat einer von euch zufällig eine Glaskugel, die mir verrät, was ich falsch mache? Die BPL wird mir in "C:\Users\Public\Documents\RAD Studio\9.0\Bpl" erstellt. Gibt es ein Problem mit den Standard-Einstellungen der Delphi Installation? Gruß Dirk |
AW: Delphi XE2 eigene Klasse nicht gefunden
Ist die Unit auch im Bibliothekspfad zu finden?
|
AW: Delphi XE2 eigene Klasse nicht gefunden
Hallo Detlef,
ich habe den Pfad in den Projekt-Suchpfad aufgenommen und kann die Unit auch mit [Strg] über den Quelltext aufrufen. Ich bekomme aber leider weiterhin den Fehler nach einem Programmneustart. |
AW: Delphi XE2 eigene Klasse nicht gefunden
Den Pfad zum Source in den Suchpfad und den Pfad zu den compilierten Teilen (dcu) in den Bibliothekspfad
|
AW: Delphi XE2 eigene Klasse nicht gefunden
Das verwechsel ich jedes Mal, es muss schwer sein, sich 2 Werte zu merken :stupid:
|
AW: Delphi XE2 eigene Klasse nicht gefunden
Liste der Anhänge anzeigen (Anzahl: 2)
Nur damit wir jetzt nicht aneinander vorbei reden:
Ich habe den Pfad zur Pas-Datei in den Suchpfad der Projekt-Optionen und den Pfad zur DCU in den Bibliothekspfad des Programms eingetragen. Zur Erklärung, was ich meine habe ich auch mal zwei Screenshots angehängt. Das funktioniert leider auch nicht. |
AW: Delphi XE2 eigene Klasse nicht gefunden
Wieso in den Suchpfad der Projektoptionen und nicht in den Delphi-Suchpfad?
|
AW: Delphi XE2 eigene Klasse nicht gefunden
War nur eine Eingebung... gut, keine wirklich gute ;)
In den Delphi Einstellungen bewirkt es auch nichts.... |
AW: Delphi XE2 eigene Klasse nicht gefunden
*Pfuh* das Package ist nicht irgendwie in den DisabledPackages gelandet? Sonst fällt mir langsam auch nichts mehr ein.
|
AW: Delphi XE2 eigene Klasse nicht gefunden
DisabledPackages?
Wo finde ich das? Hier nochmal den Quelltext der Unit, vielleicht bin ja einfach nur dämlich und mache was Grundlegendes falsch?
Code:
unit MPWedgeItem;
interface uses Windows, Classes, GDIPCustomItem, Graphics, GDIPTextItem, AdvGDIP, GDIPFill; const MAJ_VER = 1; // Major version nr. MIN_VER = 0; // Minor version nr. REL_VER = 0; // Release nr. BLD_VER = 0; // Build nr. //v0.9.0.0 : First Beta Release //v1.0.0.0 : First Release type TWedgePosition = (wpLeft, wpRight); TWedgePositions = set of TWedgePosition; TMPWedgeItem = class(TTextItem) private FWedgePositions: TWedgePositions; FWedgeSize: integer; FWedgeStates: TItemStates; procedure SetWedgePositions(const Value: TWedgePositions); procedure SetWedgeSize(const Value: integer); procedure SetWedgeStates(const Value: TItemStates); protected function GetVersionNr: integer; override; procedure DrawFocus(g: TGPGraphics; ARect: TGPRectF; ItemAppearance: TItemAppearance); override; function GetWedgeRect(ARect: TGPRectF): TGPRectF; public constructor Create(AOwner: TComponent); override; procedure Assign(Source: TPersistent); override; function CreateNewItem(AOwner: TComponent): TCustomItem; override; function GetClassType: TComponentClass; override; class function CustomClassName: String; override; procedure DrawInRect(g: TGPGraphics; ItemAppearance: TItemAppearance; R: TGPRectF); override; function DrawText(g: TGPGraphics; ARect: TGPRectF; ItemAppearance: TItemAppearance; DoText: Boolean = true): TGPRectF; override; published property WedgePositions: TWedgePositions read FWedgePositions write SetWedgePositions default [wpRight]; property WedgeSize: integer read FWedgeSize write SetWedgeSize default 6; property WedgeStates: TItemStates read FWedgeStates write SetWedgeStates default [isNormal, isHovered, isDown, isSelected]; end; procedure Register; procedure UnRegister; implementation procedure Register; begin RegisterPolyItem(TMPWedgeItem); RegisterClass(TMPWedgeItem); end; procedure UnRegister; begin UnRegisterClass(TMPWedgeItem); end; { TWedgeItem } procedure TMPWedgeItem.Assign(Source: TPersistent); begin inherited; if Source is TMPWedgeItem then begin FWedgePositions := (Source as TMPWedgeItem).WedgePositions; FWedgeSize := (Source as TMPWedgeItem).WedgeSize; FWedgeStates := (Source as TMPWedgeItem).WedgeStates; Changed; end; end; constructor TMPWedgeItem.Create(AOwner: TComponent); begin inherited; FWedgePositions := [wpRight]; FWedgeSize := 6; FWedgeStates := [isSelected]; Self.CaptionMargin.Left := 10; end; function TMPWedgeItem.CreateNewItem(AOwner: TComponent): TCustomItem; begin Result := TMPWedgeItem.Create(AOwner); end; class function TMPWedgeItem.CustomClassName: String; begin Result := 'MPFeuer Wedge Item'; end; procedure TMPWedgeItem.DrawInRect(g: TGPGraphics; ItemAppearance: TItemAppearance; R: TGPRectF); type TPointArray = array of TGPPointF; var rgn: TGPRegion; f: TGDIPFill; s: integer; pth: TGPGraphicsPath; wdRight, wdLeft: TPointArray; p: TGPPen; ir: TGPRectF; begin if (WedgePositions <> []) and (self.State in WedgeStates) then begin ir := MakeRect(r.x, r.y, r.width + 1, r.height + 1); f := GetFill(ItemAppearance); p := TGPPen.Create(MakeColor(f.BorderOpacity, f.BorderColor), f.BorderWidth); rgn := TGPRegion.Create(ir); s := WedgeSize; pth := TGPGraphicsPath.Create; if wpRight in WedgePositions then begin SetLength(wdRight, 3); wdRight[0] := MakePoint(ir.X + ir.Width, ir.Y - s + (ir.Height - 1) / 2); wdRight[1] := MakePoint(ir.X + ir.Width - s, ir.Y + (ir.Height - 1) / 2); wdRight[2] := MakePoint(ir.X + ir.Width, ir.Y + s + (ir.Height - 1) / 2); pth.AddPolygon(PGPPointF(wdRight), 3); rgn.Exclude(pth); end; if wpLeft in WedgePositions then begin SetLength(wdLeft, 3); wdLeft[0] := MakePoint(ir.X, ir.Y - s + ir.Height / 2); wdLeft[1] := MakePoint(ir.X + s, ir.Y + ir.Height / 2); wdLeft[2] := MakePoint(ir.X, ir.Y + s + ir.Height / 2); pth.AddPolygon(PGPPointF(wdLeft), 3); rgn.Exclude(pth); end; g.SetClip(rgn); inherited; g.ResetClip; pth.Free; rgn.Free; if wpRight in WedgePositions then begin g.DrawLine(p, wdRight[0].X-1, wdRight[0].Y, wdRight[1].X-1, wdRight[1].Y); g.DrawLine(p, wdRight[1].X-1, wdRight[1].Y, wdRight[2].X-1, wdRight[2].Y); end; if wpLeft in WedgePositions then begin g.DrawLine(p, wdleft[0].X, wdleft[0].Y, wdleft[1].X, wdleft[1].Y); g.DrawLine(p, wdleft[1].X, wdleft[1].Y, wdleft[2].X, wdleft[2].Y); end; p.Free; end else inherited; end; procedure TMPWedgeItem.DrawFocus(g: TGPGraphics; ARect: TGPRectF; ItemAppearance: TItemAppearance); begin inherited DrawFocus(g, GetWedgeRect(ARect), ItemAppearance); end; function TMPWedgeItem.DrawText(g: TGPGraphics; ARect: TGPRectF; ItemAppearance: TItemAppearance; DoText: Boolean = true): TGPRectF; begin Result := inherited DrawText(g, GetWedgeRect(ARect), ItemAppearance, DoText); end; function TMPWedgeItem.GetClassType: TComponentClass; begin Result := TMPWedgeItem; end; function TMPWedgeItem.GetVersionNr: integer; begin Result := MakeLong(MakeWord(BLD_VER,REL_VER),MakeWord(MIN_VER,MAJ_VER)); end; function TMPWedgeItem.GetWedgeRect(ARect: TGPRectF): TGPRectF; begin Result := ARect; if (self.State in WedgeStates) then begin if wpRight in WedgePositions then begin Result.Width := Result.Width - WedgeSize; end; if wpLeft in WedgePositions then begin Result.X := Result.X + WedgeSize; Result.Width := Result.Width - WedgeSize; end; end; end; procedure TMPWedgeItem.SetWedgePositions(const Value: TWedgePositions); begin if FWedgePositions <> Value then begin FWedgePositions := Value; Changed; end; end; procedure TMPWedgeItem.SetWedgeSize(const Value: integer); begin if FWedgeSize <> Value then begin FWedgeSize := Value; Changed; end; end; procedure TMPWedgeItem.SetWedgeStates(const Value: TItemStates); begin if FWedgeStates <> Value then begin FWedgeStates := Value; Changed; end; end; end. |
AW: Delphi XE2 eigene Klasse nicht gefunden
Schau mal in der Registry unter HKCU\Software\Embarcadero\BDS\9.0\DisabledPackages
|
AW: Delphi XE2 eigene Klasse nicht gefunden
Danke dir und nein, da stehts nicht drin.
Ich weiß nur nicht, ob das an der Klasse, an mir, oder generell an der Standard Installation von Delphi XE2 liegt. |
AW: Delphi XE2 eigene Klasse nicht gefunden
Mit Nicht-Standard-Komponenten gibt es ja öfter einmal Probleme. Nur habe ich im Moment keinen Ansatzpunkt, was Dein spezielles nun sein könnte :gruebel:
|
AW: Delphi XE2 eigene Klasse nicht gefunden
Ich habe mal eine einfache Klasse von TObject abgeleitet.
Damit muss ich zwar auch die Suchpfade anpassen, habe aber das Problem mit Klasse nicht gefunden nicht. D.h. es muss wirklich nur an den TMS Komponenten liegen. Also werde ich mal deren Support weiter stressen ;) Danke dir auf jeden Fall. |
AW: Delphi XE2 eigene Klasse nicht gefunden
Die Prozedur Register wird nur einmalig beim Installieren des Packages aufgerufen. Da du das nach dem Neustart nicht erneut installierst, wird das auch nicht aufgerufen.
Vielleicht wäre initialization eher etwas für dich? Oder kannst du vielleicht RegisterComponent statt RegisterClass benutzen (je nachdem was du willst)? |
AW: Delphi XE2 eigene Klasse nicht gefunden
Hallo Sebastian,
vielen Dank für den Hinweis, damit funktioniert es. Gruß Dirk |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz