Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Auf Klassenvariablen indiziert zugreifen? (https://www.delphipraxis.net/177174-auf-klassenvariablen-indiziert-zugreifen.html)

Mikkey 22. Okt 2013 10:40

AW: Auf Klassenvariablen indiziert zugreifen?
 
Zitat:

Zitat von Joerginger (Beitrag 1232707)
Nun würde ich gern ein bekanntes Feld (z.B. 'OXID') einer bekannten Klasseninstanz (aArt[index]) einer Prozedur übergeben um ebendort in dieser Prozedur auf selbiges Feld zuzugreifen, so wie ich es auch im aufrufenden Code kann... Brauche ich dazu wirklich die RTTI?

Vielleicht ist die Aufgabenstellung auch zu simpel um richtig verstanden zu werden :stupid:

Delphi-Quellcode:
procedure SetValue(var oFld: TWaswoasDennI; value: string);
begin
  oFld := TWaswoasDennI.Create();
  oFld.SetValue(value);
end;
Du musst schlicht und einfach die Referenz als 'var' übergeben.

Joerginger 22. Okt 2013 11:19

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.

NormanNG 22. Okt 2013 12:16

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);

Joerginger 22. Okt 2013 12:51

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.

DeddyH 22. Okt 2013 12:53

AW: Auf Klassenvariablen indiziert zugreifen?
 
Man kann keine Properties als Var-Parameter übergeben, siehe gepostete Fehlermeldung. Was aber ginge:
Delphi-Quellcode:
function oxWrite(const aValue:String): txString;
begin
  Result := txString.Create;
  Result.XSToNative(aValue);
end;

aArt[idx].OXID := oxWrite('05848170643ab0deb9914566391c0c63');
Normalerweise bin ich ja kein Freund von Objekten als Rückgabewert, aber hier überseh ich das einfach mal.

NormanNG 22. Okt 2013 13:01

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);

Joerginger 22. Okt 2013 14:09

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.

DeddyH 22. Okt 2013 14:13

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).

Joerginger 22. Okt 2013 14:30

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:
aArt[iDX].OXID:=oxWrite('bla bla');
ungespitzt an mein Array weiter.

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.

DeddyH 22. Okt 2013 14:39

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 21:02 Uhr.
Seite 2 von 3     12 3      

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