Nous avons obtenu le travail OPC. Je ne peux pas installer RsLinx sur mon Win7 (et le mode XP aussi) à cause d'erreurs, donc j'envoie mon application de test à l'endroit réel, et quelqu'un le testant.Delphi - Problème de passage de variant OLE (RsLinx OPC, Ajout de groupe fonctionnant uniquement avec des constantes)
Parce que je n'ai pas de DLL, je ne peux pas faire d'interface Delphi, donc j'ai besoin de faire des appels OLE seulement.
J'ai eu un problème intéressant avec Group Add.
Je le démontrer:
procedure TForm1.Button8Click(Sender: TObject);
var
r, g : variant;
s : string;
v : variant;
ws : WideString;
begin
Log('Connect');
r := CreateOleObject('RSI.OPCAutomation');
r.Connect('RSLinx OPC Server');
Log('Add as constant');
g := r.OPCGroups.Add('MONKEY_C');
Log('Name ' + g.Name);
Log('Add as string');
s := 'MONKEY_S';
g := r.OPCGroups.Add(s);
Log('Name ' + g.Name);
Log('Add as variant');
s := 'MONKEY_V';
v := s;
g := r.OPCGroups.Add(v);
Log('Name ' + g.Name);
Log('Add as ole variant');
s := 'MONKEY_OV';
v := VarAsType(s, varOleStr);
g := r.OPCGroups.Add(v);
Log('Name ' + g.Name);
Log('Add as widestring');
s := 'MONKEY_WS';
ws := WideString(s);
g := r.OPCGroups.Add(ws);
Log('Name ' + g.Name);
Log('Add as widestring var');
s := 'MONKEY_WSV';
ws := WideString(s);
v := ws;
g := r.OPCGroups.Add(v);
Log('Name ' + g.Name);
r := 0;
end;
Le résultat a été:
Connect
Add as constant
Name MONKEY_C
Add as string
Name _Group0
Add as variant
Name _Group1
Add as ole variant
Name _Group2
Add as widestring
Name _Group3
Add as widestring var
Name _Group4
Le problème que je ne peux pas ajouter tout groupe que constant défini ...
J'ai besoin de savoir comment Delphi compile cette constante pour que je puisse convertir ma valeur de variant à ce format.
Quelqu'un peut-il m'aider dans ce thème?
Merci: dd
Salut!
Donc le problème est mystérieux. J'ai trouvé une autre erreur dans les appels OLE purs.
function TDDRsOPCObject.IndexOfGroup(GroupName: string): integer;
var
ogs, g : variant;
i : integer;
s : string;
begin
CheckObject;
Result := -1;
ogs := FObj.OPCGroups;
s := '';
for i := 1 to ogs.Count do begin
g := ogs.Item(i); // This is working
if AnsiCompareText(g.Name, GroupName) = 0 then begin
Result := i;
Exit;
end;
end;
end;
function TDDRsOPCObject.GetGroupByName(GroupName: string): variant;
var
idx : integer;
ogs, g : variant;
begin
CheckObject;
VarClear(Result);
idx := IndexOfGroup(GroupName);
ogs := FObj.OPCGroups;
if idx <> -1
then begin
g := ogs.Item(idx); // HERE I GOT: The parameter is incorrect
Result := g;
end;
end;
Il est donc intéressant: le IndexOfGroup avec un même appel fonctionne, le GetGroupByName n'est pas ... :-(
Je déterminé que je ne continue pas mon combat avec des moulins à vent (Don Q). Je obtenu TLB d'un cher utilisateur qui ont Delphi7 (en Win7 le Delphi6 ne peut pas produire l'interface OLE), et je trouve Kassl
que ces interfaces peut me aider ...
Merci:. dd
bien n'est pas les groupes constants un moyen de diviser la logique? Je veux dire pouvez-vous ajouter à chaque groupe constant plus de groupes? – ComputerSaysNo
Intéressant. Si je fais ceci: g: = r.OPCGroups.Add (PChar (s) ^); Alors 'M' est passé. – durumdara
Puissions-nous avoir des groupes constants mais je veux comprendre cet enfer OLE ... :-) – durumdara