AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

VCL Programm in fmx konvertieen

Ein Thema von champagner · begonnen am 11. Jun 2014 · letzter Beitrag vom 11. Jun 2014
Antwort Antwort
champagner

Registriert seit: 29. Apr 2008
46 Beiträge
 
Delphi XE6 Professional
 
#1

VCL Programm in fmx konvertieen

  Alt 11. Jun 2014, 17:05
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: VCL Programm in fmx konvertieen

  Alt 11. Jun 2014, 17:25
- 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.
$2B or not $2B

Geändert von himitsu (11. Jun 2014 um 17:31 Uhr)
  Mit Zitat antworten Zitat
champagner

Registriert seit: 29. Apr 2008
46 Beiträge
 
Delphi XE6 Professional
 
#3

AW: VCL Programm in fmx konvertieren

  Alt 11. Jun 2014, 20:32
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: VCL Programm in fmx konvertieen

  Alt 11. Jun 2014, 20:52
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.
$2B or not $2B
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: VCL Programm in fmx konvertieen

  Alt 11. Jun 2014, 20:56
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/
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08: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