Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DDE ClientItem OnChange DDEClientItemChange (https://www.delphipraxis.net/84293-dde-clientitem-onchange-ddeclientitemchange.html)

Michael Habbe 14. Jan 2007 22:45


DDE ClientItem OnChange DDEClientItemChange
 
Hi Leute,

auch wenn DDE eigentlich schon totgeschrieben wird/wurde: ich brauchs zur Datenübertragung aus einem Teilekatalog zurück an meine Anwendung.


Ich habe lange gebraucht, um das Visual Basic Demoprogramm zum Laufen zu bringen, aber dieses funktioniert mittlerweile.

Da ich aber hauptsächlich mit Delphi arbeite, wollte ich den Client nun umsetzen. Aber dort ist ein Problem aufgetreten:

Delphi-Quellcode:
procedure Tclientform.Button4Click(Sender: TObject);
begin
  DdeClientConv.CloseLink;
  DdeClientConv.SetLink ('TCD','Parts');
  DDEClientItem.DdeItem := 'PartsSelection';
  DdeClientConv.OpenLink;
end;
Das Öffnen des Kataloges klappt, auch dass "DdeClientItemChange" wird hier noch aufgerufen, d. h. hier werden auch noch Informationen in das Memo geschrieben.

Delphi-Quellcode:
procedure Tclientform.DdeClientItemChange(Sender: TObject);
begin
  inc(count);
  Memo1.Lines.Add(IntToStr(count)+': '+DdeClientItem.Lines.Text);
end;
Wird nun aber versucht, aus dem "DDE-Server" Daten zurückzusenden, gibt es ein TimeOut im Server.
Was ich gefunden habe, ist, das in der Unit "DDEMan" die Eigenschaft "DdeItem" irgendwann auf (leer) gesetzt wird. Somit kann scheinbar auch nicht mehr das Ereignis ausgelöst werden.

HILFE

Ich brauche dringend einen Workaround. Wie der aussieht, ist mir mittlerweile (nach drei Tagen) egal. Meinetwegen auch eine VB.dll die ich aus meinem Programm heraus aufrufe.

Aber bitte: Helft mir......



mfg
Michael

Bernhard Geyer 15. Jan 2007 06:11

Re: DDE ClientItem OnChange DDEClientItemChange
 
Poste doch mal den relevanten Code des VB-Demoprogramms.

Michael Habbe 15. Jan 2007 08:40

Re: DDE ClientItem OnChange DDEClientItemChange
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,

hier der VB-Code, der Linkmode des Formulars ist auf "1 - Quelle" gesetzt. Alleine das rauszufinden (bin kein VB-Experte) hat mich 'nen halben Tag gekostet...... :evil:
Aber dann liefs sofort, was mich erkennen ließ, dass irgendwas in Delphi nicht stimmt.

Code:
Private Sub Command1_Click()
  Text1.LinkMode = 0
  Text1.LinkTopic = "TCD|Parts"
  Text1.LinkItem = "PartsSelection"
  Text1.LinkMode = 2
 
  Text1.LinkExecute ("[KBANR(9101745)][ACTIVATE]")
End Sub
Das LinkExecute wird auch in Delphi ausgeführt, es ist dafür, dass der Katalog ein Fahrzeug raussucht und aktiviert.

Delphi-Quellcode:
procedure Tclientform.Button1Click(Sender: TObject);
begin
  if DdeClientConv.ExecuteMacro ('[KBANR(9101745)][ACTIVATE]', False) then //True);
    Memo1.Lines.Add('ExecuteMacro:Success')
  else
    Memo1.Lines.Add('ExecuteMacro:Failed');
end;
Getestet habe ich mittlerweile auch TurboDelphi, aber auch hier ist das Ergebnis das gleiche. Vielleicht habe ich auch da einen Fehler gemacht, ich weiss es nicht. :gruebel: :?: :gruebel: :?:

mfg
Michael

Michael Habbe 15. Jan 2007 23:25

Re: DDE ClientItem OnChange DDEClientItemChange
 
:wall:

Nach weiteren 12 Stunden erfolglosem Suchen muss ich bald aufgeben. Nirgends auch nur ein besch***ener Hinweis, warum das aus Delphi heraus nicht arbeitet. Sieht so aus, als wäre ich der einzige, der hiermit arbeitet. :gruebel:

Gegoogelt bis zum Wahnsinn ---- nichts.

Delphi 5, 4, 3 und 2 installiert ---- überall das gleiche Ergebnis -> TimeOut.
Delphi 1 ---- ein leichter Hoffnungsschimmer, dort funktioniert die Kommunikation und es kommt kein Timeout (zumindest nicht immer), aber ein Ergebnis kann ich auch hier nicht im Memo feststellen. Sieht so aus, als wenn der Text sofort gelöscht wird (oder gar nicht erst ankommt).


Jetzt sind es mittlerweile drei Tage und wenn das so weitergeht, lande ich wahrscheinlich noch in der Klapse.........

Werde wohl doch eine vb.dll erstellen müssen. *WÜRG*


mfg
Michael

Muetze1 15. Jan 2007 23:31

Re: DDE ClientItem OnChange DDEClientItemChange
 
Mal eine dumme Frage: hast du schonmal probiert die DDE Schnittstelle mit ihren entsprechenden Funktionen von Windows direkt zu nutzen? Ich hatte damals bei einer Lösung diese direkt verwendet und es ging wirklich recht problemlos. Die Komponenten von Delphi waren leider etwas zu "doof" um die damalige Kommunikation zufriedenstellend zu erledigen, weshalb wir es gleich direkt machten und sind im Endeffekt viel besser gefahren dabei.

Michael Habbe 16. Jan 2007 00:25

Re: DDE ClientItem OnChange DDEClientItemChange
 
Ne, direkt die APIs habe ich noch nicht verwendet. Hast Du da ein Codeschnipsel, was ich verwenden kann?

Muetze1 16. Jan 2007 00:31

Re: DDE ClientItem OnChange DDEClientItemChange
 
Zitat:

Zitat von Michael Habbe
Ne, direkt die APIs habe ich noch nicht verwendet. Hast Du da ein Codeschnipsel, was ich verwenden kann?

Nein, leider nicht, da es dem Arbeitgeber gehört. Aber ich frage nur, weil die API soweit einfach ging und es schnell zu implementieren war.

MS DDE

Michael Habbe 16. Jan 2007 12:16

Re: DDE ClientItem OnChange DDEClientItemChange
 
So, habe dann mal bei M$ im MSDN geschaut, es gibt einige Beschreibungen, wie man DDE mit APIs verwendet. Ist mir aber doch ein wenig zu hoch (zumindest für eine schnelle Lösung).

Bin dann aber auf ein paar fertig kompilierte Programme gestoßen. Unter anderem einen StockServer (StockSrv) der per DDE Preise von Brot und Milch an die Clients verteilt. Und hier funktioniert mein Delphiclient plötzlich auch. :gruebel:

Irgendwas stimmt hier nicht. :freak:

Den VB-Client werde ich jetzt auch nochmal überprüfen.
edit: der VB-Client funktioniert auch, jedoch muss man den LinkMode verändern.

Leider funktioniert der StockClient (DDERecon) nicht mit der Hauptanwendung zusammen. Kompilieren kann ich ihn auch nicht mit VC++, die Quellen stammen noch aus Win 3.1 Zeiten, da sind mir zu kryptische Fehlermeldungen.


bis später
Michael

Michael Habbe 24. Jan 2007 12:14

Re: DDE ClientItem OnChange DDEClientItemChange
 
Liste der Anhänge anzeigen (Anzahl: 2)
So, nach über einer Woche rastlosen Suchens bin ich nun fündig geworden.

In den Google-Groups war mehrfach zu lesen, dass ein gewisser Peter Below (TeamB) eine Wrapperunit geschrieben hatte, um den Kommunikation mit der DDEML-Unit hinzubekommen. Nach stundenlangem Suchen und vielen eMails an Leute, deren Adresse nicht mehr existent ist, habe ich dann in diesem Thread die gesuchten Units gefunden: DDE VCL replacements

Da diese Units direkt im Thread gepostet wurden und sie von jedermann verwendet werden können und sie ursprünglich auch mal von Peter an jedermann geschickt wurden, habe ich sie mal angehängt.

Um nun diese Units auch verwenden zu können, hier mal das kurze Beispiel, womit ich die Daten von meinem DDE-Server an den (nun funktionierenden) Client bekomme.

Delphi-Quellcode:
unit Unit1;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, ExtCtrls, DDEObjec, DDEML;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    edtService: TEdit;
    edtTopic: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

function DdeDataChange(CallType, Fmt: UINT; Conv: HConv; hsz1, hsz2: HSZ; Data: HDDEData; Data1, Data2: DWORD): HDDEData; stdcall;

var
  Form1: TForm1;

implementation

{$R *.DFM}

var
  count: Integer = 0;
  dde: TDDEMLClass;

function DdeDataChange(CallType, Fmt: UINT; Conv: HConv; hsz1, hsz2: HSZ; Data: HDDEData; Data1, Data2: DWORD): HDDEData;
var
  str:String;
begin
  inc(count);
  dde.GetDataAsStrObj(data, str);
  Form1.Memo1.Lines.Add(IntToStr(count)+': '+str);
  //result := data; eine Result darf ich nicht zurückgen, der DDE-Server meldet sonst einen Timeout?!? 
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  dde := TDDEMLClass.Create(DDEDataChange, 0);
  dde.Connect(PAnsiChar(edtService.Text), PAnsiChar(edtTopic.Text));
  dde.Execute(PAnsiChar(edtMacro.Text));
end;

end.
Naja, nun scheint es zu funktionieren. Mal schauen, was noch so an Probleme auf mich einstürzen.

Wäre jedenfalls Klasse, wenn jemand, der diese Units verwendet, einen kleine Quellcodeschnipsel postet, was er/sie damit anstellt.


mfg
Michael

... der nun darangeht, die eigentlichen Daten auszuwerten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 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