AGB  ·  Datenschutz  ·  Impressum  







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

Array einer Klasse (TRemotable) an procedure geben

Ein Thema von Joerginger · begonnen am 28. Okt 2013 · letzter Beitrag vom 28. Okt 2013
Antwort Antwort
Joerginger

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

Array einer Klasse (TRemotable) an procedure geben

  Alt 28. Okt 2013, 10:03
Hallo Delphianer,

ich hab wieder mal ein (Verständnis)Problem, wie man einer Procedure ein Array einer Klasse übergeben kann...

Das hab ich (und es funktioniert auch, wobei es wurst ist ob ichs mittels for i löse oder for xy in):
Code:
procedure Kill_aUPD; //Befreit den Speicher von aUPD...

var
  upd:             Update;              //Klasse Update

begin
  for upd in aUpd do upd.Destroy;        //aUPD = Array of Update
  setLength(aUpd,0);
end;


procedure Kill_aArt;  //Befreit den Speicher von aArt

var
  art:             Article;             //Klassse Artikel

begin
  for art in aArt do art.Destroy;        //aART = Array of Artikel
  setLength(aArt,0);
end;
Diese (einzelnen) Routinen gibts für ca. 20 verschiedene Arrays, die sich eben nur durch den Inhalt, sprich - welche Klasse da reinkommt - unterscheidet. Können Artikel, Belege, Adressen, Gruppen, Updates etc. etc. sein...

