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
NormanNG

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

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
 
#2

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
NormanNG

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

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
 
#4

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.659 Beiträge
 
Delphi 12 Athens
 
#5

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
 
#6

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.659 Beiträge
 
Delphi 12 Athens
 
#7

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
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#8

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 16:58
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?
Result ist eine ganz normale Variable, diese verweist auf ein Object(Instanz einer Klasse) die in dieser Funktion erzeugt wurde.

Weil den Wert / Status von diesem Result übergebe ich doch mittels
Code:
aArt[iDX].OXID:=oxWrite('bla bla');
ungespitzt an mein Array weiter.
Du wählst über iDX ein Artikelobjekt aus deinem Array und weist einem Feld dieses Artikelobjekts die Adresse des erzeugten Feldobjekts zu.
Hier wird nur die Adresse kopiert, Result und aArt[iDX].OXID verweisen auf das selbe Objekt, Result wird nicht mehr benötigt.
Für die Freigabe des Objektes, auf das OXID verweist, ist ab jetzt das Artikelobjekt verantwortlich. Das hast du hoffentlich im Destructor Destroy berücksichtigt.

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
Natürlich existieren dann in der Summe 3000 Artikelobjekte und jedes hat seine eigenen Feldobjekte.

@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.
Wenn du nicht einzeln freigeben willst, speichere die Artikelobjekte in einer TObjectList, die kümmert sich um die Freigabe (wenn sie selbst freigegeben wird). Wo wird das Array den eigentlich benötigt?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

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
Antwort Antwort


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 16:03 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-2025 by Thomas Breitkreuz