Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zu Zeigern (https://www.delphipraxis.net/62121-frage-zu-zeigern.html)

delphien 31. Jan 2006 09:44


Frage zu Zeigern
 
Hallo,

Ich habe einen Zeiger, der auf den Typ TEdit zeigt:

Delphi-Quellcode:
var zeiger: ^pointer;
    ActiveMemo:TEdit;

zeiger := pointer(ActiveMemo);
Wie kann ich jetzt auf den Text von TEdit zugreifen ?
Ich weiß, daß man es anders machen kann, aber ich möchte
mich ein bißchen mit Zeigern beschäftigen.

Danke !

Gruss
DELPHIEN

Muetze1 31. Jan 2006 09:56

Re: Frage zu Zeigern
 
Deine Deklaration von "zeiger" ist ein Zeiger auf ein Zeiger. Pointer ist schon ein Zeiger und mit dem ^ deklarierst du einen Zeiger auf einen Zeiger. Da du aber nun keinen Speicher alloziierst für deinen Zeiger (auf den gezeigt wird), wird der Verweis auf den Inhalt auch schon hinfällig sein. Und wenn du dann noch auf ein TEdit verweist, dann ist dieses intern auch ein Zeiger - somit hast du dann einen Zeiger, der auf einen Zeiger zeigt welcher wiederrum auf Instanzenzeiger zeigt, welcher auf die TEdit Instanz im Speicher zeigt. Da du dafür mindestens 2x Platz anlegen müsstest für die Zeiger, wird das nicht hinhauen.

Delphi-Quellcode:
Var
  Zeiger: Pointer;
  ActiveEdit: TEdit;

Begin
  // ActiveEdit sollte hier schon existieren

  Zeiger := @ActiveEdit; // Nun zeigt Zeiger auf den Speicherplatz wo ActiveEdit liegt. ActiveEdit ist aber auch nur ein Zeiger der auf die Instanz von TEdit zeigt.

  TEdit(Zeiger^).Text := 'Teschd';
End;

delphien 31. Jan 2006 10:35

Re: Frage zu Zeigern
 
vielen dank, damit hast Du mir schon sehr geholfen.
Müßte ich das für TMemo genauso machen oder geht das
auch einfacher ?

generic 31. Jan 2006 10:57

Re: Frage zu Zeigern
 
die zeiger sind eigendlich nur noch ein mitbringsel aus turbopascal.
in delphi werden diese "eigendlich" nicht mehr benötigt.

denn:
Delphi-Quellcode:
var
  ActiveEdit: TEdit;
ist ein zeiger auf ein edit.

wenn du folgendes machst bekommst du keine 2 edits sondern kannst das eine edit über beide namen ansprechen:
Delphi-Quellcode:
var
  ActiveEdit: TEdit;
  Edit2: TEdit;

begin
  ActiveEdit:=tEdit.Create(self);
  ActiveEdit.Parent:=self;
  Edit2:=ActiveEdit;
  Edit2.text:='Hallo';
  capiton:=ActiveEdit.text;
end;
somit mein tipp: lass die finger von den untypisierten zeigern, da macht man zu schnell fehler rein.

Oxmyx 31. Jan 2006 13:14

Re: Frage zu Zeigern
 
Zitat:

Zitat von Muetze1
Delphi-Quellcode:
Var
  Zeiger: Pointer;
  ActiveEdit: TEdit;

Begin
  // ActiveEdit sollte hier schon existieren

  Zeiger := @ActiveEdit; // Nun zeigt Zeiger auf den Speicherplatz wo ActiveEdit liegt. ActiveEdit ist aber auch nur ein Zeiger der auf die Instanz von TEdit zeigt.

  TEdit(Zeiger^).Text := 'Teschd';
End;

Das ist eine unnötige Indirektion. So ist es besser:

Delphi-Quellcode:
var
  Zeiger: Pointer;
  ActiveEdit: TEdit;
begin
  Zeiger := ActiveEdit;
  TEdit(Zeiger).Text := 'Teschd';
end;

Muetze1 31. Jan 2006 14:17

Re: Frage zu Zeigern
 
Zitat:

Zitat von Oxmyx
Zitat:

Zitat von Muetze1
Delphi-Quellcode:
Var
  Zeiger: Pointer;
  ActiveEdit: TEdit;

Begin
  // ActiveEdit sollte hier schon existieren

  Zeiger := @ActiveEdit; // Nun zeigt Zeiger auf den Speicherplatz wo ActiveEdit liegt. ActiveEdit ist aber auch nur ein Zeiger der auf die Instanz von TEdit zeigt.

  TEdit(Zeiger^).Text := 'Teschd';
End;

Das ist eine unnötige Indirektion. So ist es besser:

Delphi-Quellcode:
var
  Zeiger: Pointer;
  ActiveEdit: TEdit;
begin
  Zeiger := ActiveEdit;
  TEdit(Zeiger).Text := 'Teschd';
end;

Du hast den Code abgeändert. Du setzt den Instanzenzeiger und "Zeiger" gleich, ich habe aber Zeiger auf die Instanzenvariable zeigen lassen. Ich habe hier nicht beides gleich zeigen lassen!

Damit machst du einen Typecast und wandelst den Zeiger "Zeiger" (welcher bei mir nur auf die Variable ActiveEdit zeigt) in einen Instanzenzeiger um. Dies ist aber bei mir anders, da bei mir "Zeiger" nicht auf die Instanz zeigte (also kein Instanzenzeiger ist), sondern auf die Variable "ActiveEdit". Zeiger zeigt bei mir auf den Instanzenzeiger, nicht auf die Instanz. (ich liebe solche Sätze).

Du hast somit was ganz anderes gebaut als ich.

delphien 31. Jan 2006 14:43

Re: Frage zu Zeigern
 
Danke für die zahlreichen Antworten.
Es ist nun so, daß ich TEdit-Felder und TMemo-Felder habe
und eigentlich nur den Text benötige.

Einen Zeiger auf das aktuelle Eingabefeld (TEdit oder TMemo)
habe ich. Ich brauche nun den Text. Wie sollte man das machen ?

Delphi-Quellcode:
Var
  Zeiger: Pointer;
  ActiveEdit: TEdit;
  ActiveMemo: TMemo;

Begin
  //für TEdit und TMemo
 
  Zeiger := @ActiveEdit;
  TEdit(Zeiger^).Text := 'Teschd';
 
End;

dizzy 31. Jan 2006 15:21

Re: Frage zu Zeigern
 
Einfach so:

Delphi-Quellcode:
Var
  ActiveEdit: TEdit;
  ActiveMemo: TMemo;

Begin
  ActiveEdit.Text := 'Teschd';
End;
"ActiveEdit" ist ein Zeiger auf die Instanz von TEdit. Delphi nimmt dir jedoch beim Zugriff darauf sämtliche Zeigerarbeit ab, so dass du nicht sichtbar mit Zeigern hantierst. Das ganze Rumgecaste und Verpointerschnörksele ist hier komplett unnötig ;)

Muetze1 31. Jan 2006 15:51

Re: Frage zu Zeigern
 
Delphi-Quellcode:
Var
  ActiveElement: TComponent; // hier einfach entweder TMemo oder TEdit zuweisen

Begin
  If ( ActiveElement Is TMemo ) Then
    TMemo(ActiveElement).Lines.Text := 'Zur Zeit ist es ein Memo'
  Else If ( ActiveElement Is TEdit ) Then
    TEdit(ActiveElement).Text := 'Zur Zeit ist es ein Editfeld'
  Else
    ShowMessage('Irgendwas anderes, aber kein Memo und kein Edit!');
End;

bioser 31. Jan 2006 15:56

Re: Frage zu Zeigern
 
Zitat:

Zitat von dizzy
Einfach so:

Delphi-Quellcode:
Var
  ActiveEdit: TEdit;
  ActiveMemo: TMemo;

Begin
  ActiveEdit.Text := 'Teschd';
End;
"ActiveEdit" ist ein Zeiger auf die Instanz von TEdit. Delphi nimmt dir jedoch beim Zugriff darauf sämtliche Zeigerarbeit ab, so dass du nicht sichtbar mit Zeigern hantierst. Das ganze Rumgecaste und Verpointerschnörksele ist hier komplett unnötig ;)

Achso, das ist natürlich sehr einfach.
Eine Frage noch. In jedem OnEnter-Ereignnis eines TEdit bzw. TMemo
ist folgende Code-Zeile eingefügt:

Delphi-Quellcode:
ActiveEdit := (Sender as TEdit);
bzw.
ActiveMemo := (Sender as TMemo);
Das klappt nun natürlich nicht mehr, wenn ich Deinen Vorschlag einbaue.
Wie könnte ich das jetzt machen ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:55 Uhr.
Seite 1 von 2  1 2      

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