AGB  ·  Datenschutz  ·  Impressum  







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

Auf Klassenvariablen indiziert zugreifen?

Ein Thema von Joerginger · begonnen am 22. Okt 2013 · letzter Beitrag vom 22. Okt 2013
Antwort Antwort
Seite 2 von 3     12 3      
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#11

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 10:40
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

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.
  Mit Zitat antworten Zitat
Joerginger

Registriert seit: 22. Jan 2009
Ort: Wien
38 Beiträge
 
Delphi 7 Enterprise
 
#12

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 11:19
@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.
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#13

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 12:16
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);
Gruß
Norman
  Mit Zitat antworten Zitat
Joerginger

Registriert seit: 22. Jan 2009
Ort: Wien
38 Beiträge
 
Delphi 7 Enterprise
 
#14

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 12:51
@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

greetz, Erwin J.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 12:53
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.
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
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#16

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 13:01
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);
Gruß
Norman

Geändert von NormanNG (22. Okt 2013 um 13:02 Uhr) Grund: DeddyH war schneller - kein roter kasten
  Mit Zitat antworten Zitat
Joerginger

Registriert seit: 22. Jan 2009
Ort: Wien
38 Beiträge
 
Delphi 7 Enterprise
 
#17

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 14:09
@Norman / DeddyH: genau so tut's!

Genial. Hätte ich doch auch selber draufkommen können

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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 14:13
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).
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
Joerginger

Registriert seit: 22. Jan 2009
Ort: Wien
38 Beiträge
 
Delphi 7 Enterprise
 
#19

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 14:30
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

@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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 14:39
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).
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
Antwort Antwort
Seite 2 von 3     12 3      


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 00:12 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