AGB  ·  Datenschutz  ·  Impressum  







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

String abschneiden #0

Ein Thema von Martin K · begonnen am 23. Jun 2006 · letzter Beitrag vom 23. Jun 2006
Antwort Antwort
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#1

String abschneiden #0

  Alt 23. Jun 2006, 18:25
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:
SetLength(s, Pos(#0, s) -1); aber ich denke, das ist nicht die beste Methode

[edit=Admin]Zeilenumbrüche eingefügt, um Scrollbalken zu vermeiden. Mfg, Daniel[/edit]
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: String abschneiden #0

  Alt 23. Jun 2006, 18:28
s := PChar(s);
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: String abschneiden #0

  Alt 23. Jun 2006, 18:31
Jupp, das wars

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..
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: String abschneiden #0

  Alt 23. Jun 2006, 18:35
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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.151 Beiträge
 
Delphi 12 Athens
 
#5

Re: String abschneiden #0

  Alt 23. Jun 2006, 18:37
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: String abschneiden #0

  Alt 23. Jun 2006, 18:43
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
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.151 Beiträge
 
Delphi 12 Athens
 
#7

Re: String abschneiden #0

  Alt 23. Jun 2006, 18:54
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: String abschneiden #0

  Alt 23. Jun 2006, 18:59
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...
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:34 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