AGB  ·  Datenschutz  ·  Impressum  







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

Get(anyPointer) Verständnisfrage

Ein Thema von Nintendo · begonnen am 29. Apr 2013 · letzter Beitrag vom 2. Mai 2013
Antwort Antwort
Seite 1 von 2  1 2      
Nintendo

Registriert seit: 16. Feb 2009
82 Beiträge
 
#1

Get(anyPointer) Verständnisfrage

  Alt 29. Apr 2013, 14:32
Hallo,

ich experimentiere grad mit der Übergabe von Zeigern anstele von VAR Parametern und frage mich, wie ich das folgende erreichen kann:

Delphi-Quellcode:
procedure GetThis(pp: Pointer);
begin
  pp := value;
end;
Wenn ich die Prozedur selber definieren kann, könnte ich auch das hier schreiben:

Delphi-Quellcode:
procedure GetThis(var pp: Pointer);
begin
  pp := value;
end;
Wenn ich aber ein Interface nutze, sieht die Sache schon anders aus.

Wie erreiche ich dann, das auch die obere Funktion den Wert übergibt.

Gibt es da vielleicht eine Compiler-Option? Wenn ja, welche?

Hier ist noch ein Testbeispiel zur Verdeutlichung, was ich meine:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Label2: TLabel;
    Label3: TLabel;
    lblShowString: TLabel;
    lblShowPChar: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    FPChar: PChar;
    FString: String;
  public
    { Public-Deklarationen }
    procedure GetPChar(this: PChar);
    procedure GetString(this: String);
    procedure GetStringByReference(var this: String);
    procedure GetPCharByReference(var this: PChar);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var PCh: PChar; Str: String;
begin
  FString := Edit1.Text;
  FPChar := PChar(FString);
  GetStringByReference(Str);
  lblShowString.Caption := Str;
  GetPCharByReference(PCh);
  lblShowPChar.Caption := StrPas(PCh);
end;

procedure TForm1.GetPChar(this: PChar);
begin
  this := FPChar;
end;

procedure TForm1.GetPCharByReference(var this: PChar);
begin
  this := FPChar;
end;

procedure TForm1.GetString(this: String);
begin
  this := FString;
end;

procedure TForm1.GetStringByReference(var this: String);
begin
  this := FString;
end;

end.
Wenn ich hier GetStringByReference und GetPCharByReference aufrufe, dann klappt die Parameterübergabe.

Wenn ich jedoch die anderen beiden Prozeduren verwende, dann gibt

GetString() gar nichts aus, Wert bleibt komplett unverändert, wie ich das auch bei CallByValue erwarte.

GetPChar() gibt Datenmüll aus.

Wie kann ich nun Pointer in der Form wie in GetPChar() erhalten?

Wie gesagt, wenn ich ein Interface verwenden will/muss, dann kann ich die Deklaration nicht für mich passend ändern, das geht nur bei komplett eigener Defintion.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Get(anyPointer) Verständnisfrage

  Alt 29. Apr 2013, 14:51
Hallo,

Deine Erklärung ist etwas verwirrend aber folgendes funktioniert gleich:

Delphi-Quellcode:
procedure Irgendwas1(var S: String);
begin
  S := FString;
end;

procedure Irgendwas2(S: PString); // oder statt PString einfach ^String
begin
  S^ := FString;
end;

procedure TForm1.Button1Click(Sender: TObject);
var test: String;
begin
  Irgendwas1(test);
  Caption := test;
  Irgendwas2(@test);
  Caption := test;
end;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.749 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Get(anyPointer) Verständnisfrage

  Alt 29. Apr 2013, 15:04
Deine Erklärung ist etwas verwirrend
Ja, etwas.

procedure Irgendwas2(S: PString); // oder statt PString einfach ^String
Bei S: ^String nörgelt der Compiler. Man braucht schon einen benannten Typen.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#4

AW: Get(anyPointer) Verständnisfrage

  Alt 29. Apr 2013, 15:13
