![]() |
AW: Google Maps über COM (Component Object Model)
Hallo,
schon mal danke für die schnelle Antwort. Wie gesagt, der Fehler lautet "Unbekannter Name" beim Aufruf der Funktion SetProp in der unit BrowserTools Zeile 665. OS: Windows XP Pro SP 3 Browser: IE 8.0.6001.18702 Die kompilierte Exe zum Thema OpenMap konnte ich starten. Schönen Gruß, Benjamin |
AW: Google Maps über COM (Component Object Model)
Liste der Anhänge anzeigen (Anzahl: 1)
Ok. Dann sollte es auch nicht am Browser-ActiveX - sprich: der IE-Version - liegen.
Könntest Du bitte mal mit Hilfe des Debuggers feststellen, bei welchem (Google Maps) Objekt und bei welcher Eigenschaft die Fehlermeldung auftritt? Am besten bei einer einfachen Demo, wie Simple Demo. Da könnte der Fehler auftreten beim Anlegen des Objektes TScript (eher unwahrscheinlich), beim Anlegen des Objektes TMapOptions (auch unwahrscheinlich), beim Hinzufügen der Eigenschaften Zoom (ist meine Vermutung), der Erzeugung des Objektes TLatLng, der Hinzufügung des TLatLng-Objektes zum Options-Objekt, der Hinzufügung der Eigenschaft MapTypeID oder der Erzeugung der Karte selbst (Google.Maps.Map(...)). P.S.: Ich habe einmal die compilierte Version von Simple Map angehangen. Funktioniert die bei Dir oder gibt es damit auch eine Fehlermeldung? P.S.: Ach, ich sehe gerade: In ![]() |
AW: Google Maps über COM (Component Object Model)
Hallo,
die Demo-Exe funktioniert. Der Fehler tritt beim SimpleDemo bei dem Attribut Zoom auf. Gruß, Benjamin |
AW: Google Maps über COM (Component Object Model)
Aha - also liegt's doch an Deinem Delphi 6. Da müssen offensichtlich noch ein paar Compilerschalter angepaßt werden.
Ich stelle mal eine Checkliste zusammen. Teste mal bitte mit dem Debugger den folgenden Ablauf:
Delphi-Quellcode:
Ich habe noch eine Idee:
->Unit1: Zoom:=13;
->gmMap: procedure TMapOptions.SetZoom(Value: Integer); begin SetProp(MapOptionsProp_Zoom{'zoom'},Value{13},true); //siehe nächste Methode end; ->DispObject procedure TDispObject.SetProp(const Name: String; const Value: OleVariant; CreateIfNotExists: Boolean = false); begin if CreateIfNotExists and not PropertyExists(Name) //PropertyExists('zoom') liefert false then AddProp(Name); //siehe nächste Funktion BrowserTools.SetProp(FDisp,Name{'zoom'},Value{13},{false}true); end; ->DispObject function TDispObject.AddProp(const Name: String): Boolean; var DispatchEx: IDispatchEx; PName: PWideChar; DispID: Integer; begin Result:=false; if Supports(FDisp,IDispatchEx,DispatchEx) then //->muß true liefern begin PName:=SysAllocString(PWideChar(WideString(Name))); //PName muß 'zoom' als WideString enthalten try if Succeeded(DispatchEx.GetDispID(PName,fdexNameCaseSensitive or fdexNameEnsure,DispID)) then //<- tritt hier der Fehler auf? begin //DispID sollte einen kleinen Integerwert enthalten (z.B. 1) SetProp(DispID,varEmpty); Result:=true; end; finally SysFreeString(PName); end; end; end; Delphi 6 enthält doch in der Unit ActiveX die Deklaration von IDispatchEx!? Wie ist das dort definiert? Wie sind die Konstanten fdexNamexxx definiert? Ich vermute dort einen Bug (evtl. WideString). In Delphi 5 ist das nämlich noch nicht enthalten. Deshalb habe ich die Definition in die Unit BrowserTools integriert - allerdings per Compilerschalter nur bis Delphi 5. Ab Delphi 6 wird die Deklaration aus der Unit ActiveX verwendet. Mit Delphi 7 funktioniert das - nur Du hast mit Delphi 6 Probleme. Also könnte die Ursache in einer fehlerhaften Implementation des Interfaces unter Delphi 6 liegen. Versuche mal bitte, die Compilerschalter {$IFNDEF DELPHI6_UP} in der Unit BrowserTools in {$IFNDEF DELPHI7_UP} zu ändern und poste mal die Deklaration von IDispatchEx aus der Unit ActiveX von Delphi 6. |
AW: Google Maps über COM (Component Object Model)
Hallo Thomas,
nun funktioniert es. habe wie von dir beschrieben die BrowserTools.pas angepasst und nun kann ich die Demos auch mit D6 kompilieren. Vielen Dank für die Hilfe und noch ein riesen Lob für die Umsetzung. Gruß,Benjamin |
AW: Google Maps über COM (Component Object Model)
Hallo Benjamin,
vielen Dank für das Lob! :-D Schön, daß das Framework jetzt auch unter Delphi 6 funktioniert. Ich werde die Compilerschalter in der nächsten Version entsprechend anpassen. Da mich die Ursache für den Fehler aber trotzdem interessiert, würde ich Dich - oder jemanden, der auch Delphi 6 besitzt - darum bitten, mir die Deklaration von IDispatchEx aus der Unit ActiveX zukommen zu lassen (hier, per PM oder Email). Ich habe Delphi 6 übersprungen und kann das leider nicht selbst überprüfen. Danke! :love: |
AW: Google Maps über COM (Component Object Model)
Das hier?
Delphi-Quellcode:
type
{$EXTERNALSYM IDispatchEx} IDispatchEx = interface(IDispatch) ['{A6EF9860-C720-11D0-9337-00AC090DCAA9}'] function GetDispID(const bstrName: TBSTR; const grfdex: DWORD; out id: TDispID): HResult; stdcall; function InvokeEx(const id: TDispID; const lcid: LCID; const wflags: WORD; const pdp: PDispParams; out varRes: OleVariant; out pei: TExcepInfo; const pspCaller: PServiceProvider): HResult; stdcall; function DeleteMemberByName(const bstr: TBSTR; const grfdex: DWORD): HResult; stdcall; function DeleteMemberByDispID(const id: TDispID): HResult; stdcall; function GetMemberProperties(const id: TDispID; const grfdexFetch: DWORD; out grfdex: DWORD): HResult; stdcall; function GetMemberName(const id: TDispID; out bstrName: TBSTR): HResult; stdcall; function GetNextDispID(const grfdex: DWORD; const id: TDispID; out nid: TDispID): HResult; stdcall; function GetNameSpaceParent(out unk: IUnknown): HResult; stdcall; end; |
AW: Google Maps über COM (Component Object Model)
Hallo Jumpy,
genau das! Vielen Dank! Allerdings konnte ich hier keinen Fehler entdecken. Gut für Borland & Co., schlecht für meine Fehlersuche... :stupid: Lauten die Konstanten
Delphi-Quellcode:
?
fdexNameCaseSensitive = $1;
fdexNameEnsure = $2; fdexNameImplicit = $4; fdexNameCaseInsensitive = $8; Ist der Typ TBSTR
Delphi-Quellcode:
?
TBStr = POleStr;
POleStr = PWideChar; |
AW: Google Maps über COM (Component Object Model)
Zitat:
Delphi-Quellcode:
const
{ Input flags for GetDispID } {$EXTERNALSYM fdexNameCaseSensitive} fdexNameCaseSensitive = $1; {$EXTERNALSYM fdexNameEnsure} fdexNameEnsure = $2; {$EXTERNALSYM fdexNameImplicit} fdexNameImplicit = $4; {$EXTERNALSYM fdexNameCaseInsensitive} fdexNameCaseInsensitive = $8; Zitat:
Delphi-Quellcode:
{ Automation types }
PBStr = ^TBStr; TBStr = POleStr;
Delphi-Quellcode:
{ OLE character and string types }
TOleChar = WideChar; POleStr = PWideChar; PPOleStr = ^POleStr; POleStrList = ^TOleStrList; TOleStrList = array[0..65535] of POleStr; |
AW: Google Maps über COM (Component Object Model)
Vielen Dank!
Da bin ich an dieser Stelle erst einmal ratlos und muß mir bei Gelegeneheit mal eine Delphi 6 - Version besorgen, um das Problem im Debugger nachvollziehen zu können. :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz