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
Tutorial durchsuchen
Ansicht
Themen-Optionen

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 4 von 5   « Erste     234 5      
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" ;-)
 
King555
 
#31
  Alt 6. Feb 2006, 17:07
Das entsprechende Package ist definitv nur ein Entwufszeitpackage, habe eben nachgeschaut. Die "designide.dcp" ist wie schon gesagt eingebunden.

Der Sinn und Zweck von Designpackages war mir schon bewusst.
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#32
  Alt 6. Feb 2006, 17:10
Zitat von King555:
Das entsprechende Package ist definitv nur ein Entwufszeitpackage, habe eben nachgeschaut. Die "designide.dcp" ist wie schon gesagt eingebunden.Der Sinn und Zweck von Designpackages war mir schon bewusst.
Tut mir leid, dann kann ich Dir nicht hefen.
Ich habe hier im Moment keine D2005 PE zur Hand
  Mit Zitat antworten Zitat
MarcRB1975

 
Turbo Delphi für Win32
 
#33
  Alt 17. Aug 2006, 08:28
Hallo MaBuSe,

verfolgst du das Thema noch? Hast Du vielleicht schon 2005PE zu Hand?

Ich hab nämlich auch das Problem mit DesignIntf in Delphi 2005 PE.

Ich versteh das auch nicht, weshalb dieses solche Probleme macht. Zum Beispiel hab ich eine Komponente ich 2005PE installiert, die mit dem DesignIntf problemlos zu recht kommt.
Er unterkringelt zwar DesignIntf im Source aber diese Komponente funktioniert ja auch.
Ich meine, wenn diese Komponente funktioniert, weshalb soll dann meine(unsere) Komponenten nicht reibungslos funktionieren. Es kann doch nicht sein, dass das an dem DesignIntf scheitert. Also... irgendwas machen wir doch da falsch?

Wenn es Dich interessiert, dann könnte ich dir ja mal einen Auszug des Source schicken, bei das installieren der Komponente geklappt hat. Einen Auszug deshalb, weil es sich um 4 "Units" handelt, die ich alle ausgedruckt habe. Insgesamt waren es über 100 DIN A4-Seiten.
Vielleicht erkennst Du ja dann als Profi, wie man das machen muss. Also... ich habe ja versucht das nachzuvollziehen, aber irgendwie klappt das nicht.
Ich muss aber dazu sagen, dass es vom Prinzip her genauso ist, wie du gesagt hast. Man muss die Units auslagern.

Wäre schön, wenn Du dich mal melden würdest.

Danke im Voraus.
Marc
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#34
  Alt 17. Aug 2006, 09:13
Zitat von MarcRB1975:
verfolgst du das Thema noch? Hast Du vielleicht schon 2005PE zu Hand?
Ja ich verfolge das Thema noch.
Ich habe keine 2005 PE installiert. (nur die D2006 Ent )

Ich habe im Moment nur etwas wenig Zeit

Du kannst mir aber Deinen (kompilierfähigen) Source Auszug schicken. Ich schau mal drüber. Das braucht aber etwas Zeit.

Hast Du die *.dpk (Entwurfszeitpackage) im Requires angepasst?
Dort muß die designide eingebunden sein.
  Mit Zitat antworten Zitat
MarcRB1975

 
Turbo Delphi für Win32
 
#35
  Alt 17. Aug 2006, 19:31
Ich glaube, das "leidige Problem mit der DsgnInft..." hat nun ENDLICH ein Ende gefunden.

Also... ich denke besonders als Anfänger hat man es ja nicht leicht.

Mir hat das jetzt aber absolut keine Ruhe gelassen und hab überlegt, und überlegt ...
Ich dachte halt, es kann nicht sein, das das absolut nicht möglich ist.

Ich habe viele Möglichkeiten/Varianten ausprobiert und siehe da.... sogar in Delphi 2005 PE (!!!) klappt das jetzt ENDLICH.

Vorab möchte ich noch schnell sagen, dass man die erstellen Packages in den LIB-Ordner kopieren muss.
Naja.. vielleicht gehts ja auch anders, wenn man irgendwo was ändert, aber so funktionierte es wenigstens.
Alle (!!) Units oder besser gesagt Packages MÜSSEN in der ENTWURFSZEIT erstellt werden.
Ich weiss, das hat MABuSE immer gesagt und so ist es ja auch schliesslich.

Also... das soo richtig zu erklären... mhhh... das fällt mir in der "Fachsprache" ja nicht einfach, weil ich mir das programmieren selbst angeeignet habe.
Damit aber andere nicht soo verzweifeln wie ich und diejenigen, denen die Geduld und die Nerven fehlen, denn man dreht da wirkich am Rad bei diesem Problem, für die werde ich morgen bzw. am Wochenende eine PDF-Datei mit Screenshorts erstellen, in der ich alles beschreiben werde.

Schritt für Schritt, dass sogar Anfänger oder die, die das nicht so schnell kapieren - so wie ich - das verstehen werden.

Wenn es dann jemanden interessiert, kann er sich die Datei runterladen.

Aber ich muss mich erst noch schlau machen, wie ich dann hier die PDF-Datei irgendwie einbinden kann, damit sie anderen zur Verfügung steht.
Marc
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#36
  Alt 18. Aug 2006, 09:08
Zitat von MarcRB1975:
Ich habe viele Möglichkeiten/Varianten ausprobiert und siehe da.... sogar in Delphi 2005 PE (!!!) klappt das jetzt ENDLICH.
Herzlichen Glückwunsch

Zitat von MarcRB1975:
Vorab möchte ich noch schnell sagen, dass man die erstellen Packages in den LIB-Ordner kopieren muss.
Naja.. vielleicht gehts ja auch anders, wenn man irgendwo was ändert, aber so funktionierte es wenigstens.
Alle (!!) Units oder besser gesagt Packages MÜSSEN in der ENTWURFSZEIT erstellt werden.
Ich weiss, das hat MABuSE immer gesagt und so ist es ja auch schliesslich.
Nein, das ist nicht notwendig, ich erklär es nochmal in der nächsten Antwort.

Zitat von MarcRB1975:
..., für die werde ich morgen bzw. am Wochenende eine PDF-Datei mit Screenshorts erstellen, in der ich alles beschreiben werde.
Schritt für Schritt, dass sogar Anfänger oder die, die das nicht so schnell kapieren - so wie ich - das verstehen werden.
Wenn es dann jemanden interessiert, kann er sich die Datei runterladen.
Aber ich muss mich erst noch schlau machen, wie ich dann hier die PDF-Datei irgendwie einbinden kann, damit sie anderen zur Verfügung steht.
Super. Da werden sich sicherlich einige freuen.

Die PDF einfach als Attachment Deinem Beitrag hinzufügen.
(über dem [Absenden] Button im Beitragseditor)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#37
  Alt 18. Aug 2006, 11:00
Hier noch mal ein paar weitere Hinweise zu den Packages und den Units:
  • Der meisten Entwickler binden alle Units in die Anwendung ein und verwenden keine Laufzeitpackages.
    Für diese Entwickler reicht es völlig aus, wenn alle von der Komponente (/n Sammlung) benötigte Units in einem Dessingntimepackage (Entwurfszeit Package) gepackt werden.
    Dieses Package wird dann in Delphi eingebunden und die Komponenten können benutzt werden.

    Es muss beachtet werden, das die Units, die die Komponenten enthalten keine Teile der ToolsAPI (z.B. DsgnIntf) benutzen!!! Sonst bekommt man die Fehlermeldung wegen fehlender ToolsAPI Units beim Kompilieren der Anwendung.
  • Es gibt aber auch Entwickler die sogenannte Runtimepackages (Laufzeit Packages) verwenden.
    Hier müssen 2 Package erstellt werden.
    • Das Runtimepackage, das ausschließlich die Teile der Komponente beinhaltet. Es darf keine Unit enthalten sein die Teile der ToolsAPI (z.B. DsgnIntf) benutzt!!!
    • Das Designtimepackage, das das Runtimepackage einbeindet (requires) und nur die Dinge beinhaltet die die ToolsAPI benutzen. (Komponenten-Editoren, Property-Editoren, ...)
    Falls keine ToolsAPI verwendet wird kann natürlich auch ein kombiniertes Laufzeit- und Entwurfszeit Package erstellt werden.
  • Welche Dateien entstehen beim Kompilieren der Packages. und wozu sind diese gut?
    • *.bpl Dateien: BPL steht für Borland Package Library.
      Das ist eigentlich nur eine umbenannte *.dll Datei, die die eingebundenen Komponenten enthält.
      Diese Dateien sollten im Systempfad stehen. (%PATH%)
    • *.dcp Dateien: DCP steht für Delphi Compiled Package.
      In dieser Datei sind die kompilierten Informationen für den Compiler enthalten, um das Package in die Anwendung einzubinden.
      Diese Dateien sollten im Suchpfad von Delphi stehen.
      (Menü -> Tools -> Umgebungsoptionen... -> Bibliothek -> Bibliothekspfad)
    • *.dcu Dateien: Das sind die einzelnen kompilierten Units (*.pas Dateien).
      In dieser Datei sind die kompilierten Informationen für den Compiler enthalten, um die Unit in die Anwendung einzubinden.
  • Folgende Verzeichnisstruktur hat sich in der Praxis bewährt:
    Code:
    Komponentenname
    +--Source      <- hier ist der Quelltext enthalten
    !                  (z.B. MyComp_D7.dpk, MyComp_D2006.dpk, *.pas, *.res, *.dfm, ...)
    !
    +--Packages    <- hier werden die *.bpl Dateien abgelegt
    !                  (z.B. MyComp_D7.bpl, MyComp_D2006.bpl, ...)
    !
    +--LibD7        <- hier werden die kompilierten Delphi 7 Dateien
    !                  (z.B. MyComp_D7.dcp, *.dcu)
    !                  sowie eine Kopie aller verwendeten Resourcen abgelegt.
    !                  (z.B. *.dfm, *.res, *.dcr)
    !
    +--LibD2006     <- hier werden die kompilierten Delphi 2006 Dateien
    !                  (z.B. MyComp_D2006.dcp, *.dcu)
    !                  sowie eine Kopie aller verwendeten Resourcen abgelegt.
    !                  (z.B. *.dfm, *.res, *.dcr)
    !
    +--Help        <- hier liegt die Hilfe zu den Komponenten
                       (z.B. *.pdf, *.txt, *.hlp, ...)
    In der obigen Verzeichnisstruktur muß dann das Packages Verzeichnis in den Systempfad und das Lib Verzeichnis in den Delphi Suchpfad.
    Wichtig ist nur, das die *.bpl im Systempfad stehen und die *.dcu, *.dfm, ... im Delphi Suchpfad.
Ich hoffe, dass diese weiteren Informationen Euch helfen die Probleme zu meistern.

Viel Spaß
MaBuSE
  Mit Zitat antworten Zitat
MarcRB1975

 
Turbo Delphi für Win32
 
#38
  Alt 19. Aug 2006, 14:49
Hallo Dr. Mabuse ,

ich hab jetzt mein Tutorial fertig. Wie versprochen!

Naja... Tutorial ist vielleicht nicht das richtige Wort. Ich habe halt alle Auszüge in eine PDF-Datei zusammengefasst, wie man vorgehen muss, damit das endlich klappt.

Eins bischen hab ich schon auch was geschrieben.

Was mich persönlich noch interessieren würde ist, wie kann man eigentlich, wenn man eine Komponente entwickelt, auf andere Zugreifen.

Also.. zum Beispiel:
Ich habe 5 Editfelder. In jedem Edit steht als Text etwas drin.

Mit einer erstellten Komponente möchte ich nun eine Listbox erzeugen, in der alle Texte der Edit´s drin stehen. In meiner Komponente, also (OI) möchte ich dann aus dieser erzeugten Listbox einen Text daraus auswählen können.
Aber irgendwie komm ich da nicht drauf.
Muss ich property als String? Edit? Listbox? festlegen? Irgendwie schaff ichs nicht.
Muss die Listbox (Createt) werden? mhhh...
Marc
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#39
  Alt 21. Aug 2006, 09:38
Zitat von MarcRB1975:
Was mich persönlich noch interessieren würde ist, wie kann man eigentlich, wenn man eine Komponente entwickelt, auf andere Zugreifen.
neues Thema -> neuer Thread
auf Komponente aus Komponente zugreifen
  Mit Zitat antworten Zitat
Benutzerbild von mandoki
mandoki

 
Delphi 7 Professional
 
#40
  Alt 10. Okt 2006, 20:31
Hallo,

habe für ein früheres Projekt die D5 Komponente ALSTipDialog verwendet. Leider gelingt es mir nicht, trotz ausführlichen Lesens der Tipps hier und des Tutorial, diese für D7 entsprechend anzupassen (Trennung des Design). Hatte mich leider nie mit der Komponentenentwicklung auseinandergesetzt (was sich nun wohl rächt).

Hier mal der erste Teil der Unit:

Delphi-Quellcode:
unit ALSTDlg;

interface

uses
  {$IFDEF WIN32}Windows,{$ELSE}WinTypes, WinProcs,{$ENDIF}
  Messages, SysUtils, Classes, Graphics, Controls, Forms,
  DesignIntf, DesignEditors, Dialogs, INIFiles{$IFDEF WIN32}, Registry{$ENDIF};

type
  TALSShowPos = (posScreenCenter, posFormCenter);
  TTipLocation = (locEmbeded, {$IFDEF WIN32}locRegistry,{$ENDIF} locINIFile);
  TRegRoot = (CURRENT_USER,LOCAL_MACHINE,CURRENT_CONFIG);

  TTipDialogEditor = class(TDefaultEditor)
  public
    procedure ExecuteVerb(Index : Integer); override;
    function GetVerb(Index : Integer): string; override;
    function GetVerbCount : Integer; override;
    procedure Edit; override;
  end;

  TAbout = class(TPropertyEditor)
  public
    procedure Edit; override;
    function GetAttributes: TPropertyAttributes; override;
    function GetValue: string; override;
  end;

  TFileNameProperty = class (TStringProperty)
  public
      function getattributes: TPropertyattributes; override;
      procedure Edit; override;
  end;


  TALSTipDlg = class(TComponent)
  private
    FAbout : TAbout;
    FDlgCaption : string;
    FTipTitle : string;
    FTips : TStrings;
    FTipTitleFont : TFont;
    FTipFont : TFont;
    FRegRoot : TRegRoot;
    FRegKey : string;
    FINIFile : string;
    FINISection : string;
    FTipsLocation : TTipLocation;
    FPanelColor : TColor;
    FCRLFSubst : string;
    FRandomTips : boolean;
    FShowAtStartup: boolean;
    FPosition : TALSShowPos;
  protected
    {$IFDEF WIN32}
    function ReadFromRegistry : boolean;
    {$ENDIF}
    function ReadFromINIFile : boolean;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure SetTipValues(Value: TStrings);
    procedure SetTitleFont(Value: TFont);
    procedure SetTipFont(Value: TFont);
    function Execute : boolean;
  published
    property About: TAbout read FAbout write FAbout;
    property DlgCaption: string read FDlgCaption write FDlgCaption;
    property TipTitle: string read FTipTitle write FTipTitle;
    property Tips: TStrings read FTips write SetTipValues;
    property TipTitleFont: TFont read FTipTitleFont write SetTitleFont;
    property TipFont: TFont read FTipFont write SetTipFont;
    {$IFDEF WIN32}
    property RegistryRoot: TRegRoot read FRegRoot write FRegRoot default CURRENT_USER;
    property RegistryKey: string read FRegKey write FRegKey;
    {$ENDIF}
    property INIFile: string read FINIFile write FINIFile;
    property INISection: string read FINISection write FINISection;
    property TipsLocation: TTipLocation read FTipsLocation write FTipsLocation default locEmbeded;
    property PanelColor: TColor read FPanelColor write FPanelColor default
                         {$IFDEF VER120}clInfoBk {$ELSE} TColor($00E1FFFF){$ENDIF};
    property CRLFSubstitute : string read FCRLFSubst write FCRLFSubst;
    property RandomTips: boolean read FRandomTips write FRandomTips default False;
    property ShowAtStartup: boolean read FShowAtStartup write FShowAtStartup default True;
    property Position: TALSShowPos read FPosition write FPosition;
  end;

procedure Register;

implementation

uses TipFrm;
{$IFDEF WIN32}
  {$R ALSTDLG.R32}
{$ELSE}
  {$R ALSTDLG.R16}
{$ENDIF}

procedure Register;
begin
  RegisterComponents('Samples', [TALSTipDlg]);
  RegisterComponentEditor(TALSTipDlg, TTipDialogEditor);
  RegisterPropertyEditor(TypeInfo(TAbout), TALSTipDlg, 'ABOUT', TAbout);
  RegisterPropertyEditor(Typeinfo(string), TALSTipDlg, 'INIFile', TFileNameProperty);
end;
Welche Teile müssten den nun in den dsgn teil ausgelagert werden?

Habe 3 andere Free 'Tip of the Day' Komponenten getestet, aber leider waren diese alle nicht so funktionell und flexibel wie die ALSTipDialog.

Hat die vielleicht mal jemand bereits für Delphi 7 angepasst?
Oder kennt jemand eine ähnlich gute Komponente (keine jv,lmd,max)?


Hänge den Sourcecode der ALSTipDialog mal dran..

Gruß mandoki
Angehängte Dateien
Dateityp: zip alstipdialog_127.zip (31,2 KB, 13x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


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 22:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz