![]() |
Streams - negativen Wert mit Write schreiben???
Hi,
mein letztes Problem hat sich in wohlgefallen aufgelöst. Nun gibt's aber ein neues - Wie kann ich einen Wert (Delphi 7) - aus einem SpinEdit, wenn dieser negativ ist, mit Write in einen Stream schreiben? Der Code derzeit:
Code:
Wenn ich das so mache dann erhalte ich im Stream irgendwie einen positiven Wert... Er sollte aber wie im SpinEdit, negativ sein... Danke euch für eure Hilfe!
BuildValue: Smallint;
BuildValue := RV.Value; MemoryStream.Write(BuildValue, 2); :thumb: |
Re: Streams - negativen Wert mit Write schreiben???
Hat der übertragene Wert denn denselben Betrag wie die ursprüngliche, negative Zahl? Dann könntest du einfach einen Wert übermitteln, ob der Wert mit -1 multipliziert werden soll, nachdem er angekommen ist...
|
Re: Streams - negativen Wert mit Write schreiben???
Hi Jörn,
leider nicht. Vor allem würde die Multiplikation mit -1 nicht viel nützen - da kann ich den Wert lieber per write einfügen... Der Wert liegt bei SpinEdit -10 im Stream um die 6000... Warum, keine Ahnung. |
Re: Streams - negativen Wert mit Write schreiben???
Entscheidend ist ka, wie du den wert wieder ausliest. List du ihn denn wieder als smallInt aus? Denn dann sollte die bitfolge genau die selbe sein und somit würde der selbe wert rauskommen. Wenn nicht dann hast du irgendwo einen groben fehler :wink:
zeig mal den lade-code...oder teste mit festwerten. |
Re: Streams - negativen Wert mit Write schreiben???
kann es sein, dass du vorzeichenbehaftete werte ohne vorzeichen abspeicherst / einliest? dann ist klar, dass das nicht klappt. zeig mal den schreib-code UND den lese-code.
|
Re: Streams - negativen Wert mit Write schreiben???
Zitat:
|
Re: Streams - negativen Wert mit Write schreiben???
Zitat:
|
Re: Streams - negativen Wert mit Write schreiben???
Normalerweise wären es dann sogar 65535 und nicht 65525. Aber ich kann definitiv verneinen! Er leigt nur bei 6000... Aber hat jemand eine Idee? Wir kriege ich z.B. -10 in den Stream mit dem SpinEdit und mit der write Funktion?
|
Re: Streams - negativen Wert mit Write schreiben???
[OT]
Zitat:
[/OT] |
Re: Streams - negativen Wert mit Write schreiben???
Zitat:
|
Re: Streams - negativen Wert mit Write schreiben???
Siehe das erste Posting - da is er, der Code!
|
Re: Streams - negativen Wert mit Write schreiben???
und das einlesen?
|
Re: Streams - negativen Wert mit Write schreiben???
Wo sollte da ein problem auftauchen? Der Stream ist schon mit einer Datei gefüllt. Es funktioniert ja alles, nur das halt nicht. Der Stream ist also geladen und funktioniert! Nur wie kriege ich einen negativen Wert mit write geschrieben?
|
Re: Streams - negativen Wert mit Write schreiben???
Zitat:
Also zier dich nicht :mrgreen: ...oder debugge selbst. |
Re: Streams - negativen Wert mit Write schreiben???
Also Bitte: Ich lade die Daten so in den Stream:
Code:
aber wie gesagt, das sollte ja nix bringen oder - es handelt sich übrigens um einen TMemoryStream. Und wie die Daten geladen werden, nehme ich mal an, dürfte Hex-Dezimal sein, oder? Hilft das jetzt? Mehr mach ich halt nicht - einfach per LoadFile einlesen. Es handelt sich um eine binär Datei, also keine reine Textdatei!
MemoryStream.LoadFromFile(STV1.Path + '\' + FList.Items.Strings[FList.ItemIndex]);
|
Re: Streams - negativen Wert mit Write schreiben???
Merde! :wall:
Oben schreibst du den Small-Int mit zwei Byte in die Datei. Gut. Dann ließt du das Teil auf einmal ein. Wohin? In einen Truthan? Nein, da wird doch wohl ein Type zu Grunde liegen, oder? Der Quellcodeschnipsel ist so interessant wie Fahrstuhl fahren. Zeige bitte mehr. Stefan |
Re: Streams - negativen Wert mit Write schreiben???
Also nochmal:
1. Ich lade die Daten mit einem TMemoryStream! 2. Ich lade sie mit der LoadFile Funktion 3. Ich schreibe die Daten aus der SpinEdit in den Stream, vorher setzt ich per Position die Position des Zeigers in der Datei an die Stelle. Und ich verwende keine Types oder sonstiges. Laden, schreiben mit write, mehr ist da nicht. Und mehr Code ist da einfach nicht, warum wollt ihr mehr Code? Da is eben keiner mehr :!: |
Re: Streams - negativen Wert mit Write schreiben???
Dann zeige doch mal die Stelle, wo du lädst und in den Spin schreibst.
Stefan |
Re: Streams - negativen Wert mit Write schreiben???
Code:
So sieht's dann eben komplett aus!
procedure TForm1.FLISTClick(Sender: TObject);
var BuildValue: smallint; begin try //now open the file to check the type MemoryStream.LoadFromFile(STV1.Path + '\' + FList.Items.Strings[FList.ItemIndex]); MemoryStream.Position := $1A; BuildValue := BC.Value * 10; MemoryStream.Write(BuildValue, 2); end; |
Re: Streams - negativen Wert mit Write schreiben???
Irgendwie peilst du die Lage nicht.
Vom Spin in die Variable vom Typen SmallInt(2 Byte). Dabei wird automatisch eine Konvertierung vollzogen. Mit Sicherheit ist im Spin ein Integer (4 Byte) Dann speicherst du die zwei Byte auf die Platte. Gut. Dann lädst du deinen Stream. Gut. Wohin? Was macht BC.Value? Wieso * 10? Wieso Position $1A? Kannst du nicht erst einemal einen Typen deklarieren. Dann hast du auch keine Probleme beim Laden. Solltest du nur darauf achten, daß das "Packed Record" ist, sonst braucht ein Byte auch 2 Byte Speicher. Zeige mal mehr vom Code. Stefan |
Re: Streams - negativen Wert mit Write schreiben???
@MacGuyver: Ich glaub du bemühst dich umsonst, es wurde bereits 3 mal oder so gepostet welchen Sourceteil die leute zum helfen brauchen und der Threadstarter rückt ihn einfach nicht raus. Wenn er nicht geholfen bekommen will dann müssen wir ihn eben allein lassen mit seinem problem, so ungern wir das auch machen. :roll:
|
Re: Streams - negativen Wert mit Write schreiben???
@FreeFire: Ich will jetzt nicht schimpfen, aber dass muss ich jetzt loswerden:
Deine 3-Punkte-Erklärung hilft gleichviel, wie wenn ich schriebe: Zitat:
mytar :x :x |
Re: Streams - negativen Wert mit Write schreiben???
Ich glaub langsam, dass FreewarFire den wert den er schreibt garnicht in seinem eigenen programm wieder verwenden will. Vermutlich hackt (völlig wertfrei) er fremde daten und kennt deren kodierung nicht. Dann ist es vermutlich kein wunder wenn am anderen ende 6000 bei rum kommt.
Hast du mal versucht einen integer zu schreiben (4 bytes)? Kennst du den benötigten datentyp? |
Re: Streams - negativen Wert mit Write schreiben???
Ich glaube eher, dass hier einige keine Ahnung haben. Wer nicht rafft, dass es nicht mehr Code gibt, der sollte mal überlegen was er da schreibt. Wohin gehen die Daten wohl, wenn ich Sie in den MemoryStream lade? Die sind im MemoryStream! MemoryStream ist der TMemoryStream! Und darin befindet sich die Datei! Um nun Daten zu schreiben, setzt man die Position an die Stelle des TMemoryStream, wo man eben was speichern will. Und die Daten, die ich speichern will, befinden sich eben an $A1 ! Ich weiß ja nicht, was ihr mit euren Records und Typen habt, aber die brauche ich hier nicht. Ich glaube ihr wisst selbst nicht, wo das Problem liegt. Ich frage mich, ob es evtl. damit zu tun hat, dass die Datei Hex-Dezimal ist und ich den Wert einfach Dezimal speichere. Nehme ich mal an. Ich versuchs einfach mal anders... Und alles andere wäre Sinnlos. Also Bitte fragt nicht nach noch mehr Code - es gibt keinen :!: :!: :!: Bitte lest vorher, dann Antwortet. Ich bin am Verzeifeln, kann euch aber nur sagen das es eben nicht mehr Code gibt. Versteht das doch.
|
Re: Streams - negativen Wert mit Write schreiben???
ich beschreibe mal unser Problem: Du hast den source gepostet womit den Wert aus dem SpinEdit in den Stream speicherst. Nun ist deine Frage warum der Wert in dem Stream nicht der Wert ist den du wirklich geschrieben hast. Woher weißt du das der Wert ein anderer ist als den du geschrieben hast wenn du in nicht wieder irgendwann aus dem stream herausliest?
Bildlich gesprochen: Du wirfst 2 Euro in einen Brunnen und fragst warum im Brunnen keine 2 Euro drin sind obwohl du nie nachschaust. |
Re: Streams - negativen Wert mit Write schreiben???
Schön.
"BuildValue := BC.Value * 10;" was ist denn BC.Value? Wieso * 10? Irgendwie werde ich das gefühl nicht los, das du das nicht verstehst. Stefan |
Re: Streams - negativen Wert mit Write schreiben???
Ach so, das auslesen mache ich nach dem die Datei gespeichert wurde mit einem Hexeditor. Per Knopfdruck wird also die Datei auf der Festplatte gespeichert. Danach kann ich sehen, dass der Wert nicht dem entspricht, den er haben müsste. Ansonsten lese ich nicht aus dem MemoryStream! Er liest die Datei ein, ändert den Wert und speichert die Datei wieder auf der Festplatte. Speichern mit SaveToFile! Ich nehme an, ich muss den SpinEdit Wert in Hex umwandeln und dann speichern, oder? Wie mache ich das? Also von int nach Hex? Danke!
|
Re: Streams - negativen Wert mit Write schreiben???
BC.Value ist das SpinEdit.
* 10 weil der Wert mit 10 multipliziert werden muss, damit er später in der Datei korrekt ist. Ist eine Datei von einem Spiel (RollerCoaster Tycoon 2). Das muss so sein. |
Re: Streams - negativen Wert mit Write schreiben???
Oh, oh. Ich nehme an, du weißt nicht wie ein SmallInt Funktioniert. 32767 ist der maximale positive Wert. Bei einem Inc kommt dann -32768 heraus. Die zwei Byte die gespeichert sind, sind lo- und hi-Byte. Der Wert +256 z. B. ist dann $00 $01. Bei +255 wäre dann die Zahl $FF $00. Den zweiten Wert mal 256 plus der erste Wert. Ist der zweite Wert > 127 ($7F) dann ist das eine negative Zahl. Du mußt die zwei Byte aus deinem Stream in eine SmallInt-Var laden und dann an den Spin übergeben. NUR so klappt das. Um nicht mit Positionen spielen zu müssen legst du einen Typen an, kann hast du da auch keine Probleme.
Stefan |
Re: Streams - negativen Wert mit Write schreiben???
Hi Stefan,
ich verstehe nicht ganz, was du meinst - ich weiß schon das der Wert eines smallint bis 32567 geht und -32568. Der Wert übersteigt aber nicht diesen Bereich. Wie kann ich jetzt einen smallint Wert in Hex konvertieren? Vielleicht klappt es dann! |
Re: Streams - negativen Wert mit Write schreiben???
Hi,
du verstehst das Prinzip noch nicht. Ganz einfach. Jeder Grundtyp belegt eine bestimmte Menge an Speicher. Ein Byte, Char, ShortInt und Boolean belegen ein Byte. Word und SmallInt belegen zwei Byte. Dann haben wir noch den Integer oder auch LongInt in Pascal der 4 Byte belegt. Es hat jetzt etwas mit Speicherplatz zu tun. Wie du nun die Bytes darstellst, ist egal. Willst du mehr wissen? Stefan p.S. Antwort dauert bis kurz vor Mitternacht. |
Re: Streams - negativen Wert mit Write schreiben???
Also, smallint belegt doch 2 Bytes, oder nicht? Der Wert den ich schreiben möchte mit write ist auch 2 Byte groß. Und liegt in diesem Speicherbereich des smallint. Wo ist da das Problem?
|
Re: Streams - negativen Wert mit Write schreiben???
Das Problem liegt darin, die 2 Byte wieder in den Spin zu bekommen. Das geht nur über eine Zwischenvariable. Wofür ist da nun BC.Value * 10 drin? Was ist BC?
|
Re: Streams - negativen Wert mit Write schreiben???
:mrgreen:
Zitat:
Zitat:
Zitat:
Wenn du unsere beiträge nicht liest, dann ist es kein wunder, dass dieses lustige ratespiel keine früchte trägt. Sag doch einfach 'ja so und so is das' - erklär uns den sinn und welche information du darüber besitzt. Das is doch kein entspanntes arbeiten, schliesslich machen wir das auch nur zum spass und nicht weil wir quiz-shows so toll finden :mrgreen: :cheers: nix für ungut |
Re: Streams - negativen Wert mit Write schreiben???
Ich versuchs nochmal:
BC ist das SpinEdit Steuerelement. MemoryStream ist das TMemoryStream Objekt! Ich lade die Datei, die kein TXT Format hat, sondern ein binäres Format per LoadFile in das MemoryStream Objekt. Dort setze ich die Position auf $1A und schreibe den Wert von BC.Value (also den Wert, der in den MemoryStream soll) in das MemoryStream mit der write funktion. Ich nehme mal an, dadurch dass es sich beim Wert von BC um einen Integer-Wert handelt gibt es dieses Problem. Wie ihr im Code sehen könnt ist der Wert als smallint definiert, da dieser 2 Bytes groß ist. Ich hoffe, das ist jetzt verständlich? Ansonsten stellt die Fragen Bitte genauer. Danke. @Stefan: Der Wert soll ja nicht zurück ins SpinEdit! Er soll nur in den Stream! |
Re: Streams - negativen Wert mit Write schreiben???
Also, ich habs probiert. Egal ob ich SmallInt oder Longint als Ausgangswert nehme, es kommt am Ende dasselbe raus: Speichere ich den Wert -10 und öffne die Datei mit einem Hex-Editor, dann erscheint dort F6 FF, dies muss man nun wegen umgekehrter Bytefolge umdrehen, ergibt also FFF6. Dezimal ist das dann 65526, was bei einem SmallInt dann -10 entspricht.
|
Re: Streams - negativen Wert mit Write schreiben???
Hi Ralf,
ich bin sicher du hast uns noch nicht den ganzen Code gezeigt:
Delphi-Quellcode:
try
//now open the file to check the type MemoryStream.LoadFromFile(STV1.Path + '\' + FList.Items.Strings[FList.ItemIndex]); MemoryStream.Position := $1A; BuildValue := BC.Value * 10; MemoryStream.Write(BuildValue, 2); end; // Da fehlt doch ein except oder ein finally?!? Desweiteren: Ich kenne mich zwar nicht so mit MemoryStream aus, aber solltest du nicht noch:
Delphi-Quellcode:
schreiben?
MemoryStream.SaveToFile()
Wenn ich falsch liege, dann berichtigt mich bitte! |
Re: Streams - negativen Wert mit Write schreiben???
Zitat:
Ja was nun?
Code:
MemoryStream.Position := [color=#ff0009]$1A[/color];
|
Re: Streams - negativen Wert mit Write schreiben???
Also,
ich habs jetzt selbst mal getestet: Schreiben:
Delphi-Quellcode:
Und so lesen:
var
BuildValue: smallint; MemoryStream: TMemoryStream; begin try MemoryStream := TMemoryStream.Create; //now open the file to check the type MemoryStream.LoadFromFile('F:\Test.bin'); MemoryStream.Position := $1A; BuildValue := BC.Value * 10; MemoryStream.Write(BuildValue, 2); MemoryStream.SaveToFile('F:\Test.bin'); finally MemoryStream.Free; end; end;
Delphi-Quellcode:
var
BuildValue: smallint; MemoryStream: TMemoryStream; begin try MemoryStream := TMemoryStream.Create; //now open the file to check the type MemoryStream.LoadFromFile('F:\Test.bin'); MemoryStream.Position := $1A; MemoryStream.Read(BuildValue, 2); Edit2.Text := IntToStr(BuildValue); finally MemoryStream.Free; end; end; Klappt alles wunderbar. :zwinker: |
Re: Streams - negativen Wert mit Write schreiben???
Hi Spider,
also, dass try sollte da nicht mit rein. Ich benutze das zwar, war aber für den Code unwichtig. Es geht sich ja um den schreib Part. Zur Position - mit 10 Finger System passiert das schon mal öfters. Wäre aber hier egal, da es darum geht, den negativen Wert des SpinEdit in Hex in den Stream zu bekommen. An welcher Position auch immer... Die kann ja wechseln. Nun und den Code zum lesen brauche ich nicht, da ich diesen schon habe - und der funktioniert, nur das schreiben halt nicht. Trotzdem Danke! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz