Hier eine erweiterte Version, da es noch ein paar Probleme mehr gibt
Das leidige Problem mit der DsgnIntf bzw. Proxy.dcu
In Delphi 5 Komponenten wird oft die
Unit DsgnIntf verwendet.
Damit ist es möglich "Component-" und "Propertyeditoren" zu programmieren, die dann in der
IDE ausgeführt werden. Diese Design-Editoren sind ausschließlich für die
IDE lizenziert und dürfen nicht in die eigenen Programme, welche außerhalb der
IDE laufen eingebunden werden. Da es einige Verstöße (meistens wohl aus Unwissenheit) gab, wurden die Units getrennt und durch "Compiler-Magic" können die Editoren jetzt nicht mehr in Programme außerhalb der
IDE eingebunden werden.
Wenn keine Laufzeit-BPLs erstellt werden müssen, ist die Lösung relativ einfach:
Aus dem Eintrag DsgnIntf in der Uses Anweisung wird einfach DesignIntf, DesignEditors.
In das
Package wird dann automatisch die teilweise benötigte designide.dcp eingefügt. Und alles läuft wieder.
Falls es dennoch zu der Fehlermeldung "DesignIntf.dcu konnte nicht gefunden werden" (oder "DesignEditors.dcu konnte nicht gefunden werden") auftritt, ist der Pfad (C:\Programme\Borland\Delphi7\Source\ToolsAPI)zu den Dateien nicht im Suchpfad.
Falls die Meldung "Proxy.dcu konnte nicht gefunden werden" auftritt, muss die designide.dcp dem
Package hinzugefügt werden. (requires designide im dpk)
Damit sollten sich die Komponenten kompilieren lassen.
Beim Benutzen der Komponenten wird Delphi aber wieder Probleme haben die Property Editoren in die Exe Datei einzubinden.
Eine relativ einfache Möglichkeit ist es die Property- bzw. Component Editoren von der Komponente zu trennen.
Dazu wird der DesignIntf, DesignEditors Abschnitt, der Quelltext der Property- und Component Editoren einfach aus der Datei entfernt und in eine neue
Unit geschrieben. Der Unitname sollte dann unitname_dsgn.pas lauten. Dann ist klar was in der
Unit enthalten ist.
Es ist ratsam auch die Register Prozedur in die unitname_dsgn zu verschieben.
Abschließend ein Link zum
BDN - wo etwas tiefer in die Materie eingegangen wird. (englisch)
http://community.borland.com/article...,27717,00.html
Quellcode für D5 und D7 erstellen
Mit einer einfachen $IFDEF kann man Quelltext erstellen, der unter Delphi 5 und Delphi 7 kompiliert.
Delphi-Quellcode:
{$ifdef ver150}
DesignIntf, DesignEditors,
{$else}
DsgnIntf,
{$endif}
Dieses einfache Verfahren hat aber den Nachteil, dass es nur zwischen Delphi 7 und dem Rest unterscheidet.
Besser ist folgendes Verfahren:
Bei der JCL bzw. JVCL gibt es eine
JEDI.inc Datei die einfach eingebunden werden kann.
Hier werden Symbole definiert. (z.B. DELPHI6_UP bedeutet Delphi 6 oder neuer)
Delphi-Quellcode:
uses unit1;
{$I JEDI.inc}
interface
uses
Unit1,
{$IFDEF DELPHI6_UP}DesignIntf, DesignEditors
{$ELSE} DsgnIntf
{$ENDIF}, Unit3, Unit4;
...
Die
JEDI.INC Datei kann hier bezogen werden:
http://cvs.sourceforge.net/viewcvs.p...1.19&view=auto
Ein vollständiges Beispiel:
myLabel.pas:
Delphi-Quellcode:
unit myLabel;
interface
uses
{$ifdef ver150} DesignIntf, DesignEditors,
{$else} DsgnIntf,
{$endif}
SysUtils, Classes, Controls, StdCtrls;
type
TmyLabelCaptionPropEditor =
class(TStringProperty)
public
procedure Edit;
override;
function GetAttributes: TPropertyAttributes;
override;
end;
TmyLabel =
class(TLabel)
private
{ Private-Deklarationen }
protected
{ Protected-Deklarationen }
public
{ Public-Deklarationen }
procedure About;
published
{ Published-Deklarationen }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('
Beispiele', [TmyLabel]);
RegisterPropertyEditor(TypeInfo(TCaption), TmyLabel, '
Caption', TmyLabelCaptionPropEditor);
end;
{ TmyLabelCaptionPropEditor }
procedure TmyLabelCaptionPropEditor.Edit;
begin
inherited;
SetStrValue(DateTimeToStr(now));
Modified;
end;
function TmyLabelCaptionPropEditor.GetAttributes: TPropertyAttributes;
begin
Result:= [paDialog];
end;
{ TmyLabel }
procedure TmyLabel.About;
begin
MessageDlg('
myLabel v1.0 (c) 2004, MaBuSE', mtInformation, [mbOk], 0);
end;
end.
Das lässt sich nun im
Package mit Delphi 7 kompilieren.
verwendet man nun aber TmyLabel und kompiliert die Anwendung, so gibt es den Fehler
Fehlermeldung:
[Fataler Fehler] DesignEditors.pas(530): Datei nicht gefunden: 'Proxies.dcu'
Die
Unit mylabel.pas muss nun in 2 units gesplittet werden:
unit myLabel_dsgn.pas:
Delphi-Quellcode:
unit myLabel_dsgn;
interface
uses
SysUtils, Classes, Controls,
{$ifdef ver150} DesignIntf, DesignEditors,
{$else} DsgnIntf,
{$endif}
myLabel;
type
TmyLabelCaptionPropEditor =
class(TStringProperty)
public
procedure Edit;
override;
function GetAttributes: TPropertyAttributes;
override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('
Beispiele', [TmyLabel]);
RegisterPropertyEditor(TypeInfo(TCaption), TmyLabel, '
Caption', TmyLabelCaptionPropEditor);
end;
{ TmyLabelCaptionPropEditor }
procedure TmyLabelCaptionPropEditor.Edit;
begin
inherited;
SetStrValue(DateTimeToStr(now));
Modified;
end;
function TmyLabelCaptionPropEditor.GetAttributes: TPropertyAttributes;
begin
Result:= [paDialog];
end;
end.
und
myLabel.pas:
Delphi-Quellcode:
unit myLabel;
interface
uses
SysUtils, Classes, Controls, StdCtrls, Dialogs;
type
TmyLabel =
class(TLabel)
private
{ Private-Deklarationen }
protected
{ Protected-Deklarationen }
public
{ Public-Deklarationen }
procedure About;
published
{ Published-Deklarationen }
end;
implementation
{ TmyLabel }
procedure TmyLabel.About;
begin
MessageDlg('
myLabel v1.0 (c) 2004, MaBuSE', mtInformation, [mbOk], 0);
end;
end.
Nun funktioniert der Property Editor und das Kompilieren der Anwendung