Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Objekte zu einer Stringliste bearbeiten (https://www.delphipraxis.net/165308-objekte-zu-einer-stringliste-bearbeiten.html)

idefix2 22. Dez 2011 23:12

Objekte zu einer Stringliste bearbeiten
 
Hallo, ich steh wieder einmal völlig auf dem Schlauch.

Ich habe eine Stringliste Paare und zu dieser Stringliste Objekte vom Typ Tpaar

Delphi-Quellcode:
type
TPaar=class(TObject)
  pEndzeit: Tdate;
  pLevel: byte  
  end;

var
Paare: TStringlist;
Paar: Tpaar;
Symbol: string;
pi: integer;
...
begin
...
Paar:=Tpaar.Create; pi:=Paare.AddObject(symbol,Paar)
...
Bis daher ist alles klar. Jetzt würde ich gerne auf die Daten eines solchen Paares zugreifen:

Delphi-Quellcode:
with Paare.Objects[pi] as Tpaar do
....
Da meckert der Compiler: Operator ist auf diesen Operandentyp nicht anwendbar. Wie kann ich sonst auf meine Objekte vom typ TPaar zugreifen?
Delphi-Quellcode:
with Tpaar(Paare.Objects[pi]) do
geht genausowenig, das hatte ich ursprünglich geschrieben.

omata 22. Dez 2011 23:17

AW: Objekte zu einer Stringliste bearbeiten
 
Vielleicht so...
Delphi-Quellcode:
var ItemObject:TObject;
    Paar:TPaar;
begin
  ItemObject:=Paare.Objects[pi];
  if ItemObject is TPaar then begin
    Paar:=ItemObject;
    Paar.pEndzeit:=Now;
  end;
end;
Tipp: WITH braucht man nie

idefix2 22. Dez 2011 23:47

AW: Objekte zu einer Stringliste bearbeiten
 
Delphi-Quellcode:
Paar:=Tpaar(Paare.Objects[pi]);
with Paar do
Danke, so geht es tatsächlich (und da kann man sich das with dann natürlich auch sparen). Ich bin gar nicht auf den Gedanken gekommen, dass das Problem etwas mit der with Anweisung zu tun haben könnte. Warum der Compiler im with kein as und keinen Typecast zulässt, verstehe ich eigentich nicht (und möchte hier auch keine Grundsatzdiskussion darüber führen, ob man with verwenden darf oder soll oder warum nicht - ich finde, es ist in manchen Fällen ein sehr praktisches Sprachelement, speziell wenn der Record oder hier die Klasseninstanz Element eines Arrays ist oder sonstwie kompliziert adressiert wird, aber natürlich nur, wenn es funktioniert).

Ich habe jetzt noch einmal die Delphi Hilfe überprüft, da ist bei der Dokumentation der with Anweisung keine derartige Einschränkung zu finden.

Sir Rufo 22. Dez 2011 23:49

AW: Objekte zu einer Stringliste bearbeiten
 
da gibt es kein Problem, setze einfach mal Klammern um den as Ausdruck ;)

idefix2 23. Dez 2011 00:05

AW: Objekte zu einer Stringliste bearbeiten
 
Hab ich gleich probiert, funktioniert aber genausowenig mit Klammern um den as-Ausdruck.

Sir Rufo 23. Dez 2011 01:39

AW: Objekte zu einer Stringliste bearbeiten
 
Das sollte eigentlich so funktionieren
Delphi-Quellcode:
with ( Paare.Objects[pi] as Tpaar ) do

idefix2 23. Dez 2011 07:43

AW: Objekte zu einer Stringliste bearbeiten
 
Wie im Post 5 geschrieben: funktioniert auch mit Klammern nicht, gleiche Fehlermeldung.
Und
Delphi-Quellcode:
with Tpaar(Paare.Objects[pi])
geht auch nicht, da kann es nicht an fehlenden Klammern liegen.

Bummi 23. Dez 2011 07:49

AW: Objekte zu einer Stringliste bearbeiten
 
mmhhh .... sehe ich zum ersten mal dass es da Probleme geben soll, hier D2010 gibt es kein Problem damit.

idefix2 23. Dez 2011 08:59

AW: Objekte zu einer Stringliste bearbeiten
 
Liste der Anhänge anzeigen (Anzahl: 2)
Das Ding treibt mich zum Wahnsinn. Mit dem with hat das Problem doch nichts zu tun.

Delphi-Quellcode:
Paar:=TPaar(Paare.Objects[pi]);
Fehlermeldung: Operator oder Semikolon fehlt
Delphi-Quellcode:
Paar:=Paare.Objects[pi] as TPaar;
Fehlermeldung: Operator ist auf diesen Operandentyp nicht anwendbar

Bin für jeden Hinweis dankbar.

Sir Rufo 23. Dez 2011 09:08

AW: Objekte zu einer Stringliste bearbeiten
 
kann es sein dass TTrade auch eine Property Paare hat?

Christian Seehase 23. Dez 2011 12:49

AW: Objekte zu einer Stringliste bearbeiten
 
Moin idefix,

