Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Teil-Records aus Stream lesen (https://www.delphipraxis.net/96652-teil-records-aus-stream-lesen.html)

Neutral General 28. Jul 2007 12:53


Teil-Records aus Stream lesen
 
Hi,

Also sagen wir ich hätte sowas:

Delphi-Quellcode:
TTest = packed record
  nein: Byte;
  ja: Word;
end;
Wenn ich jetzt das Record aus nem Stream lesen will dann mach ich das ja so:

Delphi-Quellcode:
Stream.Read(ATest,SizeOf(TTest));
Wie mach ich das aber wenn ich ab dem zweiten Byte lesen will? Also wenn ich das erste Byte des Records nicht einlesen will... also theoretisch sowas:

Delphi-Quellcode:
Stream.Read(ATest+1,SizeOf(TTest)-1);
So das in dem Beispiel die Variable "nein" nicht eingelesen wird... ?
Ich hab da schon irgendwas versucht mit Pointern und hin und her aber das war Rumprobiererei und wurde auch nichtmal compiliert..

Gruß
Neutral General

bitsetter 28. Jul 2007 13:04

Re: Teil-Records aus Stream lesen
 
Hi,
das müsste doch so gehen
Delphi-Quellcode:
stream.Position:= stream.Position+ 1;

Neutral General 28. Jul 2007 13:15

Re: Teil-Records aus Stream lesen
 
Hi,

nein so mein ich das nicht.. Im Stream steht das erste Byte nicht drin.

Mein Record:
________
1 | 2 | 3 |


Das erste (rote) Byte will ich nicht auslesen. Sondern erst das zweite und dritte. Nur ich darf halt nicht die Speicherstelle des Records angeben sondern die Speicherstelle eins weiter. Also hinter der Variable "ja".. so das in diesem Beispiel nur "nein" geladen wird.
Ich hoffe das war jetzt verständlich

Gruß
Neutral General

markusj 28. Jul 2007 13:25

Re: Teil-Records aus Stream lesen
 
Hmm, da würde ich, sofern es nur ein kleiner Teil ist (hier nur das Word), dieses per Hand auslesen.
Wenn es ein größerer Record ist, würde ich alles Auslesen und danach die unerwünschten Bestandteile resette.

mfG
Markus

Ähem Halt, ich raff gerade deine Grafik ... da hilft wohl nur die "Zu-Fuß-Variante", oder du nimmst einen zweiten Teil-Record, welchen du einliest und dann rüberschiebst in den richtigen.

Neutral General 28. Jul 2007 13:26

Re: Teil-Records aus Stream lesen
 
Nein das muss anders gehn.. Da könnt ich wetten.

Hawkeye219 28. Jul 2007 13:27

Re: Teil-Records aus Stream lesen
 
Hallo,

hier ist ein eher defensiver Ansatz, der zunächst den Offset des ersten zu lesenden Recordelements berechnet. Aus diesem Wert und der Recordgröße ergibt sich die Anzahl der zu lesenden Bytes:

Delphi-Quellcode:
var
  Test       : TTest;
  FieldOffset : Integer;
  ReadSize   : Integer;
begin
  FieldOffset := Cardinal(@Test.ja) - Cardinal(@Test);
  ReadSize := SizeOf(TTest) - FieldOffset;

  Stream.Read(Test.ja, ReadSize);
end;
Gruß Hawkeye

Neutral General 28. Jul 2007 13:36

Re: Teil-Records aus Stream lesen
 
Hi,

Also in Wirklichkeit hab ich sowas:

Delphi-Quellcode:
TGIFHeader = packed record
  Version: String[6];      
  Width: Word;              
  Height: Word;  
  //..
end;
PGIFHeader = ^TGIFHeader
Ich hab jetzt mal sowas probiert...

Delphi-Quellcode:
var P: Pointer;
begin
  P := @FHeader;
  P := PPointer(Cardinal(P) + 1)^; // Da müsste ich doch beim ersten Zeichen von Version landen oder?
  SetLength(FHeader.Version,6);   // Weil das allererste Byte ist ja das Byte wo die Länge drinsteht vom String
  AStream.Read(P,10);              // Und das darf nicht überschrieben werden.
  FHeader := PGIFHeader(PPointer(Cardinal(P) - 1)^)^;
  ShowMessage(FHeader.Version);
end;
Das wäre meine Logik aber da bekomm ich bei FHeader := ... haue^^

Gruß
Neutral General

marabu 28. Jul 2007 14:33

Re: Teil-Records aus Stream lesen
 
Hallo,

was du laut Format-Spezifikation brauchst sieht eher so aus:

Delphi-Quellcode:
type
  TGIF_HEader = packed record
    Signature: array [0..2] of Char;
    Version: array [0..2] of Char;
   end;

  TGIF_LogicalScreenDescriptor = packed record
    LogicalScreenWidth: Word;
    LogicalScreenHeight: Word;
    Options: Byte;
    BackgroundColorIndex: Byte;
    PixelAspectRatio: Byte;
  end;

// ...
String[6] ist also auf jeden Fall falsch. Wenn du jeden GIF Block-Typ einzeln gemäß Spezifikation definierst, dann fällt dein Problem einfach weg, aber grundsätzlich funktioniert die von Hawkeye vorgestellte Methode.

Grüße vom marabu

Neutral General 28. Jul 2007 15:17

Re: Teil-Records aus Stream lesen
 
Hi,

Ja ok danke.. Naja das Problem ist:

Zitat:

Zitat von GIF Dateispezifikation
Byte Nr. 0 - 5: "GIF87a" Version. Bislang gibt es GIF87a und GIF89a.

Deswegen hab ich nen String[6] definiert...

marabu 28. Jul 2007 15:33

Re: Teil-Records aus Stream lesen
 
Hallo Michael,

ich hatte dir unterstellt, dass du den feinen Unterschied zwischen String[6] und array [0..5] of Char nicht kennst - entschuldige.

Dein Problem kannst du viel einfacher lösen:

Delphi-Quellcode:
type
  TGIF_Header = packed record
    Signature: array [0..2] of Char;
    Version: array [0..2] of Char;
  end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  gh: TGIF_Header;
begin
  gh.Signature := 'GIF';
  gh.Version := '89a';
  ShowMessage(Format('<%s> <%s>', [String(gh.Signature), String(gh.Version)]));
end;
Du brauchst kein getürktes Längenbyte.

Freundliche Grüße


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