dans un but d'apprentissage je converti tous les exemples de formation, web formations de VB en Delphi. Je bute sur un problème dans l'exemple Annuaire installé avec les objets métiers (V3), pour remplir les ComboBox des devises. Le code VB se trouve dans la fonction InitSaisieBanque() du fichier FrmDetail.vb :
- Code: Tout sélectionner
For Each CDevise As IBPDevise2 In Me.BaseCpta.FactoryDevise.List
Me.cmbBqDevise.Items.Add(New CBODevise(CDevise))
Next
que j'ai converti en Delphi pour l'instant en
- Code: Tout sélectionner
var CBODevise : TCBODevise;
with FBaseCpta.FactoryDevise.List do
begin
for I := 1 to Count do
CBODevise := TCBODevise.Create(Item[I] as IBPDevise2);
try
cbBqDevise.Items.AddObject(CBODevise.ToString, CBODevise);
finally
TCBODevise.Free;
end;
end;
end;
en VB.net que je ne connais pas, apparemment en stockant directement un objet dans le ComboBox, il renvoie la représentation de la fonction ToString si elle existe. En delphi l'objet est "attaché" à chaque item du combobox en plus de la chaine affichée.
Pour info Sage est passé par un objet CBODevise qui ne fait pas partie des objet métiers, défini dans Mod_Adapter.vb :
- Code: Tout sélectionner
Public Class ControlObjet100
Private mPersistObject As IBIPersistObject
Public Sub New(ByVal obj As IBIPersistObject)
mPersistObject = obj
End Sub
Public Overridable Function GetObject() As IBIPersistObject
Return mPersistObject
End Function
Public Overrides Function ToString() As String
Return ""
End Function
End Class
Public Class CBODevise
Inherits ControlObjet100
Public Sub New(ByVal obj As IBIPersistObject)
MyBase.New(obj)
End Sub
Public Overrides Function ToString() As String
Return GetInterface().D_Intitule
End Function
Public Function GetInterface() As IBPDevise2
Return GetObject()
End Function
End Class
que j'ai converti en Delphi par :
- Code: Tout sélectionner
{ TControlObjet100 }
constructor TControlObjet100.Create(AObj: IBIPersistObject);
begin
FPersistObject := AObj;
end;
function TControlObjet100.GetObject: IBIPersistObject;
begin
Result := FPersistObject;
end;
function TControlObjet100.ToString: String;
begin
result := '';
end;
{ TCBODevise }
function TCBODevise.ToString: String;
begin
Result := GetInterface.D_Intitule;
end;
function TCBODevise.GetInterface: IBPDevise2;
begin
Result := GetObject() as IBPDevise2;
end;
Le problème : Sous delphi, dans la boucle de récupération des devises, CBODevise.ToString renvoie à chaque fois une chaine vide. Ce que je ne comprend pas, c'est que dans FrmFetail.vb/IniTxtContact(), on a exactement la même chose pour récupérer la liste des services des contacts :
- Code: Tout sélectionner
For Each mCBPService As IBPServiceContact In BaseCpta.FactoryServiceContact.List
Me.cbCtcService.Items.Add(New CBPService(mCBPService))
En Delphi :
- Code: Tout sélectionner
var CBPService : TCBPService;
with FBaseCpta.FactoryServiceContact.List do
begin
for i := 1 to Count do
begin
CBPService := TCBPService.Create(Item[I] as IBPServiceContact);
try
cbCtcService.Items.AddObject(CBPService.ToString, CBPService);
finally
CBPService.Free;
end;
end;
end;
L'objet CBPService est construit de la même manière que CBODevise :
- Code: Tout sélectionner
function TCBPService.ToString: String;
begin
Result := GetInterface.S_Intitule;
end;
function TCBPService.GetInterface: IBPServiceContact;
begin
Result := GetObject() as IBPServiceContact;
end;
et je récupère parfaitement la liste des services.

