AGB  ·  Datenschutz  ·  Impressum  







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

Delphi mit Java komunizieren

Offene Frage von "bucchi"
Ein Thema von Simon1988 · begonnen am 12. Jul 2006 · letzter Beitrag vom 27. Okt 2006
Antwort Antwort
Seite 7 von 8   « Erste     567 8      
Simon1988

Registriert seit: 12. Jul 2006
39 Beiträge
 
#61

Re: Delphi mit Java komunizieren

  Alt 26. Okt 2006, 14:46
hm .. komisch ..
also bei mir sagt der am schluss das das objekt das is erzeugen wollte leer ist.

Woran kann es dann liegen ? Wenn nich daran ?!
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#62

Re: Delphi mit Java komunizieren

  Alt 26. Okt 2006, 14:56
Was?
Wer sagt dir denn was genau? Ich kenne deinen Code nicht, ich kann es dir mit so wenig Info's nicht sagen. Kann im Prinzip alles sein.

Wenn JNI/Delphi nicht sagt, dass die Erzeugung fehlgeschlagen ist, dann hast du ein Objekt erzeugt und die Referenz kannst du in einem JObject speichern. Solange du diese Referenz nicht anfässt, wird die JVM wissen, dass die GC das zugehörige Objekt nicht freigeben darf.
Würdest du hier etwas falsches Erzeugt haben, so bekommst du einen Error, der dir einen ungültigen Cast anzeigen würde.
  Mit Zitat antworten Zitat
Simon1988

Registriert seit: 12. Jul 2006
39 Beiträge
 
#63

Re: Delphi mit Java komunizieren

  Alt 26. Okt 2006, 14:56
so hier nochmal mit Quelltext :

als erstes wird ein Objekt der JavaKlasse ShapeVectorDatasource erzeugt ..
dann will ich einen VectorLayer erzeugen. Der Konstuktor (wie man ja auch sieht) brauch aber nicht einen ShapeVectorblablub, sonder einen VectorDataSource (eben die unterklasse) ..
und da kommt dass das objekt von der Klasse VectorLayer leer ist .. warum auch immer ..

Delphi-Quellcode:
constructor JDShapeFileVector.create(Path :PAnsiChar) ;
 Var JPath : JString;
 begin
  cls := jvm.JniEnv.FindClass('com/gdv/mapbuilder/datasources/shapefile/ShapefileVectorDataSource');
  if cls = nil then
  begin
   ShowMessage('Klasse "ShapefileVectorDataSource" nicht gefunden');
   exit;
  end;
  ConstructorMid := jvm.JniEnv.GetMethodID(cls, '<init>', '(Ljava/lang/String;)V') ;
  if constructorMid = nil then
  begin
   ShowMessage('Konstruktor nicht gefunden') ;
   exit ;
  end;
  JPath := Jvm.JniEnv.StringToJString(Path) ;
  Obj := jvm.JniEnv.NewObject(cls, ConstructorMid,[JPath]);
  if Obj = nil then
   ShowMessage('Fehler beim erzeugen der Instanz');
  VectorLayer := JDVEctorLayer.create(Obj);
 end; {*create ShapeVector}

 destructor JDShapeFileVector.destroy ;
 begin
  Vectorlayer.destroy ;
 end;

 constructor JDVectorLayer.create(ShapeFile : JObject);
 begin
 cls := jvm.JniEnv.FindClass('com/gdv/mapbuilder/layer/MBVectorLayer');
  if cls = nil then
  begin
   ShowMessage('Klasse "MBVectorLayer" nicht gefunden');
   exit;
  end;
  ConstructorMid := jvm.JniEnv.GetMethodID(cls, '<init>', '(Lcom/gdv/mapbuilder/datasources/VectorDataSource;)V');
  if constructorMid = nil then
  begin
   ShowMessage('Konstruktor nicht gefunden') ;
   exit ;
  end;
  Obj := jvm.JniEnv.NewObject(cls, ConstructorMid,[ShapeFile]);
//ShapeFile ist hier eben vom Objekt ShapefileVectorbla und nicht von der verlangten unterklasse VectorDataSource
  if Obj = nil then
   ShowMessage('Fehler beim erzeugen der Instanz: VectorLayer');
 end;
es kommt keine Meldung außer 'Fehler beim erzeugen der Instanz: VectorLayer'
kann es jetzt sein dass das Obj der Klasse Vector leyer trotzdem erzeugt wurde ?!
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#64

Re: Delphi mit Java komunizieren

  Alt 26. Okt 2006, 15:10
Zitat von Simon1988:
es kommt keine Meldung außer 'Fehler beim erzeugen der Instanz: VectorLayer'
kann es jetzt sein dass das Obj der Klasse Vector leyer trotzdem erzeugt wurde ?!
Ja, kann sein.
Das Problem ist, dass mir hier nicht ganz klar ist, warum der Code da überhaupt funktioniert. Du verwendest hier Konstruktoren, die nie inherited create aufrufen. Wenn das also dein Delphi-Code ist, solltest du schon an der Stelle ein Problem haben.
Ansonsten ist mir auch nicht klar, wo die Variable obj herkommt. Die verwendest du hier relativ global, obwohl zwei völlig verschiedene Instanzen hier abgelegt werden sollen. Ob sie nicht zwischen den zwei Schritten noch an einer anderen Stelle verändert wird, kann ich so nicht sehen / sagen. Besser ist es, wenn du hier mit einer eigenen Variable arbeitest.
An sich verwirrt mich auch etwas der Aufbau deines Programms. Dein JDVectorlayer benötigt ein JDShapeFileVector, soweit so klar. Jetzt würde ich sagen, dass JDVectorLayer also von der Existenz eines JDShapeFileVector wissen muss, nicht umgekehrt. Folglich sollte also JDShapeFileVector sich eine Instanz von JDShapeFileVector besorgen und diese verwenden...
Also es wirkt auf micht wirklich etwas unglücklich modelliert.

Worin jetzt der eigentliche Fehelr besteht kann ich so aber auch nicht sagen (sehe ihn nicht). Wie gesagt, globale Instanz von obj wäre ganz schlecht.
  Mit Zitat antworten Zitat
Simon1988

Registriert seit: 12. Jul 2006
39 Beiträge
 
#65

Re: Delphi mit Java komunizieren

  Alt 26. Okt 2006, 15:29
ich frag meinen arbeitgebeer mal wie weit ich das projekt hochladen darf .. aber eins kan ich sagen .. obj ist nicht global !
  Mit Zitat antworten Zitat
Simon1988

Registriert seit: 12. Jul 2006
39 Beiträge
 
#66

Re: Delphi mit Java komunizieren

  Alt 26. Okt 2006, 15:31
oder würde dir mal der komplette quelltext (ohne javadaten) erstmal reichen ?
Angehängte Dateien
Dateityp: rar spacialcommandergoesdelphi_517.rar (270,2 KB, 13x aufgerufen)
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#67

Re: Delphi mit Java komunizieren

  Alt 26. Okt 2006, 15:59
Versuch es mal mit dem Aufruf der geerbten Methode im Konstruktor:
Delphi-Quellcode:
begin
  inherited create;
  ...
end;
Das gehört immer an erster Stelle in den Konstruktor. Damit wird überhaupt erst der Speicher reserviert, der für die Struktur benötigt wird. Vielleicht findest du dort schon deinen Fehler.

[Add]
Ansonsten solltest du deine Klassen an sich noch etwas überarbeiten. Es ist immer schöner, wenn man die Schutzklassen die es gibt auch verwendet. Variablen solltest du immer als private deklarieren und den Zugriff über Properites nach aussen kapseln. Methoden sollten dann protected sein (wenn sie nur in der Klasse sichtbar sein sollen), sonst public.
Der Zugriff auf Methoden (und imho auch Variablen) sollte qualifiziert werden (self. vorschreiben), damit ist immer klar, dass du eine Instanzvariable meist.
[/Add]
  Mit Zitat antworten Zitat
