Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Record <> String umwandlung (https://www.delphipraxis.net/15420-record-string-umwandlung.html)

SleepyMaster 28. Jan 2004 14:22


Record <> String umwandlung
 
Hi ihrs!

Wie schaff ich das möglichst einfach (Pointer???)?

Delphi-Quellcode:
type
  TMyRecord = record
    x:boolean;
    y:boolean;
end;

function RecordToStr(input:TMyRecord):string;
begin
//???
end;

function StrToRecord(input:string):TMyRecord;
begin
//???
end;
Vielen Dank

WtF 28. Jan 2004 14:32

Re: Record <> String umwandlung
 
Ich weiß nicht wie es den anderen geht aber ich verstehe deine "Frage" jetzt nicht so ganz - kannst du vieleicht im Einzeln erklären was du überhaupt machen möchtest?
Mfg

SleepyMaster 28. Jan 2004 14:39

Re: Record <> String umwandlung
 
Ich will den Record übers Netwerk versenden und dafür muss er als String vorhanden sein.

Delphi-Quellcode:
type
  TMyRecord = record
    x:boolean;
    y:boolean;
end;

var
  MyRecord:TMyRecord;
  EinString:string;

function RecordToStr(input:TMyRecord):string;
begin
//???
end;

function StrToRecord(input:string):TMyRecord;
begin
//???
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
EinString:=RecordToStr(MyRecord);
//Der String kann jetzt versendet werden
MyRecord:=StrToRecord(EinString);
end;

d3g 28. Jan 2004 14:44

Re: Record <> String umwandlung
 
Das kannst du nicht machen. Wenn ein Nullbyte im String vorkommt, ist er an dieser Stelle terminiert. Du verlierst den Rest der Daten. Ein Array of Byte wäre sinnvoller.

choose 28. Jan 2004 14:44

Re: Record <> String umwandlung
 
Hallo SleepyMaster,

müssen es unbedingt Records sein oder kannst Du auch einen Erben von TPersistent erstellen, so dass Du mit TReader und TWriter die Serialisierung der Delphi-Komponenten verwenden kannst?
Eine Lösung mit Records wirst Du nicht auf automatischen Weg (ohne PreCompiler) hinbekommen, weil zu ihnen keine Reflektionsinformationen (RTTI) abgelegt werden.

SleepyMaster 28. Jan 2004 14:46

Re: Record <> String umwandlung
 
@choose

Wenn du mal ein kurzes Beispiel gibst wäre es auch mit TPersistent ok!

Vielen Dank schon mal!

WtF 28. Jan 2004 14:54

Re: Record <> String umwandlung
 
Ich vogel wollte dir gerade dir Functionen mit IF sätzen schreiben :drunken:
Benutz einfach strtobool und booltostr, damit sollte es funzen.
Mfg

SleepyMaster 28. Jan 2004 14:57

Re: Record <> String umwandlung
 
Ich will den kompletten record auf einmal umwandeln. (Sind über 30 Bools drinne)

Currywurst 28. Jan 2004 15:00

Re: Record <> String umwandlung
 
ihr immer mit euren nullen im string, delphi strings vertragen ohne probleme.

sofern du das senden ordentlich anstellst (womit eigentlich, kaum zu glauben das nur strings zu senden gehen!), und dein record nur einfache typen enthält versuch ma einfach so

Code:
function RecordToStr(const input: TMyRecord): String;
begin
  SetLength(Result, SizeOf(TMyRecord));
  Move(input, Result[1], SizeOf(TMyRecord));
end;

function StrToRecord(const input: String): TMyRecord;
begin
  //if Length(input) = SizeOf(TMyRecord) then
  Move(input[1], Result, SizeOf(TMyRecord));
end;

SleepyMaster 28. Jan 2004 15:24

Re: Record <> String umwandlung
 
@Currywurst

Super!!! So gehts ohne Probleme!

Vielen Dank!

choose 28. Jan 2004 15:47

Re: Record <> String umwandlung
 
Hallo SleepyMaster,
bitte nimm Dir den Hinweis der Currywurst zu Herzen: Sobald Du mit Strings (variabler Länger) arbeitest, wird diese Lösung (prozessübergriefend, zB über ein Netzwerk) nicht mehr Funktionieren (mal abgesehen von komplexeren Datentypen...). Darüber hinaus werden bei Strings fester Länge so uU Daten übertragen, deren Speicherbereich zuvor anderweitig verwendetet wurde (zB von Objekten, die Passwörter oä in privaten Exemplarvariablen inne hielten), unverschlüsselt und vor allem überflüssigerweise über das Netz verbreitet...

Das Kernproblem, dass Dich beschäftig nennt sich Serialisierung und wurde in anderer Form, nämlich der Persistenzierung von Datenstrukturen bereits zusammen mit den auftretenen Problemen häufiger in diesem Forum besprochen. Zu finden uU bei der Problemstellung "Schreiben von Records in typisierte Dateien".

SleepyMaster 28. Jan 2004 15:54

Re: Record <> String umwandlung
 
Zitat:

Das Kernproblem, dass Dich beschäftig nennt sich Serialisierung
Mein Problem hat mit Strings mit variabler Länge o.ä. überhaupt nichts zutun! Es werden nur boolean Werte gespeichert.
Zitat:

Sind über 30 Bools drinne

choose 28. Jan 2004 16:02

Re: Record <> String umwandlung
 
Und warum dann kein Array der Form
Delphi-Quellcode:
type
  TMyArray = array[0..29] of Boolean;
bzw, falls Du benannte Indizes benötigst:
Delphi-Quellcode:
type
  TMyElement = (meOne, meTwo, meThree);
  TMyArray = array[TMyElement] of Boolean;
und eine Verwendung der Art (2. Variante)
Delphi-Quellcode:
var
  myVar: TMyArray;
  i: TMyElement;
begin
  myVar[meOne]:= GetValue(meOne);
  myVar[meTwo]:= myVar[meOne] and GetValue(meTwo);
  myVar[meThread]:= False;
 
  for i:= Low(i) to High(i) do
  begin
    if i=meTwo then
      write('Hey, it''s just the second value: ');
    Writeln(arVar[i]);
  end;

SleepyMaster 28. Jan 2004 17:01

Re: Record <> String umwandlung
 
Zitat:

Und warum dann kein Array der Form
Weil nicht gewusst :oops:


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