Lazarus i sferaGT – przekazanie nr dokumentu poprzez zmienną

Odpowiedz Nowy wątek
2017-08-15 20:02

Rejestracja: 13 lat temu

Ostatnio: 1 rok temu

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;
edytowany 2x, ostatnio: furious programming, 2017-08-16 00:29

Pozostało 580 znaków

2017-08-15 20:06

Rejestracja: 9 lat temu

Ostatnio: 1 dzień temu

0

spróbuj zmienić typ zmiennej s na ansistring

edytowany 1x, ostatnio: grzegorz_so, 2017-08-15 20:07

Pozostało 580 znaków

2017-08-15 20:07
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Tuchów

0

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


edytowany 4x, ostatnio: furious programming, 2017-08-15 20:09
nie wiedziałem że w Lazaurusie string jest ansistringiem - grzegorz_so 2017-08-15 20:10
a jaki typ odpowiada stringowi z delphi ? - grzegorz_so 2017-08-15 20:12
Chociaż w Delphi Tokyo typ String – a raczej UnicodeString – to jakaś built-in hybryda do ansi i unikodu. - furious programming 2017-08-15 20:17

Pozostało 580 znaków

2017-08-15 21:46

Rejestracja: 13 lat temu

Ostatnio: 1 rok temu

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

Pozostało 580 znaków

2017-08-15 22:18
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Tuchów

0

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

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


edytowany 2x, ostatnio: furious programming, 2017-08-15 22:34

Pozostało 580 znaków

2017-08-15 23:14

Rejestracja: 13 lat temu

Ostatnio: 1 rok temu

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.

Pozostało 580 znaków

2017-08-15 23:48

Rejestracja: 13 lat temu

Ostatnio: 1 rok temu

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

Pozostało 580 znaków

2017-08-16 00:12
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Tuchów

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

{..}

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

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


Również błąd Niedopasowanie typu - Dice 2017-08-16 08:50
W zasadzie WideString powinien być najbardziej kompatybilny z COM (BSTR). Zagłębiając się dalej w temat BSTR BSTR stores strings with: - 4 bytes length prefix - n bytes Unicode characters - 2 bytes null terminator - Dice 2017-08-16 10:07
Dobrze, a jaki typ ma parametr metody wczytaj? @furious programming pytał, ale nie widzę abyś odpowiedział... - wloochacz 2017-08-16 10:58

Pozostało 580 znaków

2017-08-16 09:10

Rejestracja: 6 lat temu

Ostatnio: 20 godzin temu

0
var
  ID: OleVariant;
(...)
ID := OleVariant('FS 1/MAG/2017');
(...)
Również testowałem i jest błąd Niedopasowanie typu - Dice 2017-08-16 10:53

Pozostało 580 znaków

2017-08-16 16:10
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Tuchów

0

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


Pozostało 580 znaków

2017-08-16 23:34
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Tuchów

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.


edytowany 4x, ostatnio: furious programming, 2017-08-16 23:39
Pokaż pozostałe 8 komentarzy
Nie no, mam na myśli konsolę NES i klepanie gier. - furious programming 2017-08-17 19:50
Dokładnie to – Nintendo Entertainment System. Choć nie samo klepanie gier mnie interesuje. - furious programming 2017-08-17 19:54
moja praca dyplomowa, magisterska, to były assemblerowe programy na Zilog Z80 oraz Motorolę 6502 - grzegorz_so 2017-08-17 19:55
No to mniej więcej wiesz o czym mowa. Fajny ten asm – opcode'ów niedużo, trzy rejestry, floatów brak. Łatwo ogarnąć. :D - furious programming 2017-08-17 20:17

Pozostało 580 znaków

Odpowiedz

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