Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String abschneiden #0 (https://www.delphipraxis.net/72012-string-abschneiden-0-a.html)

Martin K 23. Jun 2006 18:25


String abschneiden #0
 
Hi,

wie kann ich bei einem String die Begrenzungszeichen (oder wie das heißt, also #0#0...) abschneiden?
Der String liegt mir im folgenden Format vor:

'MeinString'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 #0#0#0#0#0#0#0#0#0#0#0#0
#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 #0#0#0#0#0#0#0#0#0#0#0'Ø5'
#0#1#0#0#0#$C'fE'#0#$C'fE'#0#$18#$10#0#0'rm1'#5'Fo rm1'#4'Left'#3'À'#0#3'Top'
#2'k'#5#0#0'dtÐ%'#0'Ð%'#0'ð'#$F#0#0'€'#2#7'Capti on'#6#5'Form1'#5'Color'#7
#9'clBtnFace'#$C'Font.Charset'#7#$F'DEFAULT_CHARSE T'#$A'Font.Color'#7#$C'clWindowTex'

Keine Ahnung was das Zeugs dahinter alles ist, mir geht es nur um den eigentlichen String: 'MeinString'

Gibt es dafür eine Funktion?

Momentan mache ich das so:
Delphi-Quellcode:
SetLength(s, Pos(#0, s) -1);
aber ich denke, das ist nicht die beste Methode :gruebel:

[edit=Admin]Zeilenumbrüche eingefügt, um Scrollbalken zu vermeiden. Mfg, Daniel[/edit]

shmia 23. Jun 2006 18:28

Re: String abschneiden #0
 
Delphi-Quellcode:
s := PChar(s);

Martin K 23. Jun 2006 18:31

Re: String abschneiden #0
 
Jupp, das wars :thumb:

Ist irgendso eine komische Windows-Funktion, die will zwar PAnsiChar als Parameter haben, wenn ich aber einen solchen übergebe kommt's zur Exception...

Also musste ich ein array[0..MAX_PATH] of Char nehmen..

shmia 23. Jun 2006 18:35

Re: String abschneiden #0
 
Zitat:

Zitat von Martin K
Ist irgendso eine komische Windows-Funktion, die will zwar PAnsiChar als Parameter haben, wenn ich aber einen solchen übergebe kommt's zur Exception...
Also musste ich ein array[0..MAX_PATH] of Char nehmen..

Nicht, wenn man es geschickt anstellt:
Delphi-Quellcode:
var
   s : string;
   l : integer;
begin
   SetLength(s, MAX_PATH+1); // speicher reservieren
   l := windowsapifunction(PChar(s)); // in "l" ist die Länge
   SetLength(s, l); // string auf die richtige Länge stutzen
end;

himitsu 23. Jun 2006 18:37

Re: String abschneiden #0
 
Wieso nicht die Beste?

klar ist shmia's s := PChar(s); richtig, woallem da es sich augenscheinlich um einen PChar handelt,
allerdings wird dafür ein neuer String allociert, welcher mit den nötigen Daten aus dem PChar gefüllt wird, dann wird dieser neue String an s übergeben und der alte Inhalt wird freigegeben ... bei seinem wird unter Umständen ('s kommt drauf ann wieviel abgeschnitten wird und wie die Speicherverwaltung arbeitet) bis auf das Längenbyte überhaupt nichts verändert ... in dein meisten Fällen wird halt der String (bis #0) garnicht kopiert, da nur der nachvolgendene Speicherbereich vom MM zurückgenommen wird ... deines sollte also in einen Großteil der Fälle "besser" sein.


Aber mal andersrum ... wie bekommst du denn "MeinString" (zusammen mit dem anderen Zeugs in S rein ... vielleicht läßt es sich ja auch anders optimieren, nämlich indem S nurso groß reserviert wird, wie nötig.


[add]
und wie heißt die komische Windowsfunktion?


PS: oftmals geht auch sowas ... man holt sich erst die Länge und dann den Wert.

Delphi-Quellcode:
var s : string;
begin
  SetLength(s, windowsapifunction(nil));
  windowsapifunction(PChar(s));

// manchmal gibt es auch 'ne Extrafunktion für die Länge
var s : string;
begin
  SetLength(s, windowsapifunctionLen(nil));
  windowsapifunction(PChar(s));

[add]
Zitat:

zwar PAnsiChar als Parameter haben, wenn ich aber einen solchen übergebe kommt's ...
du darfst natürlich nicht einfach nur den PChar übergeben, der muß oftmals natürlich auch noch auf einen von dir reservierten Speicher Zeigen, wo dann die Daten reingeschirben werden sollen :warn:

Martin K 23. Jun 2006 18:43

Re: String abschneiden #0
 
Hmm...

Also meine Funktion liefert mir nicht die Länge sondern ein HRESULT zurück und das ist immer 0...

Hier mal mein kompletter Code, es geht um das Auslesen von Verknüpfungen (*.lnk):

So funktiert's einwandfrei, danke für eure Hilfe!
Delphi-Quellcode:
procedure ReadLink(const FileName: String;
  out Path, Arguments, Directory, Description, IconPath: String;
  out IconIndex, ShowCmd: Integer;
  out HotKey: Word);
var
  ShellLink: IShellLink;
  PersistFile: IPersistFile;
  FileInfo: TWin32FindData;
begin
  OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, ShellLink));
  PersistFile:=ShellLink as IPersistFile;
  PersistFile.Load(StringToOleStr(FileName), STGM_READ);
  SetLength(Path, MAX_PATH+1);
  SetLength(Arguments, MAX_PATH+1);
  SetLength(Directory, MAX_PATH+1);
  SetLength(Description, MAX_PATH+1);
  SetLength(IconPath, MAX_PATH+1);
  with ShellLink do
  begin
    if GetPath(PChar(Path), MAX_PATH, FileInfo, SLR_ANY_MATCH)<>0 then
      ShowMessage('Verknüpfung existiert nicht.');
    GetArguments(PChar(Arguments), MAX_PATH);
    GetWorkingDirectory(PChar(Directory), MAX_PATH);
    GetDescription(PChar(Description), MAX_PATH);
    GetIconLocation(PChar(IconPath), MAX_PATH, IconIndex);
    GetShowCmd(ShowCmd);
    GetHotKey(HotKey);
  end;
  Path := PChar(Path);
  Arguments := PChar(Arguments);
  Directory := PChar(Directory);
  Description := PChar(Description);
  IconPath := PChar(IconPath);
end;
//Edit:
Prozedur etwas übersichtlicher gemacht

himitsu 23. Jun 2006 18:54

Re: String abschneiden #0
 
OK, dann scheint's hier mal nicht möglich zu sein die Länge vorher passend zu setzen ... 's scheint och keine extra Funktionen (jedenfalls im schnellen überblicken) zu geben, welche die länge ausgeben.

PS:
Zitat:

HRESULT zurück und das ist immer 0
ist auch besser so, denn
0 = S_OK,
S_OK = keine Fehler
also wenn es nicht 0 wäre, dann würde ich mir Gedanken machen :roll:

Martin K 23. Jun 2006 18:59

Re: String abschneiden #0
 
Grad getestet:

Wenn's die Verknüpfung, die in FileName angegeben ist, nicht gibt, liefert die erste Funktion GetPath(...) <>0 zurück.

In den Code oben eingebaut...


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:56 Uhr.

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