Lazarus i sferaGT – przekazanie nr dokumentu poprzez zmienną

0

Witam,
Korzystam z Lazarusa i bibliotek sferyGT.
Mam problem z wczytaniem dokumentu w przypadku gdy nr dokumentu przekazuję jako zmienną typu string.

procedure TForm.Subiekt;
var
oFs,oSubGT,oGT: OLEVariant; 
s:string;
begin
...
// kod uruchomienia sfery
...
s:='FS 1/MAG/2017';
oFs:=oSubGT.Dokumenty.Wczytaj(s);
oFs.wyswietl;
end;

otrzymuję błąd
Project raised exception class 'External: ?'.
Przetestowałem ten sam kod w Delphi
Project raised exception class EOleException with message 'Niedopasowanie typu'.

Natomiast jeżeli przekażę nr dokumentu bezpośrednio, dokument otwiera się prawidłowo.

procedure TForm.Subiekt;
var
oFs,oSubGT,oGT: OLEVariant; 
begin
...
// kod uruchomienia sfery
...
oFs:=oSubGT.Dokumenty.Wczytaj('FS 1/MAG/2017');
oFs.wyswietl;
end;
0

spróbuj zmienić typ zmiennej s na ansistring

0

W Lazarusie typ String domyślnie jest AnsiStringiem i znaki z zakresu ASCII zawsze są jednobajtowe.

0

Sprawdzałem już wcześniej AnsiString i WideString ale bez rezultatu, ten sam błąd.
W dokumentacji Sfery widziałem przykład dla VB gdzie nr dokumentu przekazywany był za pomocą InputBox'a.
Wyglądało to mniej więcej tak:

Dim Nr As String
Nr = InputBox("Podaj nr dokumentu", "Dokument")
Set oDok = oSgt.Dokumenty.Wczytaj(Nr)
oDok.wyswietl

Deklarowana była zmienna typu String czyli w zasadzie powinno wszystko działać analogicznie w Delphi i Lazarus'ie

0

@Dice: jakiego typu argument przyjmuje metoda oSubGT.Dokumenty.Wczytaj?

PS: W Visual Basicu typ String przechowuje znaki kodowane w UTF-16.

0

Metoda Wczytaj
Metoda wczytuje dokumenty do kolekcji.
**Składnia **
wyrazenie.Wczytaj(id)
wyrazenie Wymagane wyrażenie, które zwraca obiekt SuDokumenty
Parametry
id
Variant. Jeśli argument jest typu Long, dokument jest wybierany po identyfikatorze (dok_id z tabeli dok__Dokument). Jeśli argument jest typu String, wówczas dokument jest wybierany po pełnym numerze dokumentu.
**Wartość zwracana **
Obiekt typu SuDokument.

0

Problem częściowo rozwiązany
zmienną s zadeklarowałem jako variant
po przypisaniu do niej wartości typu string s:='FS 1/MAG/2017' program nadal wyrzuca ten sam błąd
ale
po przypisaniu do niej wartości liczbowej s:=1 czyli identyfikatora nr dokumentu z tabeli dok__dokument wszystko pięknie się wczytuje.
Dzięki bardzo za naprowadzenie @furious programming

0
var
  ID: WideString = 'FS 1/MAG/2017';

{..}

  oFs := oSubGT.Dokumenty.Wczytaj(ID);

Próbowałeś w ten sposób?

0
var
  ID: OleVariant;
(...)
ID := OleVariant('FS 1/MAG/2017');
(...)
0

@Dice: podobny problem znajduje się tutaj, zobacz na tę odpowiedź – zmienna WideString rozwiązała problem.

2

Trochę pogrzebałem w modułach systemowych i znalazłem funkcję StringToOleStr – spróbuj jej użyć w taki sposób:

var
  ID: OleVariant;
begin
  ID := StringToOleStr('FS 1/MAG/2017');

Funkcja ta zwraca PWideChar, co powinno pasować do systemowego BSTR.

Różnica jest też taka, że funkcja ta korzysta z TUnicodeStringManager, a bezpośrednie przypisanie literału do zmiennej wariantowej jest równoznaczne z wywołaniem metody z rekordu TVariantManager. Być może menedżery te korzystają z różnych mechanizmów konwersji.

Jak zatrybi to będzie można spróbować bez zmiennej pomocniczej. O ile zatrybi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1