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 1 von 2  1 2      
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.388 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 09:49
Tach,

wenn Du die 2010er Version gekauft hast, dann hast Du gewisse Chancen, dass du zusätzlich das Buch "Delphi 2010 Handbook" von Marco Cantu dazu erhalten hast - herunterzuladen bei Embarcadero bei deinen Downloads bzw in CodeCentral:
http://cc.embarcadero.com/Item/27613

Hier erklärt Marco u.a. die neue RTTI mit der Du auf die Properties zugreifen kannst. Du kannst auch die "alte" RTTI verwenden, dazu einfach mal die Unit TypeInfo einbinden und anschauen.

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 10:10
Auf Published-Property kann man auch schon mit der alten RTTI drauf zugreifen.

Man kann aber notfalls auch die Variablen als Array erstellen und dann über indizierte Property drauf zugreifen, hab aber auch den Vorteil alles über's Array ansprechen zu können.


Wenn du auf private Felder über die neue RTTI zugreifen willst, dann vergiß nciht, daß du dann etwas größere EXEn hast, da diese RTTI-Infos auch mit einkompilieren mußt. (deaktivieren der zugehörenden RTTI-Infos sollte man dann vermeiden, aber da hierdurch die Anwendungen nun einfacher gehackt werden können, ist sowieso egal)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Joerginger

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

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 10:12
Mal vorab Danke für die Wortspenden!

Introspection... gut zu wissen für weitere Projekte, aber einerseits weiss ich ja den Namen, den ich übergeben will, ich wills ja auch nicht durchiterieren, sondern einfach nur ein (bekanntes) Feld per Namen ansprechen (oder per Pointer oder what so ever). Und mit diesem Feld eben Sachen anstellen, wie z.B. ein := TXCreate oder einen Wert zuweisen. Und andererseits geht das so wie ich das verstehe nur bei public... Die Felder sind allerdings allesamt Private.

Wenn ichs direkt (siehe Beispiel) zuweise funktionierts ja ad hoc. Wenn ich aber diese Zuweisung aus Gründen der Lesbarkeit in eine eigene PROC packen will kann ich nicht auf das Feld zugreifen, weil ich eben nicht weiss WIE?

Was schon geklappt hat war, den ganzen String (aArt[iDX].OXID) als TXSString zu übergeben, in der Proc eine Variable TXSString zu basteln, die zu createn und mit dem Wert zu bestücken und hernach per := der übergebenen TXSString zuzuweisen. Halte ich aber für Grenzwertig und net sauber...

@Lemmy: Du setzt bei mir leider zuviel Wissen voraus Ich bin noch nicht so weit das alles zu kapieren...

@Himitsu: danke, aber WIE greife ich zu darauf... Das ist das was mir fehlt

greetz, Joerginger (A.K.A. Erwin)
  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, 10:48
Vielleicht hab ich auch zu kompliziert gefragt, ist ja noch zeitig des Morgens für mich...

Wenn ich eine procedure TUWAS(sStr:string); habe, kann ich mit TUWAS('juhu'); drauf zugreifen und habe 'juhu' im Zugriff. Ich kann sStr:=''; sagen, ich kann sStr:=sStr+'di'; schreiben und erhalte 'Juhudi' etc.

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?

Code:
    //Hier funktioniert das...
    aArt[iDX].OXID:=Article.create; //gar kein Problem
Ich will nur diesen Aufruf Create und die Wertzuweisung in eine extra Prozedur auslagern, damit ich nicht so eine große Aufrufende Prozedur habe... Und dazu müsste ich der aufgerufenen Prozedur doch sagen können, welches Feld ich beackern will???

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

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

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 10:55
Sicher geht das, Du musst halt die Werte als Parameter übergeben, das ganze SetLength()-, Create()- und Zuweisungs-Gedöns geschieht dann eben in dieser Prozedur.
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, 11:10
@DeddyH: ja, genau das ist es, ich will Parameter übergeben... Aber WIE?

Das habe ich, das funktioniert. Es wird in der Klasse Artikel (die wegen SOAP-Zugriff TRemotable sein muss!!! das "FELD" bzw. die Subklasse "OXID" kreiert und mit einem Wert befüllt...
Code:
  aArt[iDX].OXID:=TXSstring.Create;
  aArt[iDX].OXID.XSToNative('05848170643ab0deb9914566391c0c63');
und damit's lesbarer wird möchte ich gerne
Code:
  OXWrite('OXID',iDX,'05848170643ab0deb9914566391c0c63');
aufrufen können, wobei die Procedure OXWrite ja nix anderes machen soll als die 2 Zeilen oben zu ersetzen, und zu wissen, dass jetzt
aArt[iDX].OXID angesprochen werden soll.... Nur das krieg ich irgendwie nicht hin.

Ich würde einfach nur gerne den Feldnamen übergeben, den Index des Array und den Wert. Und nur daran scheiterts, da ich nicht weiss WIE ich den Feldnamen so übergeben kann, dass ich ihn mit dem (globalen) Array verbinden kann...

Wenn ich aArt{[DX].OXID als ganzes übergebe (nämlich gleich als TXSString definiert) kann ich zwar zugreifen, aber es erstellt mir die Subklasse irgendwo, aber nicht in meinem Array...

@Lenny: oja, lesen können wir voraussetzen, sogar Englisch. Aber wie Du richtig vermutet hast hab ich das Buch nicht, da ich mit einem gratis D7 programmiere und dieses Projekt für einen Bekannten auf seinem D2010 erstelle.

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

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

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 11:22
Kurzes Beispiel: gegeben sei die Klasse TPerson mit den Feldern Name und Vorname und ein dynamisches Array davon. Ursprungscode:
Delphi-Quellcode:
SetLength(Personen, Length(Personen) + 1);
Personen[High(Personen)] := TPerson.Create;
Personen[High(Personen)].Vorname := 'Hans';
Personen[High(Personen)].Name := 'Wurst';
SetLength(Personen, Length(Personen) + 1);
Personen[High(Personen)] := TPerson.Create;
Personen[High(Personen)].Vorname := 'Reiner';
Personen[High(Personen)].Name := 'Zufall';
SetLength(Personen, Length(Personen) + 1);
Personen[High(Personen)] := TPerson.Create;
Personen[High(Personen)].Vorname := 'Machmal';
Personen[High(Personen)].Name := 'Dietürzu';
Dann kann man das kürzen zu:
Delphi-Quellcode:
procedure AddPerson(const AVorname, AName: string);
begin
  SetLength(Personen, Length(Personen) + 1);
  Personen[High(Personen)] := TPerson.Create;
  Personen[High(Personen)].Vorname := AVorname;
  Personen[High(Personen)].Name := AName;
end;

...

AddPerson('Hans', 'Wurst');
AddPerson('Reiner', 'Zufall');
AddPerson('Machmal', 'Dietürzu');
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
Mikkey

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

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 11: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
 
#9

AW: Auf Klassenvariablen indiziert zugreifen?

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

AW: Auf Klassenvariablen indiziert zugreifen?

  Alt 22. Okt 2013, 13: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
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 06:45 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