AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi DDE ClientItem OnChange DDEClientItemChange

DDE ClientItem OnChange DDEClientItemChange

Ein Thema von Michael Habbe · begonnen am 14. Jan 2007 · letzter Beitrag vom 24. Jan 2007
Antwort Antwort
Benutzerbild von Michael Habbe
Michael Habbe

Registriert seit: 10. Aug 2005
264 Beiträge
 
Turbo Delphi für Win32
 
#1

DDE ClientItem OnChange DDEClientItemChange

  Alt 14. Jan 2007, 22:45
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.076 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: DDE ClientItem OnChange DDEClientItemChange

  Alt 15. Jan 2007, 06:11
Poste doch mal den relevanten Code des VB-Demoprogramms.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Michael Habbe
Michael Habbe

Registriert seit: 10. Aug 2005
264 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: DDE ClientItem OnChange DDEClientItemChange

  Alt 15. Jan 2007, 08:40
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......
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.

mfg
Michael
Angehängte Dateien
Dateityp: rar delphi_208.rar (1,5 KB, 20x aufgerufen)
Dateityp: rar vb_168.rar (1,2 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Michael Habbe
Michael Habbe

Registriert seit: 10. Aug 2005
264 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: DDE ClientItem OnChange DDEClientItemChange

  Alt 15. Jan 2007, 23:25


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.

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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: DDE ClientItem OnChange DDEClientItemChange

  Alt 15. Jan 2007, 23:31
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.
  Mit Zitat antworten Zitat
Benutzerbild von Michael Habbe
Michael Habbe

Registriert seit: 10. Aug 2005
264 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: DDE ClientItem OnChange DDEClientItemChange

  Alt 16. Jan 2007, 00:25
Ne, direkt die APIs habe ich noch nicht verwendet. Hast Du da ein Codeschnipsel, was ich verwenden kann?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: DDE ClientItem OnChange DDEClientItemChange

  Alt 16. Jan 2007, 00:31
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
  Mit Zitat antworten Zitat
Benutzerbild von Michael Habbe
Michael Habbe

Registriert seit: 10. Aug 2005
264 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: DDE ClientItem OnChange DDEClientItemChange

  Alt 16. Jan 2007, 12:16
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.

Irgendwas stimmt hier nicht.

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
  Mit Zitat antworten Zitat
Benutzerbild von Michael Habbe
Michael Habbe

Registriert seit: 10. Aug 2005
264 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: DDE ClientItem OnChange DDEClientItemChange

  Alt 24. Jan 2007, 12:14
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.
Angehängte Dateien
Dateityp: pas errclass_828.pas (4,7 KB, 41x aufgerufen)
Dateityp: pas ddeobjec_958.pas (16,2 KB, 41x aufgerufen)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema 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 17:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf