Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einführung in Pointer (https://www.delphipraxis.net/43704-einfuehrung-pointer.html)

Khabarakh 7. Apr 2005 15:48

Re: Einführung in Pointer
 
Zitat:

Zitat von OH
Ein PChar ist ein Zeiger auf einen nullterminierten String mit Zeichen des Typs Char. Jeder der drei Zeichentypen besitzt einen integrierten Zeigertyp:

PChar ist ein Zeiger auf einen nullterminierten String mit 8-Bit-Zeichen.
PAnsiChar ist ein Zeiger auf einen nullterminierten String mit 8-Bit-Zeichen.
PWideChar ist ein Zeiger auf einen nullterminierten String mit 16-Bit-Zeichen.

PChars bilden mit kurzen Strings den ursprünglichen String-Typ von Object Pascal. Sie wurden als Kompatibilitätstyp zur Sprache C und zur Windows-API eingeführt.

Das erklärt den PChar doch ziemlich gut.

El Cattivo 7. Apr 2005 16:13

Re: Einführung in Pointer
 
Ja, ok... Aber darum gings mit jetzt eigentlich nicht haupsächlich.

SirThornberry 7. Apr 2005 16:14

Re: Einführung in Pointer
 
was genau hast du denn jetzt noch nicht verstanden? also welchen Operator(@ ^ ...) oder welche funktion (new, dispose...)

Pseudemys Nelsoni 7. Apr 2005 16:17

Re: Einführung in Pointer
 
Ich glaube er versteht nicht, wo und wann man pointer (verkettete listen hier ausgenommen) benutzen sollte bzw wann das von Vorteil ist. Ich verstehs naemlich auch nicht, ich bin immer ohne ausgekommen.

atreju2oo0 7. Apr 2005 16:32

Re: Einführung in Pointer
 
Mal als Beispiel:

Du willst Kundendaten speichern, und weißt nicht genau wieviele das werden.
Ein super Fall um Listen zu erklären ;)

Als erstes mal muss man den Typ deklarieren:

Delphi-Quellcode:
PMyDaten=^TMyDaten;
TMyDaten=record
  name:string;
  alter:integer;
  .
  .
  .
  next:PMyDaten;
 end;
Als nächstes braucht man den Anker/Wurzel.
Dieser wird beim Start des Progs einmal erstellt und danach NIE mehr angerühert, ausser beim beenden!

Delphi-Quellcode:
var MyDaten:PMyDaten;


new(MyDaten);
MyDaten.next:=nil;
Damit haste alles schonmal gut vorbereitet um die Liste nun zu füllen...
Wir stellen uns einfach mal vor wir haben ein Formular, wo die Daten in edits und so richtig eingegeben
wurden. Dann ist unten noch nen Knopf "Daten hinzufügen"

Delphi-Quellcode:
procedure Datenhinzufügen;
var help:PMyDaten // den Pointer nehmen wir um uns durch die Liste zu hangeln
begin
help:=MyDaten; // jetzt zeigen help und mydaten auf den selben Speicherbereich.
while help.next<>nil do //um zum letzten Element der Liste zu kommen gehen wir solange eins weiter bis das nachfolgende NIL ist.
  help:=help.next

// Jetzt haben wir mit help also einen Pointer der auf den Speicherpplatz des letzten Elements der Liste zeigt.
// Jetzt können wir das neue Element anhängen

new(help.next) // New stellt Speicherbereich für ein neues Element her und help.next zeigt automatisch auf dieses.
// Jetzt müssen wir noch auf das neue Element draufzeigen, da wir ja noch beim vorletzten hängen
help:=help.next;
// Na jetzt kommt nur noch Schreibarbeit: Werte eintragen und next auf nil setzten

help.Name:=Ich;
help....
help.next:=nil;

end;

// Das wars dann auch schon!

SirThornberry 7. Apr 2005 16:39

Re: Einführung in Pointer
 
Liste der Anhänge anzeigen (Anzahl: 1)
Beispiel für Pointer.
Du hast eine Musiksoftware und möchtest natürlich zu jedem Lied das ID3-Tag anzeigen.
Jetzt wäre es speicherverschwendung wenn du 10 Listen hast in denen jeweils ein paar Lieder gleich sind das du in all diesen Listen das ID3Tag speicherst. Lösung ist das man eine Große Liste im Speicher hat wo alle Informationen zu der Datei gespeichert werden und die Playlisten sind dann nur noch Listen mit Pointer welche auf die Informationen zeigen (Bild zu diesem beispiel im Anhang, die Zahlen 1 bis 14 stellen dabei die Pointer(adressen) dar)

El Cattivo 7. Apr 2005 17:28

Re: Einführung in Pointer
 
Ok, danke! Ich habt mir sehr geholfen. Mein Denkfehler war glaub ich, dass ich dachte jeder gespeicherte Wert bräuchte einen eigenen Pointer um die einzelenen Werte aufrufen zu können. Aber man lässt dann wohl in dem Bsp. von atreju2oo0 die zwei Zeiger durchhangeln und an der Stelle stoppen wo der Wert auf den gezeigt wird ein bestimmter ist. Ich dachte durch den Befehl "help:=help.next;" würde die ehemals in help gespeicherte Information zur Speicherleiche werden. Das erstellen einer solchen Kette könnte man ja so darstellen:
http://mitglied.lycos.de/ovittacel/l...sachen/bla.JPG
Hier beim zweiten Element sind noch für alle Elemente Adressen vorhanden. Aber MyDaten zeigt doch immer auf das erste Element und help und help^.next gehen immer weiter. Wie kann man dann (wenn man jetzt nur die Namen der Kunden speichert) bei dem fünfen, oder sechsten Element angekommen, wieder auf den ersten help^.name zugreifen? einfach durch
Delphi-Quellcode:
help:=MyDaten;
while help.next<>help^.name do
help:=help.next
Ist dann das erste help das gleiche wie beim erstellen der Kette? Wenn das so wäre, dann hätte ichs endlich verstanden :-D
Und das Pointer Speicherplatz spaaren hab ich jetzt auch begriffen :wink: .

DGL-luke 8. Apr 2005 15:38

Re: Einführung in Pointer
 
*räusper*

da ich auf luckies seite nichts zu pointern gefunden habe, frag ich hier:

Delphi-Quellcode:
//globale vars
var currentbox:^TListBox;

procedure TForm1.LBbeforeMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
currentbox:=@sender;

end;

procedure TForm1.deleteClick(Sender: TObject);
begin
currentbox^.DeleteSelected;
end;
wieso wirft mir das ne AV??

Pseudemys Nelsoni 8. Apr 2005 15:57

Re: Einführung in Pointer
 
Weil du "currentbox" keinen Speicher zugewiesen hast (New())

DGL-luke 8. Apr 2005 16:20

Re: Einführung in Pointer
 
oh * mein * gott * so * ein * dummer * anfängerfehler *

(sich bei jedem stern das geräusch vorstellen, das ein auf eine hölzerne tischplatte aufprallender kopf erzeugt)

EDIT: es geht immer noch nicht.... ich rufe new(currentbox) im formcreate und im mousemove( wo der pointer ne adresse bekommt, siehe oben) auf. :pale:

EDIT2: prinzipiell müsste das aber funktinieren, oder? ich missverstehe da nicht die funktion von pointern?!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:55 Uhr.
Seite 2 von 4     12 34      

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