![]() |
Frage zu Zeigern
Hallo,
Ich habe einen Zeiger, der auf den Typ TEdit zeigt:
Delphi-Quellcode:
Wie kann ich jetzt auf den Text von TEdit zugreifen ?
var zeiger: ^pointer;
ActiveMemo:TEdit; zeiger := pointer(ActiveMemo); Ich weiß, daß man es anders machen kann, aber ich möchte mich ein bißchen mit Zeigern beschäftigen. Danke ! Gruss DELPHIEN |
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; |
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 ? |
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:
ist ein zeiger auf ein edit.
var
ActiveEdit: TEdit; wenn du folgendes machst bekommst du keine 2 edits sondern kannst das eine edit über beide namen ansprechen:
Delphi-Quellcode:
somit mein tipp: lass die finger von den untypisierten zeigern, da macht man zu schnell fehler rein.
var
ActiveEdit: TEdit; Edit2: TEdit; begin ActiveEdit:=tEdit.Create(self); ActiveEdit.Parent:=self; Edit2:=ActiveEdit; Edit2.text:='Hallo'; capiton:=ActiveEdit.text; end; |
Re: Frage zu Zeigern
Zitat:
Delphi-Quellcode:
var
Zeiger: Pointer; ActiveEdit: TEdit; begin Zeiger := ActiveEdit; TEdit(Zeiger).Text := 'Teschd'; end; |
Re: Frage zu Zeigern
Zitat:
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. |
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; |
Re: Frage zu Zeigern
Einfach so:
Delphi-Quellcode:
"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 ;)
Var
ActiveEdit: TEdit; ActiveMemo: TMemo; Begin ActiveEdit.Text := 'Teschd'; End; |
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; |
Re: Frage zu Zeigern
Zitat:
Eine Frage noch. In jedem OnEnter-Ereignnis eines TEdit bzw. TMemo ist folgende Code-Zeile eingefügt:
Delphi-Quellcode:
Das klappt nun natürlich nicht mehr, wenn ich Deinen Vorschlag einbaue.
ActiveEdit := (Sender as TEdit);
bzw. ActiveMemo := (Sender as TMemo); Wie könnte ich das jetzt machen ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 Uhr. |
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