AW: Auf Klassenvariablen indiziert zugreifen?
Zitat:
Delphi-Quellcode:
Du musst schlicht und einfach die Referenz als 'var' übergeben.
procedure SetValue(var oFld: TWaswoasDennI; value: string);
begin oFld := TWaswoasDennI.Create(); oFld.SetValue(value); end; |
AW: Auf Klassenvariablen indiziert zugreifen?
@DeddyH: Ja, könnte man kürzen, aber leider hat beim Oxid-eShop der Artikelstamm (ohne eventuelle Indivs) 113 Felder, da wäre der Prozeduraufruf ziemlich lang...
@Mikkey: Genau sowas hätte ich mir vorgestellt! Und stimmt, eigentlich doch ganz einfache Anforderung an Delphi? Leider tuts so doch noch nicht: Fehler: E2197: Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden. Ich denke, das Problem ist teilweise auch dass es sich bei allen 113 Feldern nicht um strings, booleans, integers oder doubles handelt, sondern um die nilable Delphi-Klassen (TXSString, TXSInteger, TXSBoolean und TXSDouble). Fakt ist, dass da 113 x ein Aufruf stattfinden sollte, wo als Parameter einfach der Feldname, der Index und die Daten übergeben werden müssen... greetz, Erwin J. |
AW: Auf Klassenvariablen indiziert zugreifen?
Hi,
ist zwar nicht ganz so elegant, aber evtl. hilft das hier weiter: procedure oxWrite( var aField:txString; aValue:String); overload; begin aField := txString.Create; aField.XSToNative(aValue); end; procedure oxWrite( var aField:txBoolean; aValue:Boolean); overload; begin aField := txBoolean.Create; aField.asBoolean := aValue; end; oxWrite( aArt[idx].OXID, '05848170643ab0deb9914566391c0c63'); oxWrite( aArt[idx].OXTitle, 'Tescht mit ÄÖÜäöüß uns allen Spielis by EJ...'); oxWrite( aArt[idx].OXActive, True); |
AW: Auf Klassenvariablen indiziert zugreifen?
@NormanNG: Das wäre genau das, was ich erreichen wollen würde.
Leider - wenn ich Deinen Code verwende - sagt mir Mr. Compiler mit dem Code E2250 "es gäbe keine überladene Funktion, die man mit diesen Argumenten aufrufen könne"... Ich befürchte es liegt am Versuch der Übergabe von TXSString? Irgendwoanders hab ich mittlerweile ergooglet, dass es ja setter und getter für diese Quasi-Var's geben könne und von daher ein Zugriff mit var / out nicht möglich / sehr unpraktikabel sei... Heut' ist echt net mein Tag :lol: greetz, Erwin J. |
AW: Auf Klassenvariablen indiziert zugreifen?
Man kann keine Properties als Var-Parameter übergeben, siehe gepostete Fehlermeldung. Was aber ginge:
Delphi-Quellcode:
Normalerweise bin ich ja kein Freund von Objekten als Rückgabewert, aber hier überseh ich das einfach mal.
function oxWrite(const aValue:String): txString;
begin Result := txString.Create; Result.XSToNative(aValue); end; aArt[idx].OXID := oxWrite('05848170643ab0deb9914566391c0c63'); |
AW: Auf Klassenvariablen indiziert zugreifen?
OK, das geht nicht mit properties.
Dann verwende doch einfach Funktionen: function oxWrite( aValue:string):txString; overload; begin Result := txString.Create; Result.XLSToNative := aValue; end; function oxWrite( aValue:Boolean):txBoolean; overload; begin Result := txBoolean.Create; Result.asBoolean := aValue; end; // oxWrite( aArt[0].OXID, 'Test'); aArt[0].OXID := oxWrite('123'); aArt[0].OXTitle := oxWrite('Title'); aArt[0].OXActive := oxWrite(true); |
AW: Auf Klassenvariablen indiziert zugreifen?
@Norman / DeddyH: genau so tut's!
Genial. Hätte ich doch auch selber draufkommen können :cyclops: Letzte Frage zum Tage noch: Wenn ich Result als TXSString / TXSBoolean ode so (eben eine Klasse) "create" und hernach mit einem Wert versehe... Löscht (destroyed) sich da der Rückgabewert selbstständig sobald die Function den Focus verliert? Wegen SpeicherLeaks warads... Ich wüsst jetzt auf die Schnelle auch keinen Weg eine Result zu knicken? greetz, Erwin J. |
AW: Auf Klassenvariablen indiziert zugreifen?
Das wäre schön blöd, wenn die Instanzen anschließend automatisch freigegeben würden. Dem ist aber nciht so, was auch bedeutet, dass Du für den Speicher selbst verantwortlich bist. Falls nichts dagegen spricht, kannst Du Dein dynamisches Array ja gegen eine TObjectlist austauschen, die ist erstens effizienter und gibt die enthaltenen Objekte optional automatisch frei (OwnsObjects-Parameter im Konstruktor).
|
AW: Auf Klassenvariablen indiziert zugreifen?
Hmmm, heute steh' ich glaub ich echt auf dem Schlaucherl?
Eine function hat einen Result-Wert. Selbigen verwende ich in diesem Fall so, dass ich Result:=TXSString.create fahre und hernach einen Wert mit Result.XSToNative('bla bla') zuweise. Und genau dieses Result (eigentlich ja eine Semi-Variable) ist mein Problem? Weil den Wert / Status von diesem Result übergebe ich doch mittels
Code:
ungespitzt an mein Array weiter.
aArt[iDX].OXID:=oxWrite('bla bla');
OK, dann ist der Inhalt von Result übergeben, die Fackel trägt ein Anderer. ABER: was passiert jetzt mit besagtem Result aus der aufgerufenen Funktion? Nur mit dieser Semi-Variable meine ich? Die hat doch ihre Schuldigkeit getan und dann sollte sie sich doch selber destroyen? Oder nicht? Weil wenn ich sagen wir mal 3.000 Artikel aus einer Warenwirtschaft zum Oxid hochschnalze, und dabei pro Artikel im Schnitt 60 Felder übertragen muss hätte ich 180.000 kleine Results im Speicher herumwuseln die ich nicht mag :evil: @DeddyH: Kannst Du mir zum Thema ObjectList noch ein paar Gedanken dalassen? Ich verwende das Array nämlich weils der WSDL-Importer so bastelt. D.h. es gibt eine Klasse Article, und Articles ist ein Array of Article. Und der Article hat die ganzen 113++ "Felder". Den Speicher im Array gebe ich entweder mit setLength(aArt,0) frei? Oder muss ich durchiterieren und aArt[iDX].destroyen? greetz, Erwin J. |
AW: Auf Klassenvariablen indiziert zugreifen?
Mit dem SetLength auf 0 gibst Du nur den Speicher frei, den das Array belegt, nicht aber die enthaltenen Objekte. Da wirst Du schon vorher durchiterieren müssen, auf Speicherlecks testen kann man, indem man z.B. in der *.dpr als erste Zeile nach dem "begin" ReportMemoryLeaksOnShutdown auf true setzt (ab Delphi 2006 IIRC, ansonsten FastMM nachinstallieren).
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23: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