Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi untypisierter pointer (https://www.delphipraxis.net/35254-untypisierter-pointer.html)

Jan 4. Dez 2004 14:19


untypisierter pointer
 
Hallo DPler,
ich habe in meinem Programm ein TListview, dessen untereigenschaft tlistitem die Eigenschaft "Data" hat, welches ein untypisierter Zeiger auf ein Beliebiges Objekt ist. Über diese Eigenschaft habe ich jetzt die einzelnen Einträge meines Datenarrays verlinkt, (Array of Tstringlist) habe jetzt also einen untypisierten pointer auf ein Tstringlist Objekt. Jetzt muss ich zwei Dinge herausfinden:
Wie kann ich das TStringlist Objekt auf nil setzen, und nicht den pointer, ohne dass ich eine Exception bekomme? Und 2.: gibt es eine Möglichkeit über den Zeiger auf das TStringlist Objekt irgendwie eine referenz auf den Array of Tstringlist zu bekommen, welcher das TStringlist Objekt beherbergt?
Danke an alle die sich die Zeit nehmen das hier zu lesen!
Gruß
Jan

paresy 4. Dez 2004 14:56

Re: untypisierter pointer
 
Zitat:

Wie kann ich das TStringlist Objekt auf nil setzen, und nicht den pointer, ohne dass ich eine Exception bekomme?
wenn du das objekt im array auf nil setzt, quasi zerstörst... dann erzeugt delphi beim zugreifen über die data property ne exception weil das objekt nicht mehr verfügbar ist.

du müsstest also auch die data property auf NIL setzten und dann mit assigend(data) abfragen

Zitat:

gibt es eine Möglichkeit über den Zeiger auf das TStringlist Objekt irgendwie eine referenz auf den Array of Tstringlist zu bekommen, welcher das TStringlist Objekt beherbergt?
nicht dass ich wüsste bzw den sinn darin sehen würde



poste mal nen code beispiel... dann ist es immer einfach tipps zu geben.

grüße paresy

fiasko 4. Dez 2004 17:13

Re: untypisierter pointer
 
Hallo,

Zitat:

Zitat von Jan
Und 2.: gibt es eine Möglichkeit über den Zeiger auf das TStringlist Objekt irgendwie eine referenz auf den Array of Tstringlist zu bekommen, welcher das TStringlist Objekt beherbergt?


Delphi-Quellcode:
type
  TMyFunnyArrayType = array of TStringList;
  PMyFunnyArrayPointer = ^TMyFunnyArrayType;

//...

     PMyFunnyArrayPointer(lv.items[1].data)^
//   <------------------------------------->
//  Das ist jetzt vom Typ array of TStringList
Es kommt jetzt darauf an wie du das Objekt in das data geschrieben hast. Wenn dort ein Zeiger auf ein TStringList steht klappt das wie oben, wenn du einfach das Objekt umgecastet und reingeschrieben hast müßte folgendes gehen:


Delphi-Quellcode:
     TMyFunnyArrayType(lv.items[1].data)
//   <------------------------------------->
//  Das ist jetzt vom Typ array of TStringList
Für einfach native Typen (die nur aus einem Schlüsselwort bestehen) kann man sich diese indirektionsstufe mit zusätzlichen Typen auch sparen.

Jan 5. Dez 2004 17:35

Re: untypisierter pointer
 
Hallo Paresy!

Also du hast schon recht, das gibt eine exception, wenn man einen pointer dereferenziert, der auf ein nichtmehr vorhandenes Objekt zeigt.
Aber ich hatte schlicht und einfach die Zuweisung des Pointers "data" falsch gemacht, so dass ein löschen eine exception hervorgerufen hat. Habe das aber durch ausführliches Beschäftigen mit pointern alles begradigen können.
Das mit dem Zeiger auf den Array hat den Sinn, dass ich eine Prozedur habe, welche einen übergebenen array in ein Tlistview schreibt. Nun kann es aber vorkommen, dass der array nur eine auswahl von pointern auf objekte vom typ tstringlist innerhalb eines anderen arrays ist. Und ich will innerhalb dieser prozedur aber herausfinden wie groß der array ist, in dem die objekte und nicht die pointer enthalten sind.

Eine weitere Verwendung ist, dass ich innerhalb des Tlistviews ein tlistitem löschen will. Es soll dann auch das objekt vom typ tstringlist gelöscht werden, auf welches der pointer "Data" von dem tlistitem zeigt. Dieses tstringlist objekt befindet sich in einem array of tstringlist.
nachdem ich das element des arrays gelöscht habe, will ich aber auch die länge des arrays aktualisieren, daher brauche ich einen pointer auf den array.


Hallo fiasko!

Das codesegment was du da verfasst hast wandelt doch einen untypisierten Zeiger "data" in einen zeigre vom typ tstringlist um, oder irre ich?
Wenn aber doch "data" ein Zeiger auf ein objekt vom typen tstringlist ist, was habe ich dann gewonnen? ich will ja einen zeiger auf ein anderes objekt haben (auf das übergeordnete array von dem tstringlist objekt), nicht einen typisierten zeiger auf das selbe objekt.
Kann natürlich auch sein, dass ich unfug rede, aber ich kann das hier nicht ausprobieren, werde das machen, sobald ich zuhause bin.



Danke euch beiden vielmals dass ihr euch damit befasst habt!
Gruß
Jan

fiasko 5. Dez 2004 19:10

Re: untypisierter pointer
 
Hallo,

Zitat:

Zitat von Jan
Das codesegment was du da verfasst hast wandelt doch einen untypisierten Zeiger "data" in einen zeigre vom typ tstringlist um, oder irre ich?

Nein, er macht daraus ein array of TStringList.

Zitat:

Zitat von Jan
ich will ja einen zeiger auf ein anderes objekt haben (auf das übergeordnete array von dem tstringlist objekt), nicht einen typisierten zeiger auf das selbe objekt.

Hmm, was meinst du denn mit übergeordbete array von dem TStringList Objekt :gruebel:? Ich glaub ich hab noch nicht richtig kapiert worauf du deinen Pointer haben möchtest :-) ...

Jan 7. Dez 2004 13:37

Re: untypisierter pointer
 
Hallo Fiasko!
Ich hab einen Array of tstringlist, der eine Filmliste speichert. Die einzelnen tstringlists speichern also jeweils einen Film.
Ich habe jetzt einen Zeiger auf einen dieser Filme, will aber über diesen Zeiger irgendwie an einen Zeiger auf den Array of tstringlist kommen, in dem die Filme gespeichert sind, damit ich dort auslesen kann, wieviele Filme ich in der Filmliste habe.
Gruß
Jan

fiasko 7. Dez 2004 13:41

Re: untypisierter pointer
 
Hallo,

das geht so nicht. Du kannst nicht schauen wo es überall einen Zeiger auf dein Objekt gibt, du mußt dir also selber irgendwo dein array of TStringList speichern.

runger 7. Dez 2004 13:55

Re: untypisierter pointer
 
Hallo,

was bitte schön ist ein untypisierter Zeiger?
Gibts auch typisierte Zeiger?
Der Ausdruck ist schon in sich Quatsch!

Rainer

Muetze1 7. Dez 2004 14:03

Re: untypisierter pointer
 
Moin!

Zitat:

Zitat von runger
Hallo,

was bitte schön ist ein untypisierter Zeiger?
Gibts auch typisierte Zeiger?
Der Ausdruck ist schon in sich Quatsch!

Rainer

Bitte:

Pointer = untypirisierter Zeiger - ein Zeiger auf Daten unbestimmten Typs und daher kann man auch nicht sagen wie gross die Daten sind auf die der Pointer zeigt. Daher kann man auch schlecht mit New() eine Variable des Typs Pointer anlegen lassen - man muss die Grösse angeben.

PChar, PInteger, einfach ein Zeiger auf einen Typen: ^typ = typirisierter Zeiger. Wenn man diesen nutzt weiss der Compiler wie gross die Daten sind auf die der Zeiger zeigt und kann daher u.a. mit einem einfachen New() genügend Speicher reservieren.

Und nun sag mir was daran Quatsch ist und was es daran nicht geben sollte...

MfG
Muetze1

fiasko 7. Dez 2004 14:05

Re: untypisierter pointer
 
Hallo,

Zitat:

Zitat von runger
was bitte schön ist ein untypisierter Zeiger?
Gibts auch typisierte Zeiger?

Ja gibt es. Ein PChar ist ein typisierter Zeiger. Wenn man z.B. typisierte Zeiger inkrementiert/dekrementiert landet man "hinter" dem vorherigen Element, und nicht nur ein Byte weiter. Außerdem muß man sie nicht casten :-)

Zitat:

Zitat von runger
Der Ausdruck ist schon in sich Quatsch!

Heute wohl mit dem falschen Bein aufgestanden?! Der Ausdruck an sich kann nicht quatsch sein, da "typirisert" und "Zeiger" laut Duden nix miteinander zu tuhen haben (:arrow: sich auch nicht widersprechen) :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 Uhr.
Seite 1 von 3  1 23      

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