Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Verständnisfrage: String nach Pointer kopieren (https://www.delphipraxis.net/172962-verstaendnisfrage-string-nach-pointer-kopieren.html)

gmc616 30. Jan 2013 13:25

Verständnisfrage: String nach Pointer kopieren
 
Hallo Delphianer,

wieder ein mal versuche ich mich an Pointern ... :?

folgender Code funktioniert im Delphi 2009, aber nicht so richtig:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);

  procedure fktCopy (APointer : Pointer ; AText : string);
  begin
    CopyMemory(APointer,PChar(AText),2*length(AText)+1);

  end;
var
  sStr , sData : WideString;
  pStr : Pointer;
begin
  sData := '123';
  sStr := 'Hallo Welt';
  pStr := PChar(sStr);

  fktCopy (pStr,sData);

  ShowMessage (sStr);

end;
Die Messagebox zeigt mir "123" als Ergebnis an.

Tatsächlich steht aber in
Delphi-Quellcode:
 sStr ='123'#0'o Welt'
.
Ich möchte aber, dass der Inhalt der Variable sStr durch den Inhalt der Varable sData komplett ersetzt wird, also das quasi in sStr '123' als Inhalt steht.
Wie kann ich in meiner fktCopy-Procedure die Länge des Strings korrekt setzen?

sirius 30. Jan 2013 13:49

AW: Verständnisfrage: String nach Pointer kopieren
 
Das geht so nicht. Das wird vor allem spannend, wenn sData länger als sStr ist.

Was willst du denn machen?


PS: Und pass auf: wenn du widestring nimmst, solltest du auch PWideChar nehmen. Und die "2" in der Längenberechnung am besten mit sizeof(WideChar) ersetzen.

gmc616 30. Jan 2013 14:47

AW: Verständnisfrage: String nach Pointer kopieren
 
Zitat:

Zitat von sirius (Beitrag 1201329)
Das geht so nicht.

Das habe ich gemerkt. Ist für mich auch irgendwie schlüssig.

Zitat:

Zitat von sirius (Beitrag 1201329)
Das wird vor allem spannend, wenn sData länger als sStr ist.

Dachte ich auch. Interessanterweise beschwert sich Delphi _nicht_ mit längeren sData. Überschreibt er einfach. Ich hätte zumindest mit einer Schutzverletzung gerechnet, sonst knallst hier bei mir ja auch an allen Ecken und Enden, aber nix^^

Zitat:

Zitat von sirius (Beitrag 1201329)
Was willst du denn machen?

Nun ja, im Prinzip genau das.

Ich habe einen Zeiger auf einen String, genauer auf ein StringProperty einer Klasse.
Dazu habe ich einen Editor gebastelt, der den Inhalt der Property ändern soll. Da der Editor den Namen der Property nicht kennt (nicht kennen kann!), gebe ich ihm den Zeiger auf die Property.
Anschließend soll der Editor den Inhalt auf den der Zeiger zeigt ändern. Mehr nicht.

Delphi-Quellcode:
// PseudoCode !!! 

TEditClass = class (TObject)
public
   Property ID : Integer;
end;

TArtikel = Class (TEditClass)
public
   Property Name : WideString
End;

...
var
  MyArtikel : TArtikel;
...
MyArtikel := TArtikel.create;
...

fktCallEditor (MyArtikel,PWideChar (MyArtikel.Name));


procedure TEditor.SetValue (AEdit : TObject ; APointer : Pointer; AText : string);
begin
  if AEdit is TEditClass then
    fktCopy(APointer,AText);
end;

uligerhardt 30. Jan 2013 15:01

AW: Verständnisfrage: String nach Pointer kopieren
 
Ich bin mir nicht sicher, ob ich deinen Pseudocode richtig verstanden habe, aber scheinbar hast du einen untypisierten Zeiger, von dem du weißt, das er auf einen String zeigt? Wenn das so ist, caste halt einfach und mach eine normale Zuweisung:
Delphi-Quellcode:
PWideString(APointer) := AText;

