AGB  ·  Datenschutz  ·  Impressum  







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

as-operator mit TList

Ein Thema von arkon · begonnen am 10. Jun 2009 · letzter Beitrag vom 15. Jun 2009
Antwort Antwort
arkon

Registriert seit: 15. Jul 2007
Ort: Berlin
7 Beiträge
 
#1

as-operator mit TList

  Alt 10. Jun 2009, 15:02
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!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: as-operator mit TList

  Alt 10. Jun 2009, 15:05
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]
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 Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: as-operator mit TList

  Alt 10. Jun 2009, 15:06
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. Records und keine Objekte
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
arkon

Registriert seit: 15. Jul 2007
Ort: Berlin
7 Beiträge
 
#4

Re: as-operator mit TList

  Alt 10. Jun 2009, 15:10
danke für die schnelle antwort!
aber bei nem harten cast
  result := TChVoc(Item1).coeff; sagt er "invalid typecast" wtf? notlösung wären natürlich objekte...
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: as-operator mit TList

  Alt 10. Jun 2009, 15:12
Wie fügst du die Einträge in die Liste? Ich denke da ist der Fehler.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
arkon

Registriert seit: 15. Jul 2007
Ort: Berlin
7 Beiträge
 
#6

Re: as-operator mit TList

  Alt 10. Jun 2009, 15:14
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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: as-operator mit TList

  Alt 10. Jun 2009, 15:26
Ist soundarray lokal in einer Methode definiert?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: as-operator mit TList

  Alt 10. Jun 2009, 15:34
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
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#9

Re: as-operator mit TList

  Alt 14. Jun 2009, 23:47
Hallo,

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

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: as-operator mit TList

  Alt 15. Jun 2009, 07:14
das PChVoc(Item1).coeff entspricht PChVoc(Item1)^.coeff, nur macht Delphi das ^ hier automatisch


PS: hier dereferenziert Delphi nicht automatisch! > PChVoc(Item1)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  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 09:35 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