probier' doch mal die Variable pi anders zu benennen.
Vielleicht kommt der Compiler da ins Stolpern, denn so heisst ja auch die Konstante für die Zahl PI.

idefix2 23. Dez 2011 17:44

AW: Objekte zu einer Stringliste bearbeiten
 
Zitat:

kann es sein dass TTrade auch eine Property Paare hat?
nein, alle Properties von TTrade beginnen mit einem kleinen t (vorbeugend, damit in einem with-Statement keine Verwechslungen möglich sind :roll:

Zitat:

probier' doch mal die Variable pi anders zu benennen.
Habe pi auf pidx umgetauft - gleiches Ergebnis.

:evil:

DeddyH 23. Dez 2011 18:03

AW: Objekte zu einer Stringliste bearbeiten
 
Mich irritiert, dass der Compiler Paar für einen String hält. Außerdem scheint das "end." am Dateiende zu fehlen (es sei denn, es handelt sich um einen Folgefehler, da kommen ja auch schon einmal die komischsten Meldungen).

idefix2 23. Dez 2011 18:57

AW: Objekte zu einer Stringliste bearbeiten
 
Danke, jetzt habt ihr mich doch noch auf die Spur gebracht, man kann es wirklich nie schlau genug machen. Sir Rufo hatte eigentlich schon die richtige Idee, und dank DeddyH's
Zitat:

Mich irritiert, dass der Compiler Paar für einen String hält
hab ich es jetzt (glaube ich, muss es noch ausbessern, aber das wars wohl).

Eben zur Vermeidung von derartigen Mehrdeutigkeiten habe ich allen Properties von TTrade ein t vorgesetzt, und war deshalb ganz sicher, dass mir da nichts passieren kann:

Delphi-Quellcode:
 
TTrade = class(TObject)
  tPaar: string;
  tStartzeit, tEndzeit: TDate; //Aktueller Trade
  tLevel: byte;
  tKaufen: boolean;
  tLot: real;
  tKaufkurs: real;
  tVkkurs: real;
  tErfolg: real;
  end;
und jetzt gibt es erst recht eine Property tPaar und einen Klassennamen TPaar.
:wall:

Furtbichler 23. Dez 2011 19:05

AW: Objekte zu einer Stringliste bearbeiten
 
Zitat:

Zitat von idefix2 (Beitrag 1142942)
...vorbeugend, damit in einem with-Statement keine Verwechslungen möglich sind :roll:

Gerade deshalb soll man auf 'WITH' verzichten. Muss man nicht, sollte man aber.

Es schadet doch nicht, den Objektnamen voranzustellen. im Gegenteil, man weiß gleich, wer gemeint ist.

Geschütze d.h. nicht sichtbare Feldnamen wird ein 'f' vorangestellt. Ansonsten hüte dich vor Präfixen, außer bei Typen, Exceptions und Interfaces.

idefix2 23. Dez 2011 19:40

AW: Objekte zu einer Stringliste bearbeiten
 
Zitat:

Gerade deshalb soll man auf 'WITH' verzichten.
Das musste jetzt natürlich kommen. Bloss dürfte man dann auch keine Klassenmethoden programmieren, weil jede Klassenmethode beinhaltet ein implizites with.

Zitat:

Es schadet doch nicht, den Objektnamen voranzustellen
Wenn das Objekt ein Array-Element ist, kann es sogar der Performance schaden (meistens nicht wichtig, u.U. aber doch), weil bei jedem Zugriff eine neuerliche Adressberechnung gemacht wird. Bei Verwendung von with sollte der Compiler wenn möglich die Basisadresse in einem CPU-Register behalten.

Zitat:

Ansonsten hüte dich vor Präfixen, außer bei Typen, Exceptions und Interfaces.
Warum? Vor dem präfix t werde ich mich in Zukunft sicher hüten, da kann wirklich leicht etwas passieren. Bei Exceptions und Interfaces halte ich die Gefahr eines Namenskonflikts für eher gering - werde sie aber in Zukunft natürlich im Hinterkopf behalten. Von diesen Sonderfällen abgesehen finde ich, dass die Verwendung von Präfixen ein Programm in der Regel deutlich lesbarer macht.

Sir Rufo 23. Dez 2011 20:21

AW: Objekte zu einer Stringliste bearbeiten
 
ei jo, vor allem weil Delphi bei der CodeCompletion für Variablen-Felder (bei Properties) in einer Klasse ein F (=Field) verwendet.

Ich versuche folgende Logik bei der Verwendung zu benutzen:
Delphi-Quellcode:
type
  TFoo = class
  private
    fMyValue : string;
  public
    procedure FooMethod;
    property MyValue : string read fMyValue write fMyValue;
  end;

implementation

ressourcestring
  sMyValue = 'MyValue';

const
  cMyValue = 'MyValue';

var
  gMyValue : string; // unit-global Variable

procedure TFoo.FooMethod;
var
  lMyValue : string; // local Variable
begin
  fMyValue := cMyValue;
  lMyValue := cMyValue;
  gMyValue := cMyValue;
end;
Aber als Präfix das t zu verwenden kam mir eigentlich noch niemals in den Sinn ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 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