AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Lösung: Das leidige Problem mit der DsgnIntf bzw. Proxy.dcu

Lösung: Das leidige Problem mit der DsgnIntf bzw. Proxy.dcu

Ein Tutorial von MaBuSE · begonnen am 9. Nov 2004 · letzter Beitrag vom 27. Mär 2007
Antwort Antwort
Seite 1 von 5  1 23     Letzte » 
Benutzerbild von MaBuSE
MaBuSE
Registriert seit: 23. Sep 2002
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)
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
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
 
Benutzerbild von sakura
sakura

 
Delphi 10.4 Sydney
 
#2
  Alt 9. Nov 2004, 11:57
Man lese auch hier: http://www.delphipraxis.net/internal...ect.php?t=1157

......

P.S.: Das Problem ist, dass die Leute die fragen einfach nie suchen
Daniel W.
  Mit Zitat antworten Zitat
Benutzerbild von phlux
phlux

 
Delphi 6 Personal
 
#3
  Alt 9. Nov 2004, 12:08
Zitat von sakura:
P.S.: Das Problem ist, dass die Leute die fragen einfach nie suchen
Ich hoffe das war ironisch von dir gemeint, wenn man die Forensuche zu dem Problem nutzt kriegt man zwar genügend Threads, doch in der Mehrzahl davon wird man nur aufgefordert die Forensuche zu nutzen ( ). Als ich einmal vor dem Problem stand habe ich die Lösung in einem Thread gefunden, der vom Topic her garnicht zu dem gepasst hat was ich gesucht hab, deshalb Hut ab vor Herrn Dr.Mabuse, dass endlich mal einer auf die Idee gekommen ist einen handfesten Lösungsweg hier zu schreiben.
Christian "phlux" Arndt
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#4
  Alt 9. Nov 2004, 12:43
Zitat von phlux:
Zitat von sakura:
P.S.: Das Problem ist, dass die Leute die fragen einfach nie suchen
Hut ab vor Herrn Dr.Mabuse, dass endlich mal einer auf die Idee gekommen ist einen handfesten Lösungsweg hier zu schreiben.
Das war nur eine Reaktion auf den Hilferuf eines Suchenden

Schon mal nach DsgnIntf gesucht?
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

 
Delphi 10.4 Sydney
 
#5
  Alt 9. Nov 2004, 12:45
Zitat von MaBuSE:
Schon mal nach DsgnIntf gesucht?[/URL]
Na ja, dann Dann empfehle ich die Suche in den Sparten CodeLib und Tutorials

......
Daniel W.
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

 
Delphi XE6 Enterprise
 
#6
  Alt 9. Nov 2004, 12:46
Zitat von phlux:
Ich hoffe das war ironisch von dir gemeint, wenn man die Forensuche zu dem Problem nutzt kriegt man zwar genügend Threads, doch in der Mehrzahl davon wird man nur aufgefordert die Forensuche zu nutzen ( ).
Und das kommt genau daher, dass ständig gefragt wird, anstatt zu suchen.
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von Qnkel
Qnkel

 
FreePascal / Lazarus
 
#7
  Alt 13. Nov 2004, 20:30
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...
  Mit Zitat antworten Zitat
Robert_G
 
#8
  Alt 14. Nov 2004, 01:27
Zitat von Qnkel:
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...
Eine Delphi 3 DCU wir dnicht mit dem Delphi7 Compiler klarkommen (bzw anderesrum...)
Aber die Unit sollte es sogar bei der Personal geben...
  Mit Zitat antworten Zitat
Benutzerbild von Qnkel
Qnkel

 
FreePascal / Lazarus
 
#9
  Alt 14. Nov 2004, 11:35
Tada. Gibt es sie aber nicht
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#10
  Alt 15. Nov 2004, 14:08
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
  Mit Zitat antworten Zitat
Themen-Optionen Tutorial durchsuchen
Tutorial durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf