Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Erweitern einer vorahandenen Property in einer VCL Komponente (https://www.delphipraxis.net/193388-erweitern-einer-vorahandenen-property-einer-vcl-komponente.html)

fisipjm 24. Jul 2017 15:32

Erweitern einer vorahandenen Property in einer VCL Komponente
 
Hi volks,

ich hoffe mal wieder auf eure Hilfe, bei folgendem Problem:

Ich setze für ein Projekt die TWebOSMaps komponente von TMSSoftware ein. Das ist eine mit OpenStreetMap gekoppelte Karte mit der man allerlei spielerein machen kann, als Tool wirklich ganz nett :-D

Nun zum eigentlichen "Problem"

Ich habe zur Designzeit eine TWebOsMaps komponente die auf einer VCL Form liegt. Innerhalb der TWebOsMaps komponenten gibt es die Property Marker, also meine Punkte die ich auf der Karte platzieren kann. Ich kann den Markern via WebOsMaps.Marker.add beliebig viele Marker hinzufügen.
Die Marker besitzen die Werte Longitude, Latitude, Title, ID, Draggable und Visible.
Ich würde hier gerne noch eine Eigenschaft erweitern, nämlich in meinem Fall eine Olevariant, die mir eine GUID aus einem Datensatz speichert.

Ich schweitere aber irgendwie kläglich an der Ableitung, habt ihr ein paar Tipps für mich.
Danke schon mal im Voraus.

MFG
PJM

sko1 24. Jul 2017 15:36

AW: Erweitern einer vorahandenen Property in einer VCL Komponente
 
TMyWebOsMaps aus TWebOsMaps ableiten und da die neue Property einbauen?

Ciao
Stefan

himitsu 24. Jul 2017 15:58

AW: Erweitern einer vorahandenen Property in einer VCL Komponente
 
Erstmal nachschauen welche Klasse die einzelnen Marker haben.
Diese Klasse ableiten und um dein Property erweitern.

Dann die Stelle suchen, wo die Instanzen jener Marker-Klasse erstellt werden und ob/wie man da diese Klasse durch deine Ableitung ersetzt.

Und das bis hoch zur TWebOsMaps, falls es mehrere Ebenen gibt, wie z.B.:
* Marker-Klasse ableiten
* Marker-Liste ableiten, zum Reinhängen der Marker-Klasse
* TWebOsMaps ableiten, zum Ersetzen der Marker-Listen-Klasse.

Am Besten macht es sich, wenn TMS dafür in den übergeordneten Klassen die nötigen Funktionen als virtual deklariert hat und das möglichst fein diffenenziert, z.B. ala CreateMarker oder GetMarkerClass, bzw. wenn die Liste ihre Item-Klasse im Contructor bekommt, ala Delphi-Referenz durchsuchenTCollection.Create.



"Umständlicher" :
Du führst eine Liste/Array mit den GUIDs und schreibst bei den Klassen in
Delphi-Quellcode:
.Tag
den jeweiligen Index.

Oder andersrum, über die Instanzen verlinkt. ->
Delphi-Quellcode:
TDictionary<TMarker, TGUID>

Uwe Raabe 24. Jul 2017 16:25

AW: Erweitern einer vorahandenen Property in einer VCL Komponente
 
Zitat:

Zitat von himitsu (Beitrag 1377358)
Erstmal nachschauen welche Klasse die einzelnen Marker haben.
Diese Klasse ableiten und um dein Property erweitern.

Dann die Stelle suchen, wo die Instanzen jener Marker-Klasse erstellt werden und ob/wie man da diese Klasse durch deine Ableitung ersetzt.

Und das bis hoch zur TWebOsMaps, falls es mehrere Ebenen gibt, wie z.B.:
* Marker-Klasse ableiten
* Marker-Liste ableiten, zum Reinhängen der Marker-Klasse
* TWebOsMaps ableiten, zum Ersetzen der Marker-Listen-Klasse.

Am Besten macht es sich, wenn TMS dafür in den übergeordneten Klassen die nötigen Funktionen als virtual deklariert hat und das möglichst fein diffenenziert, z.B. ala CreateMarker oder GetMarkerClass, bzw. wenn die Liste ihre Item-Klasse im Contructor bekommt, ala Delphi-Referenz durchsuchenTCollection.Create.

Die aktuelle Implementierung lässt diesen Weg leider nicht zu. Man muss die Collection von TMarkers ableiten, hat aber dann keinen Einfluss mehr auf die ItemClass. Das Design ist in diesem Punkt alles andere als flexibel.



Zitat:

Zitat von himitsu (Beitrag 1377358)
"Umständlicher" :
Du führst eine Liste/Array mit den GUIDs und schreibst bei den Klassen in
Delphi-Quellcode:
.Tag
den jeweiligen Index.

Oder andersrum, über die Instanzen verlinkt. ->
Delphi-Quellcode:
TDictionary<TMarker, TGUID>

Ist in diesem Fall wohl der einzig gangbare Weg.

mensch72 24. Jul 2017 18:21

AW: Erweitern einer vorahandenen Property in einer VCL Komponente
 
Per "Tag" über ein Dictionary auf XY zukommen geht ja auch... aber die TMS Sourcen sind doch gut lesbar und strukturelles "Copy&Paste", das Konzept mit/über Collections ist da doch egal um was es grade geht immer gleich...

Du hast doch die Marker-Klasse nun eh schon gefunden, haue da einfach den von dir benötigten Wert unter Public als dirkte Membervariable ohne Getter/Setter hinein... mit jedem anständigem Merge/Diff-Tool bekommste solche "Einzeiler" ohne jegliche Abhängigkeit nachträglich bei TMS Updates ganz simpel nachgetragen. Nicht die feine Art, aber in diesem Fall wohl der effektivste Weg:)

