Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi as-operator mit TList (https://www.delphipraxis.net/135422-operator-mit-tlist.html)

arkon 10. Jun 2009 15:02


as-operator mit TList
 
he leute, kleines problemchen. ich hab seit einiger zeit mal wieder mein delphi ausgestaubt und bin mir nicht so ganz sicher mit typenumwandlungen. besser gesagt: ich bin anderer meinung als der compiler.

Delphi-Quellcode:
  TChVoc = record
    filename: string;
           ...
    coeff: extended;
  end;
schöner typ. jetzt will ich den in eine liste vom typ TList einspeichern und sortieren lassen. klappt alles wunderbar, nur beim sortieren zickt er rum:

Delphi-Quellcode:
function TForm1.compvoc(Item1, Item2: Pointer): integer;
begin
  result := (Item1 as TChVoc).coeff;
end;
will er nicht, "as" ist auf diesen datentyp nicht anwendbar. wie bitte? as ist doch genau dafür da, das der compiler das einfach SCHLUCKT und nicht rummeckert?

noch ne kleine frage am rande: ich hab diese liste und will mir dann item raussuchen und darauf rumarbeiten. da die TChVoc-dinger in einem array liegen kann ich an den ursprung nicht heran. ich suche mir einen eintrag raus, krieg einen pointer zurück, und jetzt? kann ich mir einfach eine variable vom typ TChVoc nehmen, den pointer da drauf knallen und fröhlich daran rumwerkeln? ist das dann eine kopie der daten oder immer noch ein pointer, also müsste ich die daten manuell zurück in das array schreiben?

skizze wenn es zu konfus war:

array of TChVoc -> TList gefüllt mit TChVoc-Pointern -> ?? TChVoc-Variable? weg zurück?

danke schonmal im voraus!

DeddyH 10. Jun 2009 15:05

Re: as-operator mit TList
 
Das ginge, wenn das kein Record, sondern eine Klasse wäre. Ansonsten versuch es mal mit einem harten Cast.
Delphi-Quellcode:
function TForm1.compvoc(Item1, Item2: Pointer): integer;
begin
  result := TChVoc(Item1).coeff;
end;
[edit] Ich bin jetzt nicht sicher, aber ich glaube, diese Klasse muss dann auch noch von TPersistent abgeleitet sein, diese Angabe ist allerdings ohne Gewähr. [/edit]

Bernhard Geyer 10. Jun 2009 15:06

Re: as-operator mit TList
 
Zitat:

Zitat von arkon
will er nicht, "as" ist auf diesen datentyp nicht anwendbar. wie bitte? as ist doch genau dafür da, das der compiler das einfach SCHLUCKT und nicht rummeckert

TList arbeitet mit pointern und da ist "as" und "is" nicht möglich. Entweder hier hart mit Cast arbeiten oder eine TObjectList nehmen. Diese Arbeitet mit TObjects und dort geht "as" und "is".


Grrrr. :wall: Records und keine Objekte :wall:

arkon 10. Jun 2009 15:10

Re: as-operator mit TList
 
danke für die schnelle antwort!
aber bei nem harten cast
Delphi-Quellcode:
  result := TChVoc(Item1).coeff;
sagt er "invalid typecast" wtf? notlösung wären natürlich objekte...

Bernhard Geyer 10. Jun 2009 15:12

Re: as-operator mit TList
 
Wie fügst du die Einträge in die Liste? Ich denke da ist der Fehler.

arkon 10. Jun 2009 15:14

Re: as-operator mit TList
 
Delphi-Quellcode:

  soundarray: array of TChVoc;

...

  for i := 0 to length(soundarray)-1 do
    VocArray.Add(@soundarray[i]);
aber das wäre ja ein laufzeitfehler.

Bernhard Geyer 10. Jun 2009 15:26

Re: as-operator mit TList
 
Ist soundarray lokal in einer Methode definiert?

himitsu 10. Jun 2009 15:34

Re: as-operator mit TList
 
Zitat:

Zitat von arkon
Delphi-Quellcode:
  TChVoc = record
    filename: string;
           ...
    coeff: extended;
  end;

function TForm1.compvoc(Item1, Item2: Pointer): integer;
begin
  result := (Item1 as TChVoc).coeff;
end;

abgesehn davon, das coeff eh nicht dem Result zugewiesen werden kann
Delphi-Quellcode:
Result{Integer} := .coeff{Extended};
Delphi-Quellcode:
type PChVoc = ^TChVoc;
  TChVoc = record
    filename: string;
           ...
    coeff: extended;
  end;

result := PChVoc(Item1).coeff;

die Verlgeichs-Funktion compvoc will gern das Ergebnis und nicht den Wert:
Delphi-Quellcode:
function TForm1.compvoc(Item1, Item2: Pointer): integer;
begin
  if PChVoc(Item1).coeff < PChVoc(Item2).coeff then
    Result := -1
  else if PChVoc(Item1).coeff > PChVoc(Item2).coeff then
    Result := 1
  else
    Result := 0;
end;

xZise 14. Jun 2009 23:47

Re: as-operator mit TList
 
Hallo,

müsste es nicht eigentlich TChVoc(Item1^) heißen? Oder ohne cast, wenn man Item1 und Item2 als PChVoc definiert.

MfG
xZise

himitsu 15. Jun 2009 07:14

Re: as-operator mit TList
 
das PChVoc(Item1).coeff entspricht PChVoc(Item1)^.coeff, nur macht Delphi das ^ hier automatisch


PS: hier dereferenziert Delphi nicht automatisch! > PChVoc(Item1)


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