gmc616 30. Jan 2013 15:14

AW: Verständnisfrage: String nach Pointer kopieren
 
Jupp, richtig verstanden.

Jetzt sagt mir der Complier:
Code:
[DCC Fehler] Unit1.pas(117): E2010 Inkompatible Typen: 'PWideString' und 'WideString'

uligerhardt 30. Jan 2013 15:43

AW: Verständnisfrage: String nach Pointer kopieren
 
Zitat:

Zitat von gmc616 (Beitrag 1201338)
Jupp, richtig verstanden.

Jetzt sagt mir der Complier:
Code:
[DCC Fehler] Unit1.pas(117): E2010 Inkompatible Typen: 'PWideString' und 'WideString'

Dann mach noch'n Haken hin:
Delphi-Quellcode:
PWideString(APointer)^ := AText;

gmc616 30. Jan 2013 16:24

AW: Verständnisfrage: String nach Pointer kopieren
 
Die Idee hatte ich auch.
Jetzt bekomme ich eine EOutOfMemory-Exception mit "Zu wenig Arbeitsspeicher."

Mein Test-Code aktuell:
Delphi-Quellcode:
procedure fktCopy (APointer : Pointer ; AText : WideString);
  begin
   // CopyMemory(APointer,PChar(AText),2*length(AText)+1);
    PWideString(APointer)^  := AText;
  end;
var
  sStr , sData : WideString;
  pStr : Pointer;
begin
  sData := '123';
  sStr := 'Hallo Welt';
  pStr := PWideChar(sStr);

  fktCopy (pStr,sData);

  ShowMessage (sStr);
Ändere ich alle WideString in String und alle PWideChar in PChar, was mir lieber wäre, komme ich eine Schutzverletztung.

Das geht mir nicht in den Kopf :wall:

uligerhardt 30. Jan 2013 16:43

AW: Verständnisfrage: String nach Pointer kopieren
 
Ändere mal
Delphi-Quellcode:
 pStr := PWideChar(sStr);
in
Delphi-Quellcode:
  pStr := @sStr;
ab. Du willst ja nicht casten, sondern die Adresse deiner Variablen übergeben.

sirius 30. Jan 2013 16:47

AW: Verständnisfrage: String nach Pointer kopieren
 
Du hast einen Widestring. Der hat eine feste länge im Speicher. Und daran kannst du mit deinen Speicherkopieraktionen nichts ändern. Du müsstest schon die Länge aktiv ändern. Das geht aber nicht mehr, wenn du nicht mehr weißt, auf was dein Zeiger eigentlich zeigt.

Achso und Delphi(Compiler) beschwert sich natürlich nicht bei deinen Kopieraktionen. Der kopiert einfach (wie in ANSI C) aber du musst wissen was du tust.


Edit:
Zitat:

Ändere ich alle WideString in String und alle PWideChar in PChar, was mir lieber wäre, komme ich eine Schutzverletztung.
Du machst try and error ohne nachzudenken. Glaub mir, das wird nix.

gmc616 30. Jan 2013 17:04

AW: Verständnisfrage: String nach Pointer kopieren
 
Zitat:

Zitat von sirius (Beitrag 1201353)
Du machst try and error ohne nachzudenken. Glaub mir, das wird nix.

Ja, mittlerweile schon.

Zitat:

Zitat von uligerhardt (Beitrag 1201352)
Ändere mal
Delphi-Quellcode:
 pStr := PWideChar(sStr);
in
Delphi-Quellcode:
  pStr := @sStr;
ab. Du willst ja nicht casten, sondern die Adresse deiner Variablen übergeben.

Das ist die Lösung!

Ich dachte mal gelesen zu haben, das PChar(sStr) und @sStr das gleiche wären, ist es aber offensichtlich nicht.

BonusFrage: Aber PChar(sStr) und @sStr[1] ist das gleiche oder?
Das würde mir meinen Denkfehler erklären ...

Danke euch für die Hilfe


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:59 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