![]() |
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:
Das Öffnen des Kataloges klappt, auch dass "DdeClientItemChange" wird hier noch aufgerufen, d. h. hier werden auch noch Informationen in das Memo geschrieben.
procedure Tclientform.Button4Click(Sender: TObject);
begin DdeClientConv.CloseLink; DdeClientConv.SetLink ('TCD','Parts'); DDEClientItem.DdeItem := 'PartsSelection'; DdeClientConv.OpenLink; end;
Delphi-Quellcode:
Wird nun aber versucht, aus dem "DDE-Server" Daten zurückzusenden, gibt es ein TimeOut im Server.
procedure Tclientform.DdeClientItemChange(Sender: TObject);
begin inc(count); Memo1.Lines.Add(IntToStr(count)+': '+DdeClientItem.Lines.Text); end; 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 |
Re: DDE ClientItem OnChange DDEClientItemChange
Poste doch mal den relevanten Code des VB-Demoprogramms.
|
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:
Das LinkExecute wird auch in Delphi ausgeführt, es ist dafür, dass der Katalog ein Fahrzeug raussucht und aktiviert.
Private Sub Command1_Click()
Text1.LinkMode = 0 Text1.LinkTopic = "TCD|Parts" Text1.LinkItem = "PartsSelection" Text1.LinkMode = 2 Text1.LinkExecute ("[KBANR(9101745)][ACTIVATE]") End Sub
Delphi-Quellcode:
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: :?:
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; mfg Michael |
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 |
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.
|
Re: DDE ClientItem OnChange DDEClientItemChange
Ne, direkt die APIs habe ich noch nicht verwendet. Hast Du da ein Codeschnipsel, was ich verwenden kann?
|
Re: DDE ClientItem OnChange DDEClientItemChange
Zitat:
![]() |
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 |
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: ![]() 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:
Naja, nun scheint es zu funktionieren. Mal schauen, was noch so an Probleme auf mich einstürzen.
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. 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 00:04 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