Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   VCL Programm in fmx konvertieen (https://www.delphipraxis.net/180715-vcl-programm-fmx-konvertieen.html)

champagner 11. Jun 2014 16:05

VCL Programm in fmx konvertieen
 
Hallo,

ich habe einen Code zusammengebastelt, der als VCL-Anwendung ganz normal funktioniert. Es wird ein Webbrowser geöffnet und Google maps angezeigt:

Code:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, StdCtrls, ExtCtrls, XPMan, ComCtrls,MSHTML;

type
  TForm2 = class(TForm)
    WebBrowser1: TWebBrowser;
    LabelAddress: TLabel;
    PanelHeader: TPanel;
    ButtonGotoLocation: TButton;
    MemoAddress: TMemo;
    ButtonGotoAddress: TButton;
    LabelLatitude: TLabel;
    LabelLongitude: TLabel;
    Longitude: TEdit;
    Latitude: TEdit;
    CheckBoxTraffic: TCheckBox;
    CheckBoxBicycling: TCheckBox;
    CheckBoxStreeView: TCheckBox;
    ButtonClearMarkers: TButton;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure ButtonGotoAddressClick(Sender: TObject);
    procedure ButtonGotoLocationClick(Sender: TObject);
    procedure CheckBoxTrafficClick(Sender: TObject);
    procedure CheckBoxBicyclingClick(Sender: TObject);
    procedure CheckBoxStreeViewClick(Sender: TObject);
    procedure ButtonClearMarkersClick(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure CheckBox2Click(Sender: TObject);
  private
    { Private declarations }
    HTMLWindow2: IHTMLWindow2;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

uses
   ActiveX, Unit1;



{$R *.dfm}

const
HTMLStr: AnsiString =
'<html> '+
'<head> '+
'<meta name="viewport" content="initial-scale=1.0, user-scalable=yes" /> '+
'<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script> '+
'<script type="text/javascript"> '+
''+
''+
' var geocoder; '+
' var map; '+
' var Beachclub; '+
' var marker; '+                // Markierung
' var trafficLayer;'+            // Layer Verkehr
' var bikeLayer;'+               // Layer
' var markersArray = [];'+
''+
''+
' function initialize() { '+
''+
'   geocoder = new google.maps.Geocoder();'+
''+
'   var latlng = new google.maps.LatLng(39.550189, 2.691211); '+
'   var latlng2 = new google.maps.LatLng(39.551200, 2.691211); '+
''+
'   var myOptions = { '+
'     zoom:     15, '+
'     center:   latlng, '+
'     mapTypeId: google.maps.MapTypeId.SATELLITE, '+       // ROADMAP (GROß geschrieben)
'     mapTypeControl: true, '+
'     mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU} '+
'                   }; '+
''+
'   map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); '+
''+
'   marker   = new google.maps.Marker({ position: latlng , map: map, title: "Hello World!" }); '+
'   Beachclub = new google.maps.Marker({ position: latlng2, title: "Hello AAAA" }); '+
''+
'   trafficLayer = new google.maps.TrafficLayer();'+
'   bikeLayer = new google.maps.BicyclingLayer();'+
'   map.set("streetViewControl", false);'+
' } '+
''+
''+
' function codeAddress(address) { '+
'   if (geocoder) {'+
'     geocoder.geocode( { address: address}, function(results, status) { '+
'       if (status == google.maps.GeocoderStatus.OK) {'+
'         map.setCenter(results[0].geometry.location);'+
'         PutMarker(results[0].geometry.location.lat(), results[0].geometry.location.lng(), results[0].geometry.location.lat()+","+results[0].geometry.location.lng());'+
'       } else {'+
'         alert("Geocode was not successful for the following reason: " + status);'+
'       }'+
'     });'+
'   }'+
' }'+
''+
''+
' function GotoLatLng(Lat, Lang) { '+
'  var latlng = new google.maps.LatLng(Lat,Lang);'+
'  map.setCenter(latlng);'+
'  PutMarker(Lat, Lang, Lat+","+Lang);'+
' }'+
''+
''+
'function ClearMarkers() {  '+
' if (markersArray) {        '+
'   for (i in markersArray) {  '+
'     markersArray[i].setMap(null); '+
'   } '+
' } '+
'}  '+
''+
' function PutMarker(Lat, Lang, Msg) { '+
'  var latlng = new google.maps.LatLng(Lat,Lang);'+
'  var marker = new google.maps.Marker({'+
'     position: latlng, '+
'     map: map,'+
'     title: Msg+" ("+Lat+","+Lang+")"'+
' });'+
' markersArray.push(marker); '+
' }'+
''+
''+
' function TrafficOn()  { trafficLayer.setMap(map); }'+
''+
' function TrafficOff() { trafficLayer.setMap(null); }'+
''+''+
' function CheckBox1On()  { map.set ("overviewMapControl", true); }'+     //
''+
' function CheckBox1Off() { map.set ("overviewMapControl", false); }'+    //
''+''+

' function CheckBox2On()  { Beachclub.setMap(map); }'+     //
''+
' function CheckBox2Off() { Beachclub.setMap(null); }'+     //
''+''+

' function BicyclingOn() { bikeLayer.setMap(map); }'+
''+
' function BicyclingOff(){ bikeLayer.setMap(null);}'+
''+
' function StreetViewOn() { map.set("streetViewControl", true); }'+
''+
' function StreetViewOff() { map.set("streetViewControl", false); }'+
''+
''+'</script> '+
'</head> '+
'<body onload="initialize()"> '+
' <div id="map_canvas" style="width:100%; height:100%"></div> '+
'</body> '+
'</html> ';


procedure TForm2.FormCreate(Sender: TObject);
var
  aStream    : TMemoryStream;
begin
   WebBrowser1.Navigate('about:blank');
    if Assigned(WebBrowser1.Document) then
    begin
      aStream := TMemoryStream.Create;
      try
         aStream.WriteBuffer(Pointer(HTMLStr)^, Length(HTMLStr));
         //aStream.Write(HTMLStr[1], Length(HTMLStr));
         aStream.Seek(0, soFromBeginning);
         (WebBrowser1.Document as IPersistStreamInit).Load(TStreamAdapter.Create(aStream));
      finally
         aStream.Free;
      end;
      HTMLWindow2 := (WebBrowser1.Document as IHTMLDocument2).parentWindow;

    end;
end;


procedure TForm2.ButtonGotoLocationClick(Sender: TObject);
begin
   HTMLWindow2.execScript(Format('GotoLatLng(%s,%s)',[Latitude.Text,Longitude.Text]), 'JavaScript');
end;

procedure TForm2.ButtonClearMarkersClick(Sender: TObject);
begin
  HTMLWindow2.execScript('ClearMarkers()', 'JavaScript')
end;

procedure TForm2.ButtonGotoAddressClick(Sender: TObject);
var
   address   : string;
begin
   address := MemoAddress.Lines.Text;
   address := StringReplace(StringReplace(Trim(address), #13, ' ', [rfReplaceAll]), #10, ' ', [rfReplaceAll]);
   HTMLWindow2.execScript(Format('codeAddress(%s)',[QuotedStr(address)]), 'JavaScript');
end;

procedure TForm2.CheckBoxStreeViewClick(Sender: TObject);
begin
    if CheckBoxStreeView.Checked then
     HTMLWindow2.execScript('StreetViewOn()', 'JavaScript')
    else
     HTMLWindow2.execScript('StreetViewOff()', 'JavaScript');

end;

procedure TForm2.CheckBox1Click(Sender: TObject);
begin
    if CheckBox1.Checked then
     HTMLWindow2.execScript('CheckBox1On()', 'JavaScript')
    else
     HTMLWindow2.execScript('CheckBox1Off()', 'JavaScript');
end;

procedure TForm2.CheckBox2Click(Sender: TObject);
begin
if CheckBox2.Checked then
     HTMLWindow2.execScript('CheckBox2On()', 'JavaScript')
    else
     HTMLWindow2.execScript('CheckBox2Off()', 'JavaScript');
end;

procedure TForm2.CheckBoxBicyclingClick(Sender: TObject);
begin
    if CheckBoxBicycling.Checked then
     HTMLWindow2.execScript('BicyclingOn()', 'JavaScript')
    else
     HTMLWindow2.execScript('BicyclingOff()', 'JavaScript');
 end;


procedure TForm2.CheckBoxTrafficClick(Sender: TObject);
begin
    if CheckBoxTraffic.Checked then
     HTMLWindow2.execScript('TrafficOn()', 'JavaScript')
    else
     HTMLWindow2.execScript('TrafficOff()', 'JavaScript');
 end;


end.
Jetzt habe ich, der ich neu in fmx bin, versucht, diesen Code in fmx umzuwandeln (zum Zwecke der Erstellung einer Android-Anwendung). Dabei tauchen folgende Probleme auf:

1. Fehlermeldung bei " private
HTMLWindow2: IHTMLWindow2;": Undeklarierter Bezeichner: "IHTMLWindow2"

2. Fehlermeldung bei "HTMLStr: AnsiString": Undeklarierter Bezeichner: "AnsiString"

3. Fehlermeldung in der FormCreate: "WebBrowser1.Document": Undeklarierter Bezeichner: "Document"

4. Fehlermeldung in der FormCreate: (WebBrowser1.Document as IPersistStreamInit).Load(TStreamAdapter.Create(aSt ream));: Undeklarierter Bezeichner: 'IPersistStreamInit' UND "Operator ist auf diesen Operandentyp nicht anwendbar"

4. Wie steht es mit den uses?


Herzlichen Dank für jeden Hinweis. Ich bin gerne bereit, mich einzuarbeiten.

himitsu 11. Jun 2014 16:25

AW: VCL Programm in fmx konvertieen
 
- der TWebBrowser kapselt eine Windows-Komponente (den Internet Explorer).
- Firemonkey ist grundsätzlich erstmal plattform-ungebunden, weswegen es da "Windows" sozusagen erstmal nicht gibt und im Android gibt es das sowieso nicht
- unter Android/iOS gibt es keine AnsiStrings mehr
- aber bezüglich den mobilen Plattformen gab es vor Kurzem erst einen Thread, wo es um den WebBrowser geht
ich hab mir das jetzt nicht gemerkt, aber du kannst dir gern den entsprechenden Thread raussuchen und lesen, was da zu dem Thema geschrieben stand.

zu den Uses: Im Prinzip erstmal alles weg, was "nur" mit Windows zu tun hat.
- z.B. OleCtrls, SHDocVw, XPMan, ComCtrls, MSHTML (Messages?)
Und ansonsten passt Delphi da so Einiges an. z.B. Forms.pas heißt jetzt Vcl.Forms.pas und Fmx.Forms.pas, aber je nach eingestelltem Framework für das Projekt stellt Delphi implizit das Vcl. oder Fmx. vor diese Units, womit da dann automatisch die richtige Unit verwendet wird.


PS: Folgefehler sollte man nicht immer gleich für bare Münze nehmen.
Erstmal den ersten Fehler beheben und dann mal sehen, welche der nachfolgenden Fehler dadurch erst ausgelöst wurden.
Also vorallem bezüglich dem "Operator ist auf diesen Operandentyp nicht anwendbar", denn der Fehler kann eventuell auch nur deswegen aufgetreten sein, weil vorher etwas anderes fehlte.

champagner 11. Jun 2014 19:32

AW: VCL Programm in fmx konvertieren
 
Heißt das, dass die Webbrowser-Komponente eigentlich nicht die richtige Komponente ist? Denn grundsätzlich kann ich sie ja auch bei Android-Anwendungen benutzen. Aus dem vorbezeichneten Thread bin ich auch nicht wirklich weiter gekommen.

Vielleicht nochmal so gefragt: Warum erhalte ich eine Fehlermeldung bei webbrowser1.document?

Besten Dank.

himitsu 11. Jun 2014 19:52

AW: VCL Programm in fmx konvertieen
 
Weil die dortige FMX-TWebBrowser-Komponente eine Andere ist, als die in der VCL.

Und Diese besitzt nunmal kein .Document, welches in der VCL das DOM der Internet Explorers veröffentlicht.

mkinzler 11. Jun 2014 19:56

AW: VCL Programm in fmx konvertieen
 
Die beiden heissen gleich, unterscheiden sich aber. Auf Windows ist das ein Wrapper um das Webbrowser ActiveX-Control, unter iOS und Android um WebKit/Blink.

http://blogs.embarcadero.com/nikolay...nthedelphixe6/


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz