Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Komponentennamen mit Leerzeichen möglich ??? (https://www.delphipraxis.net/142333-komponentennamen-mit-leerzeichen-moeglich.html)

Stefanie 26. Okt 2009 13:31


Komponentennamen mit Leerzeichen möglich ???
 
Hallo,
ich möchte einen DDE-Server(Sender) programmieren und der Name für das DdeServerItem(ist ja eine eigene Komponente) soll mit einem Leerzeichen versehen werden z.B. "ABC 10".
Leider wird das in Delphi nicht aktzeptiert. Ich möchte damit an eine Fremdanwendung Daten übermitteln, die leider nur funktioniert, wenn das Item eben dieses Leerzeichen enthält.
Gibt es evtl. doch eine Möglichkeit den Namen des DDE-Item mit Leerzeichen festzulegen ?

Uwe Raabe 26. Okt 2009 13:40

Re: Komponentennamen mit Leerzeichen möglich ???
 
Für jede Komponente, die man in Delphi auf ein Form oder Datenmodul gesetzt werden, wird automatisch ein Feld mit gleichem Namen angelegt. Daher müssen die Komponentennamen den Anforderungen an einen normalen Identifier genügen. Da diese keine Leerzeichen enthalten dürfen, kann auch der Komponentenname keine Leerzeichen enthalten.

Wenn DDE-Items überhaupt Leerzeichen enthalten dürfen :gruebel: , dann geht nur der Weg ohne Delphi-Komponente.

hoika 26. Okt 2009 13:48

Re: Komponentennamen mit Leerzeichen möglich ???
 
Hallo,

Zitat:

Ich möchte damit an eine Fremdanwendung Daten übermitteln, die leider nur funktioniert, wenn das Item eben dieses Leerzeichen enthält.
Sicher ?

Was hat denn der Name der Delphi-Komponente mit der DDE-Kommunikation zu tun ?
Hast du dir die anderen Properties schon in der Hilfe angesehen ?

Was sagt denn DDESpy dazu ?


Heiko

Stefanie 26. Okt 2009 14:59

Re: Komponentennamen mit Leerzeichen möglich ???
 
So sieht der Code aus

Delphi-Quellcode:
var
  MainForm: TMainForm;
  MyDDEServerConv: TDDEServerConv;
  MyDDEServerItem : TDDEServerItem;

implementation

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
begin
  MyDDEServerConv := TDDEServerConv.Create(nil);
  MyDDEServerItem := TDDEServerItem.Create(MyDdeServerConv);
  MyDDEServerItem.ServerConv := MyDdeServerConv;
end;

procedure TMainForm.btn_startClick(Sender: TObject);
begin
  MyDDEServerItem.Text := 'Hallo';
end;
Wenn ich nun Excel als einfachen DDE-Empfänger nutze muß ich ja wie folgt eingeben "=DATA|MyDdeServerConv!MyDDEServerItem" wobei DATA der Name meines DDE-Senders(data.exe) ist. Meine Fremdanwendung möchte nun aber "=DATA|MyDdeServerConv!MyDDEServerItem 10" haben. Wie soll man das programmieren ? "var MyDDEServerItem 10 : TDDEServerItem;" geht ja nicht.

Uwe Raabe 26. Okt 2009 15:58

Re: Komponentennamen mit Leerzeichen möglich ???
 
In diesem Fall wirst du die Delphi-DDE-Komponenten leider nicht verwenden können!

Welche Delphi-Version setzt du denn ein?

hoika 26. Okt 2009 16:02

Re: Komponentennamen mit Leerzeichen möglich ???
 
Hallo,

aus der Hilfe


Zitat:

Die Eigenschaft Name der DDE-Server-Konversation bezeichnet das Thema, das von DDE-Clients für das Einrichten der Verbindung zur DDE-Server-Konversation verwendet wird.
Du hast also Recht.

also
Zitat:

DDE-Server-Elemente, die keiner DDE-Server-Konversation zugeordnet sind, ermitteln den Themennamen aus der Eigenschaft Caption des Formulars.

Ich glaube, dass das DDE-Topic gar keine Leerzeichen haben darf.


Heiko

Bernhard Geyer 26. Okt 2009 16:03

Re: Komponentennamen mit Leerzeichen möglich ???
 
Zitat:

Zitat von Uwe Raabe
In diesem Fall wirst du die Delphi-DDE-Komponenten leider nicht verwenden können!

Wenn der Sourcecode vorhanden ist wäre ein kopie der Sourcen DDEMan möglich um die direkte verwendung des Namens (if (Ctrl.Name = ItemName) and ..) durch eine property "DDEName" zu ersetzen.

Uwe Raabe 26. Okt 2009 16:08

Re: Komponentennamen mit Leerzeichen möglich ???
 
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von Uwe Raabe
In diesem Fall wirst du die Delphi-DDE-Komponenten leider nicht verwenden können!

Wenn der Sourcecode vorhanden ist wäre ein kopie der Sourcen DDEMan möglich um die direkte verwendung des Namens (if (Ctrl.Name = ItemName) and ..) durch eine property "DDEName" zu ersetzen.

Der Sourcecode steht in Ddeman.pas und es erscheint mir doch recht aufwendig, das Ganze umzustricken. Ist nicht gerade ein Paradebeispiel für transparenten Code.

Stefanie 26. Okt 2009 16:36

Re: Komponentennamen mit Leerzeichen möglich ???
 
Zitat:

Welche Delphi-Version setzt du denn ein?
momentan RAD Studio 2007 - das Problem ist aber unter Delphi 7 identisch

Zitat:

Ich glaube, dass das DDE-Topic gar keine Leerzeichen haben darf.
Das ist gut möglich, aber so ist's nun mal. Da hält sich scheibar nicht jeder dran.

Zitat:

Wenn der Sourcecode vorhanden ist wäre ein kopie der Sourcen DDEMan möglich um die direkte verwendung des Namens (if (Ctrl.Name = ItemName) and ..) durch eine property "DDEName" zu ersetzen.
Das wäre durchaus möglich, hab sowas aber noch nie gemacht. Eine Kopie in meinem Projektordner kann ich ja problemlos modifizieren.
Wo und wie müßte man denn da ansetzen?
Hier die Deklaration des TDdeServerItem aus der ddeman.pas

Delphi-Quellcode:
{ TDdeServerItem }

  TDdeServerItem = class(TComponent)
  private
    FLines: TStrings;
    FServerConv: TDdeServerConv;
    FOnChange: TNotifyEvent;
    FOnPokeData: TNotifyEvent;
    FFmt: Integer;
    procedure ValueChanged;
  protected
    function GetText: string;
    procedure SetText(const Item: string);
    procedure SetLines(Value: TStrings);
    procedure SetServerConv(SConv: TDdeServerConv);
    procedure Notification(AComponent: TComponent;
      Operation: TOperation); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function PokeData(Data: HDdeData): LongInt;
    procedure CopyToClipboard;
    procedure Change; dynamic;
    property Fmt: Integer read FFmt;
  published
    property ServerConv: TDdeServerConv read FServerConv write SetServerConv;
    property Text: string read GetText write SetText;
    property Lines: TStrings read FLines write SetLines;
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
    property OnPokeData: TNotifyEvent read FOnPokeData write FOnPokeData;
  end;


implementation

uses SysUtils, Dialogs, Consts, Clipbrd;

type
  EDdeError = class(Exception);
  TDdeSrvrConv = class;

{ TDdeSrvrItem }

  TDdeSrvrItem = class(TComponent)
  private
    FConv: TDdeSrvrConv;
    FItem: string;
    FHszItem: HSZ;
    FSrvr: TDdeServerItem;
  protected
    procedure SetItem(const Value: string);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    function RequestData(Fmt: Word): HDdeData;
    procedure PostDataChange;
    property Conv: TDdeSrvrConv read FConv write FConv;
    property Item: string read FItem write SetItem;
    property Srvr: TDdeServerItem read FSrvr write FSrvr;
    property HszItem: HSZ read FHszItem;
  end;

Bernhard Geyer 26. Okt 2009 17:03

Re: Komponentennamen mit Leerzeichen möglich ???
 
Zitat:

Zitat von Uwe Raabe
Der Sourcecode steht in Ddeman.pas und es erscheint mir doch recht aufwendig, das Ganze umzustricken. Ist nicht gerade ein Paradebeispiel für transparenten Code.

Es gibt eine Stelle bei der der Item.Name Abgefragt wird (Insgesamt 5 stellen wo auch andere Name-Properties abgefrag werden).

Zitat:

Zitat von Stefanie
Wo und wie müßte man denn da ansetzen?
Hier die Deklaration des TDdeServerItem aus der ddeman.pas

1, Kopiere ddeman.pas unter neuen Namen
2, Andere alle dort definierten Klassen
3, Definiere ein neues DDEItemName-Property vom Typ String
4, Suche nach ".Name = ..." wo das Name-Property von TDdeServerItem abgefragt wird
5, Ersetze es durch dein DDEItemName-Property
6, Sorge im Konstruktor/Setter des DDEItemName-Property dafür das niemals ungültiger/leerer Wert vorkommt.
7, Suche nach der Unit welche für die IDE-Editoren + Registrierung zuständig ist und führe 1+2 durch
8, Stell dein eigenes Package zusammen und nimm die Units dort auf
9, Registriere das Package in der IDE.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 Uhr.
Seite 1 von 2  1 2      

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