Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi widestringreplace (https://www.delphipraxis.net/71708-widestringreplace.html)

sancho1980 19. Jun 2006 21:02


widestringreplace
 
hallo
wisst ihr, ob es ein äquivalent der stringreplace - funktion für widestrings gibt?

danke,

martin

Ydobon 20. Jun 2006 07:51

Re: widestringreplace
 
Z.B. in den Tnt Unicode Controls.
TntSysUtils -> WideStringReplace oder Tnt_WideStringReplace

xaromz 20. Jun 2006 11:30

Re: widestringreplace
 
Hallo,

Du kannst auch eine meiner Routinen verwenden, die sind wahrscheinlich schneller.

Gruß
xaromz

sancho1980 20. Jun 2006 12:53

Re: widestringreplace
 
Zitat:

Zitat von Ydobon
Z.B. in den Tnt Unicode Controls.
TntSysUtils -> WideStringReplace oder Tnt_WideStringReplace

ich hab die installiert, wusste aber net dass die so ne funktion haben
sag mal, wie bekomm ich es hin, dass mir die api der tnt-library angezeigt wird?

Zitat:

Zitat von xaromz
Hallo,

Du kannst auch eine meiner Routinen verwenden, die sind wahrscheinlich schneller.

Gruß
xaromz


Ich hatte die schon mal ausprobiert aber irgendwie schien mir, als würde die nicht machen, was sie soll...hmmm :?:

edit: glaub ich muss mich korrigieren...das schien an was anderm gelegen zu haben...

xaromz 20. Jun 2006 13:00

Re: widestringreplace
 
Hallo,
Zitat:

Zitat von sancho1980
Ich hatte die schon mal ausprobiert aber irgendwie schien mir, als würde die nicht machen, was sie soll...hmmm :?:

Was sollen sie denn machen und was machen sie stattdessen?

Gruß
xaromz

sancho1980 20. Jun 2006 13:10

Re: widestringreplace
 
das problem ist, dass ich (erst mit deiner funktion, jetzt mit der tnt-funktion) eine dll geschrieben hatte, auf die ich in in meiner datenbank als udf nutzen wollte; aber das funzt nicht so ganz.
die funktion sieht so aus:
Delphi-Quellcode:
unit Strings;

interface

uses
  SysUtils, TntSysUtils;

  function Replace(s, old, new: PWideChar): PWideChar; cdecl; export;

implementation

function Replace(s, old, new: PWideChar): PWideChar;
begin
  Result := PWideChar(Tnt_WideStringReplace(WideString(S), WideString(Old), WideString(New), [rfReplaceAll]));
end;

end.
in meiner datenbank (firebird) hab ich dann die funktion unter dem namen replacesubstring deklariert...
aber ein aufruf von:

SQL-Code:
select replacesubstring('Muster', 'u', 'a') from rdb$database
hat als Ergebnis:

[result]Muster[/result]

xaromz 20. Jun 2006 17:30

Re: widestringreplace
 
Hallo,
Zitat:

Zitat von sancho1980
das problem ist, dass ich (erst mit deiner funktion, jetzt mit der tnt-funktion) eine dll geschrieben hatte, auf die ich in in meiner datenbank als udf nutzen wollte; aber das funzt nicht so ganz.

...

in meiner datenbank (firebird) hab ich dann die funktion unter dem namen replacesubstring deklariert...
aber ein aufruf von:

SQL-Code:
select replacesubstring('Muster', 'u', 'a') from rdb$database
hat als Ergebnis:

[result]Muster[/result]

hast Du mal den Quellcode im Debugger schrittweise ausgeführt? Ich hab' früher auch die Tnt-Routine verwendet, bis ich meine geschrieben hatte, und beide funktionieren eigentlich.

Außerdem ist es immer eine gute Idee, solche Funktionen in einem Programm auszuprobieren, bevor man sie in eine DLL auslagert. Da kann man nämlich besser debuggen.

Gruß
xaromz

sancho1980 20. Jun 2006 22:52

Re: widestringreplace
 
Liste der Anhänge anzeigen (Anzahl: 1)
kannst du mir bitte sagen, wie ich so meine erzeugte dll jetz testen kann?
ich hab davon nämlich keine ahnung...
irgendwie ne host-anwendung und parameter..aber welche host-anwendung und wo wird da die gewünschte funktion aufgerufen?
ich hab mal meine dll angehängt...vllt kannst es mir ja mal erklären, wär sehr nett!
gruß,

martin

xaromz 20. Jun 2006 23:38

Re: widestringreplace
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,

zuerst sollteset Du mal überall ShareMem entfernen. Erstens gehört das (wenn überhaupt) ganz an den Anfang der Projektdatei (.dpr), und zweitens nur, wenn Du Delphi-Strings zwischen einer Delphi-DLL und einem Delphi-Programm austauschen willst.

Ich habe mal ein Testprogramm angehängt, mit dem Du die DLL testen kannst (Start -> Parameter -> Host-Anwendung).
Dabei habe ich festgestellt, dass Du einen Pointer auf einen Speicherbereich übergibst, der am Ende von Replace schon wieder freigegeben wurde. Das kann nicht funktionieren.
Du musst also einen Buffer erstellen, dessen Pointer Du übergibst. Du solltest dann aber aufpassen, dass Du kein Speicherleck fabrizierst.

Ich häng' mal noch die abgeänderte DLL an.

Gruß
xaromz

sancho1980 21. Jun 2006 08:29

Re: widestringreplace
 
danke, voll nett
trotzdem ist mir das schleierhaft...
wenn mir Tnt_WideStringReplace nen WideString zurückgibt, wieso muss ich dann nochmal von Help nach Result kopieren..ich blick irgendwie nicht, wieso ich nicht gleich schreiben kann:

[edit]hab mir deins nochmal durchgelesen...verstehe...die frage ist dann aber, wie meine ursprüngliche dll überhaupt gelaufen ist und keinen segmentation fault verursacht hat..auf jeden fall danke[/edit]


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