![]() |
Lösung: Das leidige Problem mit der DsgnIntf bzw. Proxy.dcu
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. Abschließend ein Link zum BDN - wo etwas tiefer in die Materie eingegangen wird. (englisch) ![]() 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:
Dieses einfache Verfahren hat aber den Nachteil, dass es nur zwischen Delphi 7 und dem Rest unterscheidet.
{$ifdef ver150}
DesignIntf, DesignEditors, {$else} DsgnIntf, {$endif} 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:
Die JEDI.INC Datei kann hier bezogen werden:
uses unit1;
{$I JEDI.inc} interface uses Unit1, {$IFDEF DELPHI6_UP}DesignIntf, DesignEditors{$ELSE} DsgnIntf{$ENDIF}, Unit3, Unit4; ... ![]() |
Re: Lösung: Das leidige Problem mit der DsgnIntf bzw. Proxy.
Man lese auch hier:
![]() ...:cat:... P.S.: Das Problem ist, dass die Leute die fragen einfach nie suchen :roll: |
Re: Lösung: Das leidige Problem mit der DsgnIntf bzw. Proxy.
Zitat:
|
Re: Lösung: Das leidige Problem mit der DsgnIntf bzw. Proxy.
Zitat:
http://www.delphipraxis.net/images/common/icon_dp.gif ![]() |
Re: Lösung: Das leidige Problem mit der DsgnIntf bzw. Proxy.
Zitat:
...:cat:... |
Re: Lösung: Das leidige Problem mit der DsgnIntf bzw. Proxy.
Zitat:
|
Re: Lösung: Das leidige Problem mit der DsgnIntf bzw. Proxy.
Tolles Tutorial. In Delphi 7 Personal, was ich von der c't-CD habe, ist die DesignIntf aber nicht dabei, glaube ich.
Sie wird nicht gefunden! Ein Verzeichnis "ToolsAPI" existiert garnicht. Edit: Langsam werd ich wahnsinnig. Hab jetz n Delphi 3 Pro installiert um von da die DCU zu nehmen. Aber jetz kanna die PAS nicht kompilieren weil "TDesigner" fehlt... Verdammt nochmal... |
Re: Lösung: Das leidige Problem mit der DsgnIntf bzw. Proxy.
Zitat:
Aber die Unit sollte es sogar bei der Personal geben... |
Re: Lösung: Das leidige Problem mit der DsgnIntf bzw. Proxy.
Tada. Gibt es sie aber nicht :wall:
|
Re: Lösung: Das leidige Problem mit der DsgnIntf bzw. Proxy.
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) ![]() 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:
Dieses einfache Verfahren hat aber den Nachteil, dass es nur zwischen Delphi 7 und dem Rest unterscheidet.
{$ifdef ver150}
DesignIntf, DesignEditors, {$else} DsgnIntf, {$endif} 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:
Die JEDI.INC Datei kann hier bezogen werden:
uses unit1;
{$I JEDI.inc} interface uses Unit1, {$IFDEF DELPHI6_UP}DesignIntf, DesignEditors{$ELSE} DsgnIntf{$ENDIF}, Unit3, Unit4; ... ![]() Ein vollständiges Beispiel: myLabel.pas:
Delphi-Quellcode:
Das lässt sich nun im Package mit Delphi 7 kompilieren.
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. 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:
und myLabel.pas:
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.
Delphi-Quellcode:
Nun funktioniert der Property Editor und das Kompilieren der Anwendung :-)
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 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-2025 by Thomas Breitkreuz