Und man sollte IIRC auch sicherstellen, dass der reservierte Speicherplatz, auf den der übergebene Pointer zeigt, ausreichend dimensioniert wurde, bevor man hineinschreibt.
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 p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Get(anyPointer) Verständnisfrage

  Alt 29. Apr 2013, 15:26
Wie kann ich nun Pointer in der Form wie in GetPChar() erhalten?
Was bitte willst Du (erreichen)?

Delphi-Quellcode:
procedure irgendwas(wert:integer);
begin wert:=66; end;

...
wert:=9;
irgendwas(wert);
// Hier ist wert immer noch 9 !!!!!
Ohne var werden keine Daten/werte aus der procedure zurück gegeben!
Ausnahme:

Delphi-Quellcode:
procedure irgendwas(pw:pinteger);
begin pw^:=100; end;

...
wert:=45;
irgendwas(@(wert);
// ab hier ist wert=100;
weil Du eine Adresse übergeben hast und an diese Adresse Daten geschrieben wurden. Die Adresse ist daran aber nicht direkt beteiligt.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Nintendo

Registriert seit: 16. Feb 2009
82 Beiträge
 
#6

AW: Get(anyPointer) Verständnisfrage

  Alt 30. Apr 2013, 09:22
Wie kann ich nun Pointer in der Form wie in GetPChar() erhalten?
Was bitte willst Du (erreichen)?

Delphi-Quellcode:
procedure irgendwas(wert:integer);
begin wert:=66; end;

...
wert:=9;
irgendwas(wert);
// Hier ist wert immer noch 9 !!!!!
Ohne var werden keine Daten/werte aus der procedure zurück gegeben!
Ausnahme:

Delphi-Quellcode:
procedure irgendwas(pw:pinteger);
begin pw^:=100; end;

...
wert:=45;
irgendwas(@(wert);
// ab hier ist wert=100;
weil Du eine Adresse übergeben hast und an diese Adresse Daten geschrieben wurden. Die Adresse ist daran aber nicht direkt beteiligt.

Gruß
K-H
Bis hierher ist mir die Sache klar.

Ohne var werden keine Daten/werte aus der procedure zurück gegeben!

Dann würde es umgekehrt gar nicht funktionieren, nämlich so hier:

procedure irgendwas(aWert: PChar);
begin
aWert := PChar(AnyString);
end;

Dieses Ergebnis, das

igendwas(@Wert) dann nicht funktioniert, erhalte ich auch.


Nun aber habe ich in den ToolsAPI die schon geannte Funktion GetText(Position: Integer, Buffer: PChar; ...

gefunden und dort scheint es anders zu sein. Zumindest geh ich davon aus, das Getxxx einen Wert holt, wie

GetText(1, @wert, 15)

mit

... GetText(Pos: Integer; Buffer: PChar; count: Integer)
begin
Buffer := PChar(AnyString);
end;

Wenn ich da falsch liege, müsste dann diese Funktion nicht Putxxx() doer Setxxx() heißen?

Dieser Punkt ist es, der mich verwirrt. Oder es gint tatsächlich einen Weg, so einen Wert an Buffer zzu übergeben, nur wie, wenn meine Annahme richtig ist.

Wie kommuniziert Delphi unter Verwendung dieser Funktion GetText()?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Get(anyPointer) Verständnisfrage

  Alt 30. Apr 2013, 09:48
Ich denke Du solltest Dir noch einmal genau überlegen was du (fragen) willst.
Aus den verschiedenen Informationshäppchen (toolsAPI Gettext) habe ich dies herausdestilliert
Delphi-Quellcode:
 IOTAEditReader = interface(IUnknown)
    ['{26EB0E4F-F97B-11D1-AB27-00C04FB16FB3}']
    function GetText(Position: Longint; Buffer: PChar; Count: Longint): Longint;
  end;
Wenn es hierum geht, was daran ist unverständlich?

Was den Namen einer Funktion/Prozedur angeht, Du kannst ihr Namen geben wie es Dir einfällt("Pukkelmon","hh_136gtz_99","Bundesinnenmi nister"). Es entspricht aber gutem Stil, wenn der Name auch die Funktionalität wiederspiegelt.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Nintendo

Registriert seit: 16. Feb 2009
82 Beiträge
 
#8

AW: Get(anyPointer) Verständnisfrage

  Alt 2. Mai 2013, 12:36
Ich denke Du solltest Dir noch einmal genau überlegen was du (fragen) willst.
Aus den verschiedenen Informationshäppchen (toolsAPI Gettext) habe ich dies herausdestilliert
Delphi-Quellcode:
 IOTAEditReader = interface(IUnknown)
    ['{26EB0E4F-F97B-11D1-AB27-00C04FB16FB3}']
    function GetText(Position: Longint; Buffer: PChar; Count: Longint): Longint;
  end;
Wenn es hierum geht, was daran ist unverständlich?
Heißt das, das diese Funktion trotz ihres Namens einen Text in der Variablen Buffer erwartet, den die Fuktion dann an die an das Interface angeschlossene Software übergibt?

Andersherum klappt es nämlich nicht. Ich kann also nicht, wie ich bei dem Namen GET erwartet hätte einen Text aus der angeschlossenen Software über die Variable Buffer auslesen.

Was den Namen einer Funktion/Prozedur angeht, Du kannst ihr Namen geben wie es Dir einfällt("Pukkelmon","hh_136gtz_99","Bundesinnenmi nister").
Bei dieser angenommenen Namensgebung würde ich allerdings erwarten, das ich von der Routine 3 Werte erhalte:

- Pukkelmon, das Computespiel (oder eine Kinderserie im Fernsehen?)
- eine Softwarebibliothek mit dem Namen "hh_136gtz_99"
- die Webseite des Bundesinnenministers

Da hier kein Routinenname angegeben ist, könnte mir letzterer Parameter natürlich auch den Namen des aktuell amtierenden Bundesinnenministers anzeigen oder mich zur Webseite des Bundesinnenministeriums leiten.

Es entspricht aber gutem Stil, wenn der Name auch die Funktionalität wiederspiegelt.

Gruß
K-H
Konsens!


Zurück zu meiner Frage: Leider weiß ich dummerweise nicht,wie ich hier richtig fragen soll. Ich kenne nur mein Problem und suche dafür eine Lösung.

Diese kann auch darin bestehen, das der Name der fraglichen Funktion, ja es geht um die obige Funktion, das dieser Name falsch gewählt wurde von Borland/Codegaer/Embarcadero, da diese Funktion nicht, wie ich angenommen habe, einen Text aus einem an das OTA angeschlossene IDE Plugin ausliest, sondern einen Text, der an die Variable Buffer übergeben und dann der Funktion übergeben wird, an das Plugin sendet.

Also, in welcher Richtung erfolgt hier die Übertragung des PChar-Strings?

Sendet diese Funktion den Text, den ich in Buffer übergebe oder liest die Funktion einen Text, den sie dann an Buffer übergibt, damit ich ihn verwenden kann?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#9

AW: Get(anyPointer) Verständnisfrage

  Alt 2. Mai 2013, 12:49
Ich kenne die ToolsAPI zwar nicht auswendig, aber anhand der Parameter ist zu vermuten, dass das wie in Unmengen Win32-API-Funktionen auch gedacht ist: man reserviert Speicher und übergibt dessen Adresse dann samt der Angabe der Datengröße an die Routine, welche ihn dann mit Daten befüllt.

[edit] Beispielhaft sei hier mal GetWindowsDirectory genannt. [/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
Furtbichler
(Gast)

n/a Beiträge
 
#10

AW: Get(anyPointer) Verständnisfrage

  Alt 29. Apr 2013, 19:21
Wie gesagt, wenn ich ein Interface verwenden will/muss, dann kann ich die Deklaration nicht für mich passend ändern, das geht nur bei komplett eigener Defintion.
Ich frage mich gerade, was Du erreichen willst. Wenn die Interfacemethode ein Call-By-Value definiert, dann hat sich der Autor schon etwas dabei gedacht. Damit musst Du leben. Dazu sind Interfaces da. Der Autor gibt die Verwendung vor.

  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:41 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-2025 by Thomas Breitkreuz