Simon1988

Registriert seit: 12. Jul 2006
39 Beiträge
 
#68

Re: Delphi mit Java komunizieren

  Alt 26. Okt 2006, 16:18
gut also sachen wie obj nicht public lassen usw.

aber was meinst du mit inherited .. ich mein meine klassen in Delphi sind ja eigentlich nicht voneinander vererbt .. nur die in der JavaKlasse .. meine muss ja auch nich vererbt sein......



hm .. also kann ich einfach das ShapeFile der Klasse ShapeFileVectorData übergeben obwohl er nur die unterklasse FilVectordartablub haben will ?! .. da müsste es keinen komplikationen geben ?! .. hab ich denn mit JNI alles richtig programmiert ?
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#69

Re: Delphi mit Java komunizieren

  Alt 26. Okt 2006, 16:28
Zitat von Simon1988:
aber was meinst du mit inherited .. ich mein meine klassen in Delphi sind ja eigentlich nicht voneinander vererbt ..
Da siehst du etwas falsch. In der OOP (hier sogar mal in ziemlich jeder Sprache) erbt man automatisch von einem gemeinsamen Vorfahren. Häufig ähneln sich hier sogar die Namen dieses Vorfahren, Delphi Klassen erben (immer!) von TObject. Ob du ein direkter oder indirekter Nachfahre bist spielt bei der Vererbung bekanntlich keine Rolle. Die wichtigsten Eigenschaften müssen in einer solchen Basisklasse festgelegt werden, es geht um das einfache Erzeugen einer Instanz. Dazu muss letztlich Speicher alloziert und gefüllt werden. Darum kümmert sich (zum Glück) der Urkonstruktor überhaupt, TObject.Create. Da jede Klasse ein Nachfahre ist, sollte auch tunlichst jede Klasse einmal diesen Konstruktor aufrufen. Da du hier zwei Klassen einführst und verwendest, gilt das auch für dich.

Statt

Delphi-Quellcode:
TXYZ = class
...
end;
kannst du auch schreiben

Delphi-Quellcode:
TXYZ = class(TObject)
...
end;
Beide Blöcke haben die gleiche Aussage! Führst du einen eigenen Konstruktor ein, so musst du immer als erstes dafür sorgen, dass Speicher alloziert wird, die Adresse bekannt gegeben, etc. Irgendwoher muss Delphi ja dann wissen, wo jetzt dein Objekt liegt, welchen Typ es hat usw. Davon übernimmt der Vererbte Konstruktor von TObject schon einen guten Teil. Deswegen beginnt jeder Konstruktor immer mit der Zeile:

[delphi]
constructor TXYZ.create;
begin
inherited create;
end;
[delphi]

Also so sieht es bei direkten Erben von TObjekt aus, bei einem TControl würdest du natürlich dem inherited create noch den Owner mitgeben, aber der würde damit nur die geerbte Methode von TComponent aufrufen, dass geht dann wieder runter bis zum Parameterlosen create Aufruf eines TObject.

Ähnlich sieht es dann beim Destruktor auf. Der muss ja letztlich sauber machen. Jetzt kannst du dich selbst drum kümmern, wie Delphi seine Klassen verwaltet (was keineswegs sinnvoll ist) oder du greifst hier dann einfach auf den geerbten Destruktor zurück. Überschreibst du also einen Destruktor, so muss die letzte Zeile inherited destroy heißen (die gibt einfach den Speicher des Objekts und aller Variablen, etc. frei).
  Mit Zitat antworten Zitat
Simon1988

Registriert seit: 12. Jul 2006
39 Beiträge
 
#70

Re: Delphi mit Java komunizieren

  Alt 26. Okt 2006, 17:10
ok .. es klappt alles .. ich habe eine methode vergessen aufzurufen .. daher kamen haltz folgefehler auf .. hatte aber was mit dem Java Programm zu tun.. werde aber trotzdem auch nochmal den delphiquellcode überarbeiten
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 8   « Erste     567 8      


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 09:46 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