AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Move Anweisung

Ein Thema von MrSpock · begonnen am 1. Nov 2010 · letzter Beitrag vom 1. Nov 2010
Antwort Antwort
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#1

Move Anweisung

  Alt 1. Nov 2010, 20:33
Delphi-Version: 2010
Ich habe ein interessantes Problem beim Umstellen auf D2010. In dieser Version ist ein Char ja 2 Bytes groß. Ich lese aus der Sage CL 2010 Datensätze aus. Dort ist ein Char noch 1 Byte groß, was ich mit einem Hexeditor geprüft habe. Ich habe jetzt Records angelegt, damit ich auf die Daten über ihre Namen / Bedeutungen zugreifen kann: Beispiel:

Delphi-Quellcode:
TCl4_a10110 = record { Kundenstamm }
   case boolean of
   true : (
      Anzahl_valid_records : array[1..6] of Char;
      Gesamtzahlrecords : array[1..6] of Char;
      Recordlaenge : array[1..4] of Char;
                Ueberhang: array[1..6] of Char;
      Headerrest : array[1..cl4_a10110Recordlaenge
                        -Headerlaenge] of Char);
   false : (
    {1}   Kundennummer : array[1..10] of Char ;
         {11}   Name1 : array[1..50] of Char;
    {61}   Name2 : array[1..50] of Char;
   {111}   Strasse : array[1..50] of Char;
   {161}   Plz_Ort : array[1..45] of Char;
   {206}   Vertreter : array[1..3] of Char;
...
Dann lasse ich mir den Puffer von dem Sage CL 2010 COM-Object zurückgeben und merke mir einen Zeiger darauf.
Dann kommt die Move Anweisung:

Move(A10110.Buffer^, Kunde, cl4_a10110Recordlaenge) Kunde ist vom Typ TCl4_a10110. Ich dachte, das könne nicht funktionieren, weil z.B. das Feld Name jetzt pro Char doppelt so groß ist wie der Char aus Sage. Also habe ich aus Char im oben definierten Typ ein AnsiChar gemacht. Dann steht aber nach dem Move nur noch Müll in "Kunde". Lasse ich aber die Definition wie sie ist, funktioniert es!?

Ich habe mir mal die Länge von TCL14_a10110 ausgeben lassen und diese ist tatsächlich fast doppelt so lang wie vorher, was zeigt, dass ein Char auch wirlich als 2 Bytes dargestellt wird.

Die Move Anweisung arbeitet doch einfach Byte-weise oder erkennt diese, dass in der Destination ein Array of Char wartet und macht dann die Anpassung automatisch!? Oder woran liegt es, dass es mit der "falschen" Char Größe funktioniert?
Albert
Live long and prosper


MrSpock

Geändert von MrSpock ( 1. Nov 2010 um 20:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Move Anweisung

  Alt 1. Nov 2010, 21:31
Jupp, System.Move arbeitet byteweise, aber eventuell konvertiert Sage CL die Datensätze.
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 MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Move Anweisung

  Alt 1. Nov 2010, 21:43
Hallo himitsu,

danke erstmal.

Bin jetzt einen Schritt weiter. Noch tiefer unten im Sumpf der COM-Objekte gibt es Anweisungen der Form:

Delphi-Quellcode:
procedure myKHKbinRead (ObjFileIO : _CFileIO;
           ichannel,
                        ikeyOffset : SmallInt;
              sKey :WideString;
                        sbuffer :Pchar;
                        var irecNb: LongInt);
var
   StrBuffer : AnsiString;
begin
   ObjFileIO.objFile(iChannel).binRead (ikeyOffset ,sKey, irecNb);
   strBuffer := ObjFileIO.objFile(iChannel).strGetFieldBuffer
      (1,ObjFileIO.objFile(iChannel).lngRecordLen);
   if irecNb > 0 then
      Move(StrBuffer[1],sBuffer^,ObjFileIO.objFile(iChannel).lngRecordLen);
end;
Der StrBuffer war bisher als String definiert. Die Funktion ObjFileIO.objFile(iChannel).strGetFieldBuffer gibt aber einen WideString zurück (wie bei COM Objekten üblich). Hier wurde also früher die Konvertiereung zurück in "Small" Strings durchgeführt. Jetzt habe ich dort String durch AnsiString ersetzt (und in allen anderen Lesefunktionen auch) und jetzt sieht es gleich wieder besser aus, wenn ich auch in TCl4_a10110 alle Strings durch AnsiStrings ersetze.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Move Anweisung

  Alt 1. Nov 2010, 21:57
Wenn du jetzt Unicode zur Verfügung hast, dann könntest du dieses ja nun auch nutzen?

Also alles zurück auf String und dann vermutlich noch diese Stelle anpassen:
Move(StrBuffer[1], sBuffer^, ObjFileIO.objFile(iChannel).lngRecordLen * SizeOf(Char)); Also ich hätte hier erwartet, daß die letzte Hälfte der Datensätze unter Unicode fehlt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Nov 2010 um 22:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Move Anweisung

  Alt 1. Nov 2010, 22:15
Nein, das funktioniert so nicht, weil in dem Record ja auch andere Typen sind. Wenn ich nicht die Rückverwandlung in kurze Strings durchführe, weiß ich nicht, was mit den anderen Typen bei der Übergabe passiert. Wie gesagt intern arbeitet die CL weiterhin mit 1 Byte Char.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Move Anweisung

  Alt 1. Nov 2010, 22:27
OK, der TCl4_a10110 bestand ja nur aus Char, da wäre es gegangen.

Also, aus einem Delphi-Referenz durchsuchenByte würde ein Delphi-Referenz durchsuchenWord, aber größere Typen würden nicht funktionieren

Word würde so zu LongWord, aber aus $xxyy würde $00xx00yy

Wobei ich bei allen Werten über $7f, 127 und #127 aufpassen würde, da diese bei einer Unicode>Ansi-Umwandlung zerstört werden könnten, wenn eine andere Codepage genutzt würde, welche genutzt wurde, um auf der anderen Seite der COM-Schnittstelle die Bytes nach WideString zu konvertieren.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17: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