![]() |
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:
Die Messagebox zeigt mir "123" als Ergebnis an.
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; 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? |
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. |
AW: Verständnisfrage: String nach Pointer kopieren
Zitat:
Zitat:
Zitat:
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; |
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;
|
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'
|
AW: Verständnisfrage: String nach Pointer kopieren
Zitat:
Delphi-Quellcode:
PWideString(APointer)^ := AText;
|
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:
Ändere ich alle WideString in String und alle PWideChar in PChar, was mir lieber wäre, komme ich eine Schutzverletztung.
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); Das geht mir nicht in den Kopf :wall: |
AW: Verständnisfrage: String nach Pointer kopieren
Ändere mal
Delphi-Quellcode:
in
pStr := PWideChar(sStr);
Delphi-Quellcode:
ab. Du willst ja nicht casten, sondern die Adresse deiner Variablen übergeben.
pStr := @sStr;
|
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:
|
AW: Verständnisfrage: String nach Pointer kopieren
Zitat:
Zitat:
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:27 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