Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Zeigern (https://www.delphipraxis.net/41344-problem-mit-zeigern.html)

Gambit 2. Mär 2005 08:49


Problem mit Zeigern
 
Hallo,

ich verwende hier eine API-Funktion(OemToCharBuff) die als Parameter PAnsiChar erwartet und ANSI-Text in OEM-Text umwandelt:

Auszug aus meiner Procedur:

Delphi-Quellcode:
If isUseOEM then
      begin
        Title:= PChar(QueryRef.FieldByName('aString').AsString);
        getMem(OEMTitle, length(Title));
        OemToCharBuff(Title, OEMTitle, Length(Title));
        FormSelectedTitles.ListBoxFoundTitles.Items.Add(OEMTitle);
        FreeMem(OEMTitle);
      end
wobei Title und OEMTitle vom Typ PAnsiChar sind.

Wenn ich die Procedure zum ersten Mal aufrufe funzt es einwandfrei. Rufe ich sie ein zweites Mal auf, bekomme ich zwar auch meinen umgewandelten Text, dahinter stehen dann aber oft noch merkwürdige Sonderzeichen wie ein § oder ein A mit Dach oder ähnliches.
Was mache ich denn hier noch falsch?

Gruß

Gambit

jim_raynor 2. Mär 2005 08:53

Re: Problem mit Zeigern
 
Ich würde es mal mit getMem(OEMTitle, length(Title)+1); versuchen. Begründung: Es sind nullterminierte Strings. Das bedeutet du brauchst immer noch ein Zeichen für den Nullterminator, damit der String korrekt beendet ist.

Gambit 2. Mär 2005 09:00

Re: Problem mit Zeigern
 
Jau, das wars! Danke! Wär ich so wohl nicht drauf gekommen, leuchtet aber völlig ein...

Gruß

Gambit

shmia 2. Mär 2005 09:00

Re: Problem mit Zeigern
 
Du brauchst dich nicht mit GetMem, FreeMem und Zeigern zu plagen.
Mit den Delphidatentyp AnsiString geht das viel einfacher:
Delphi-Quellcode:
var
   title, OEMtitle : AnsiString;
begin
   Title:= QueryRef.FieldByName('aString').AsString;
   // Speicher für Ziel reservieren
   SetLength(OEMtitle, Length(title);
   OemToCharBuff(PChar(Title), PChar(OEMTitle), Length(Title));

   FormSelectedTitles.ListBoxFoundTitles.Items.Add(OEMTitle);
end

Gambit 2. Mär 2005 09:05

Re: Problem mit Zeigern
 
Aha! Nochmals Danke! und wann bzw. wofür benutzt man denn new und dispose?

Hansa 2. Mär 2005 09:25

Re: Problem mit Zeigern
 
Für dynamische Datenstrukturen. Verkettete Listen, Ringe, binäre Bäume usw.


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