Und - um das ganze schicker und wartbarer zu gestalten dacht ich mir: Schreibssu eine proc...
Da ich hier auch noch den Typ der Klasse (also Article oder Update übergeben müsste hab ich mir gedacht, machstes mit for i...

Code:
procedure OXKill(aA: xyType);  //Befreit den Speicher von einem beliebigen Array

var
  i:               integer; //Schelfchenvariable

begin
  for I := low(aA to high(aA) do aA[i].Destroy,
  setLength(aA,0);
end;
Da fehlt mir irgendwie der Plan, wie ich dann mittels
Code:
  OXKill(aUpd);
  OXKill(aArt);
ein beliebiges Array übergeben kann, damit das übergebene Array von Klasse XY platt ist...

Was muss ich als xyType angeben, damit der Compiler mich versteht und net so bockig ist mir Typverwechslungen zu unterstellen??? Da's wie in letzter Zeit fast immer um das unselige OXID Webservice geht sind die Klassen TRemotable (falls das wichtig ist).

Danke und GLG,

Erwin J.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Array einer Klasse (TRemotable) an procedure geben

  Alt 28. Okt 2013, 10:46
Ohne jetzt groß nachgedacht oder gar ausprobiert zu haben:
Delphi-Quellcode:
type
  TRemotableArray = array of TRemotable;

procedure ClearRemotables(var Remotables: TRemotableArray);
var
  i: integer;
begin
  for i := Low(Remotables) to High(Remotables) do
    Remotables[i].Free;
  Remotables := nil;
end;
Wie gesagt, ob es so funktioniert, kann ich nicht sagen, Versuch macht klug.
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
 
#3

AW: Array einer Klasse (TRemotable) an procedure geben

  Alt 28. Okt 2013, 10:58
Danke an DeddyH für den Ansatz. Und probiert hab ich weidlich, aber irgendwann dacht' ich mir: ich frag mal die Profis (die's vielleicht sogar wissen )

Wenn ich Deinen Code übernehme kömmt:
[DCC Fehler] OXBWOXID.pas(203): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
[DCC Fehler] OXBWOXID.pas(204): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen

wenn ich das VAR weglasse kömmt:
[DCC Fehler] OXBWOXID.pas(203): E2010 Inkompatible Typen: 'TRemArr' und 'Articles'
[DCC Fehler] OXBWOXID.pas(204): E2010 Inkompatible Typen: 'TRemArr' und 'Updates'

Da der Programmierstil von Dir so schön ist frag ich mal zwischendurch:
Code:
  setLength(Array,0);

  // ist gleichzusetzen mit

  Array := nil;


Und - nicht ganz unwesentlich zum Verständnis... Warum rufst Du nicht .Destroy sondern
Code:
  Array[i].Free;
auf??

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

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

AW: Array einer Klasse (TRemotable) an procedure geben

  Alt 28. Okt 2013, 11:05
Vermutlich hast Du Deine Arrays als array of Spezifische Klasse deklariert, das müsstest Du ändern auf den selbst deklarierten Typ TRemotableArray. Ggf. führt das aber dazu, dass Du explizit casten müsstest, wenn Du über das Array auf klassenspezifische Methoden oder Properties zugreifst. Den Aufwand kannst nur Du einschätzen. Ob Du die Länge eines dynamischen Arrays auf 0 setzt oder das Array nilst, kommt im Ergebnis auf dasselbe heraus, das ist eher eine Geschmacksfrage. Und zum Free verweise ich mal auf die Hilfe:
Zitat:
Rufen Sie Destroy nicht direkt auf. Verwenden Sie stattdessen Free. Die Methode Free überprüft, ob die Objekt-Referenz nicht bereits nil ist und ruft Destroy nur bei Bedarf auf.
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
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Array einer Klasse (TRemotable) an procedure geben

  Alt 28. Okt 2013, 11:19
[DCC Fehler] OXBWOXID.pas(203): E2010 Inkompatible Typen: 'TRemArr' und 'Articles'
[DCC Fehler] OXBWOXID.pas(204): E2010 Inkompatible Typen: 'TRemArr' und 'Updates'
Dann sind Articles und Updates nicht als TRemArr deklariert.

Da der Programmierstil von Dir so schön ist frag ich mal zwischendurch:
Code:
  setLength(Array,0);

  // ist gleichzusetzen mit

  Array := nil;
Auf nil setzen ist schneller, da das gleich in einen Aufruf zum Löschen der Inhalte des Arrays kompiliert werden kann, während bei SetLength erst geprüft werden muss welche Elemente gelöscht werden usw.

Und - nicht ganz unwesentlich zum Verständnis... Warum rufst Du nicht .Destroy sondern
Code:
  Array[i].Free;
auf??
Free prüft vorher, ob der Zeiger nil ist. Das steht auch in der Hilfe:
Zitat:
Rufen Sie Destroy nicht direkt auf. Verwenden Sie stattdessen Free. Die Methode Free überprüft, ob die Objekt-Referenz nicht bereits nil ist und ruft Destroy nur bei Bedarf auf.
http://docwiki.embarcadero.com/Libra...Object.Destroy
Zudem könnte sich dort auch etwas in neueren Delphiversionen ändern (ARC beim Entwickeln für Android mit Delphi ist ein Beispiel), so dass es keinen Sinn macht Destroy direkt aufzurufen.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Joerginger

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

AW: Array einer Klasse (TRemotable) an procedure geben

  Alt 28. Okt 2013, 11:58
Danke, grad wieder Einiges gelernt (Free und so...)...

Zum Hauptthema:
Code:
  Article = class(TRemotable) //Article wird von TRemotalbe abgeleitet
  private
    FOXID: TXSString;
    FOXSHOPID: TXSString;
genauso siehts mit Update, Order, User etc. aus. Immer Ableitungen von TRemotalbe...

und später dann kömmt (da ja ein einzelner Artikel nicht sehr sinnvoll hochzuladen ist
Code:
    Articles  = array of Article;
alternativ dazu werden dann eben Updates = array of Update und so weiter...

Meine Befürchtung ist natürlich jetzt, dass ich so ein Array (weil ja immer unterschiedlich) nicht wirklich übergeben kann?

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

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

AW: Array einer Klasse (TRemotable) an procedure geben

  Alt 28. Okt 2013, 12:06
Die Befürchtung trifft zu, das sind für Delphi unterschiedliche Typen. Wie schon gesagt wäre die Lösung, den selbstdefinierten Typ TRemotableArray zu verwenden, nur ist das ggf. mit div. Typecasts verbunden.
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
 
#8

AW: Array einer Klasse (TRemotable) an procedure geben

  Alt 28. Okt 2013, 12:15
Danke, kapiert...

Ich fühl mich nur immer so blöde dabei, wenn ich 20 Routinen quasi kopieren muss (und darin nur eine Variable ändere), statt eine Routine zu pflegen die eben die Variable als Parameter bekommt

Nach mittlerweile 2 großen Umstellungen in dem Sumpf (und auch deshalb, weil das WebSeitige Modul sich immer wieder noch ändern kann und ich nicht jedesmal das von Delphi erzeugte Service nachbearbeiten will ) enscheide ich mich für die Lösung der 20 Einzelmodule...

Greetz, Erwin J.
  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 23:04 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