AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Erweitern einer vorahandenen Property in einer VCL Komponente
Thema durchsuchen
Ansicht
Themen-Optionen

Erweitern einer vorahandenen Property in einer VCL Komponente

Ein Thema von fisipjm · begonnen am 24. Jul 2017 · letzter Beitrag vom 9. Jul 2018
Antwort Antwort
Seite 1 von 2  1 2      
sko1

Registriert seit: 27. Jan 2017
601 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

AW: Erweitern einer vorahandenen Property in einer VCL Komponente

  Alt 24. Jul 2017, 16:36
TMyWebOsMaps aus TWebOsMaps ableiten und da die neue Property einbauen?

Ciao
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Erweitern einer vorahandenen Property in einer VCL Komponente

  Alt 24. Jul 2017, 16:58
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 .Tag den jeweiligen Index.

Oder andersrum, über die Instanzen verlinkt. -> TDictionary<TMarker, TGUID>
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (24. Jul 2017 um 17:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#3

AW: Erweitern einer vorahandenen Property in einer VCL Komponente

  Alt 24. Jul 2017, 17:25
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.



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

Oder andersrum, über die Instanzen verlinkt. -> TDictionary<TMarker, TGUID>
Ist in diesem Fall wohl der einzig gangbare Weg.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#4

AW: Erweitern einer vorahandenen Property in einer VCL Komponente

  Alt 24. Jul 2017, 19:21
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
  Mit Zitat antworten Zitat
fisipjm
Online

Registriert seit: 28. Okt 2013
328 Beiträge
 
Delphi 12 Athens
 
#5

AW: Erweitern einer vorahandenen Property in einer VCL Komponente

  Alt 25. Jul 2017, 08:37
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
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.
  Mit Zitat antworten Zitat
fisipjm
Online

Registriert seit: 28. Okt 2013
328 Beiträge
 
Delphi 12 Athens
 
#6

AW: Erweitern einer vorahandenen Property in einer VCL Komponente

  Alt 25. Jul 2017, 08:42
"Umständlicher" :
Du führst eine Liste/Array mit den GUIDs und schreibst bei den Klassen in .Tag den jeweiligen Index.

Oder andersrum, über die Instanzen verlinkt. -> 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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Erweitern einer vorahandenen Property in einer VCL Komponente

  Alt 25. Jul 2017, 09:36
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)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
fisipjm
Online

Registriert seit: 28. Okt 2013
328 Beiträge
 
Delphi 12 Athens
 
#8

AW: Erweitern einer vorahandenen Property in einer VCL Komponente

  Alt 25. Jul 2017, 11:29
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

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. Gibts da noch was zu beachten oder passt der Code so?
MFG
PJM
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#9

AW: Erweitern einer vorahandenen Property in einer VCL Komponente

  Alt 25. Jul 2017, 11:33
Ich würde das Anlegen/Freigeben der Dictionary-Instanz in einen Klassenkonstruktor/Klassendestruktor verlegen. Wenn Du im Moment lesend darauf zugreifst, ohne vorher geschrieben zu haben, macht es Bumms.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Erweitern einer vorahandenen Property in einer VCL Komponente

  Alt 25. Jul 2017, 11:39
Habs getestet und macht was es soll. Gibts da noch was zu beachten oder passt der Code so?
Delphi-Quellcode:
function tmarkerhelper.getAddressGGUID : string;
begin
  AddressGGUIDDictionary.TryGetValue(self,result);
end;
Dein Rückgabewert ist nicht initialisiert. (eigentlich doch, da String ein Managed-Type ist, aber nicht in Bezug auf diese Function)
Sowas macht Spaß, wenn getAddressGGUID z.B. in einer For-Schleife aufgerufen wird.
Delphi-Quellcode:
if not AddressGGUIDDictionary.TryGetValue(self,result) then
  Result := '';
Du hast ein Speicherleck bei AddressGGUIDDictionary. Die Liste wird nicht freigegeben.
Ich weiß nicht ob Class-Constructor und Class-Destructor bei Class-Helpern möglich sind, aber es gibt ja noch Initialization und Finalization der Unit.

Wenn TMarker von TComponent abgeleitet ist, dann könnte man noch Delphi-Referenz durchsuchenTComponent.FreeNotification verwenden, um automatisch die GUID zu löschen, wenn der TMarker freigegeben wird.
https://stackoverflow.com/questions/...has-been-freed
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (25. Jul 2017 um 11:41 Uhr) Grund: :sleep:
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 14:30 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 by Thomas Breitkreuz