fisipjm 25. Jul 2017 07:37

AW: Erweitern einer vorahandenen Property in einer VCL Komponente
 
Zitat:

Zitat von mensch72 (Beitrag 1377362)
Du hast doch die Marker-Klasse nun eh schon gefunden, haue da einfach den von dir benötigten Wert unter Public als dirkte Membervariable ohne Getter/Setter hinein... mit jedem anständigem Merge/Diff-Tool bekommste solche "Einzeiler" ohne jegliche Abhängigkeit nachträglich bei TMS Updates ganz simpel nachgetragen. Nicht die feine Art, aber in diesem Fall wohl der effektivste Weg:)

Ich glaub ich Versteh dich nicht ganz :-D
Was meinst du mit ich hab die Marker-Klasse gefunden? Ich kann sie Aufrufen und zur Not auch mit einer eigenen Klasse ableiten, aber ich hab keinen Zugriff auf die Klassen deklaration. Hast du vielleicht ein "Einzeiler" Dummy Code, vielleicht kann ichs mir dann besser vorstellen.

Danke für die Antwort.:thumb:

fisipjm 25. Jul 2017 07:40

AW: Erweitern einer vorahandenen Property in einer VCL Komponente
 
Zitat:

Zitat von sko1 (Beitrag 1377356)
TMyWebOsMaps aus TWebOsMaps ableiten und da die neue Property einbauen?

Ciao
Stefan

Hi Stefan,

die TWebOsMaps liegt ja zur Designzeit auf meiner Form und die Marker setze ich zur Laufzeit.
Tmarker hab ich mir schon abgeleitet, bringt mir aber in dem Fall irgendwie nix, weil ich ja die Funktion Marker.add über das im Formular gesetzt TWebOsMaps setze.

fisipjm 25. Jul 2017 07:42

AW: Erweitern einer vorahandenen Property in einer VCL Komponente
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1377359)
Zitat:

Zitat von himitsu (Beitrag 1377358)
"Umständlicher" :
Du führst eine Liste/Array mit den GUIDs und schreibst bei den Klassen in
Delphi-Quellcode:
.Tag
den jeweiligen Index.

Oder andersrum, über die Instanzen verlinkt. ->
Delphi-Quellcode:
TDictionary<TMarker, TGUID>

Ist in diesem Fall wohl der einzig gangbare Weg.

Ich habs befürchtet, den Wert ID hat der Marker ja, den kann man dafür verwenden um ihn später auch wieder anzusprechen. Ich wollte das aber eigentlich lieber umgehen, da es der ohnehin schon recht umständlichen Programmierung noch einen weiteren Step hinzufügt :|

Danke für die Antwort :thumb:

himitsu 25. Jul 2017 08:36

AW: Erweitern einer vorahandenen Property in einer VCL Komponente
 
Zitat:

Zitat von fisipjm (Beitrag 1377377)
Ich habs befürchtet, den Wert ID hat der Marker ja, den kann man dafür verwenden um ihn später auch wieder anzusprechen. Ich wollte das aber eigentlich lieber umgehen, da es der ohnehin schon recht umständlichen Programmierung noch einen weiteren Step hinzufügt :|

Anzeigen und Speichern hängt aber nicht immer untrennbar zusammen.

Du kannst problemlos die GUIDs in einer externen Liste verwalten, aber die jeweilige GUID dennoch in deinen Marker-Items als Property bereitstellen.

Stichwort: Class-Helper
Also das Property nachträglich/virtuell an dem Marker hängend, aber im Getter/Setter dieses Property die GUID extern verwalten. (z.B. in dem Dictionary)

fisipjm 25. Jul 2017 10:29

AW: Erweitern einer vorahandenen Property in einer VCL Komponente
 
Zitat:

Zitat von himitsu (Beitrag 1377383)
Zitat:

Zitat von fisipjm (Beitrag 1377377)
Ich habs befürchtet, den Wert ID hat der Marker ja, den kann man dafür verwenden um ihn später auch wieder anzusprechen. Ich wollte das aber eigentlich lieber umgehen, da es der ohnehin schon recht umständlichen Programmierung noch einen weiteren Step hinzufügt :|

Anzeigen und Speichern hängt aber nicht immer untrennbar zusammen.

Du kannst problemlos die GUIDs in einer externen Liste verwalten, aber die jeweilige GUID dennoch in deinen Marker-Items als Property bereitstellen.

Stichwort: Class-Helper
Also das Property nachträglich/virtuell an dem Marker hängend, aber im Getter/Setter dieses Property die GUID extern verwalten. (z.B. in dem Dictionary)

Himitsu du bist offiziel der Held des Tages :-D

Hab es jetzt folgendermaßen gelöst:

Delphi-Quellcode:
USES
..., Generics.Colletions,....

type
TMarkerHelper = class helper for TMarker
  class var
    AddressGGUIDDictionary : TDictionary<TMarker,String>;
  public
    procedure SetAddressGGUID(lAddressgguid : string);
    function GetAddressGGUID : string;
  published
    property AddressGGUID:string read GetAddressGGUID write SetAddressGGUID;
end;

.....

procedure tmarkerhelper.SetAddressGGUID(lAddressgguid: string);
begin
  if not assigned(AddressGGUIDDictionary) then
    AddressGGUIDDictionary:=TDictionary<TMarker, String>.Create;
  AddressGGUIDDictionary.Add(self,lAddressgguid);
end;

function tmarkerhelper.getAddressGGUID : string;
begin
  AddressGGUIDDictionary.TryGetValue(self,result);
end;
 
...
Habs getestet und macht was es soll.:thumb: Gibts da noch was zu beachten oder passt der Code so?
MFG
PJM


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:50 Uhr.
Seite 1 von 2  1 2      

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