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 Streams - negativen Wert mit Write schreiben??? (https://www.delphipraxis.net/27643-streams-negativen-wert-mit-write-schreiben.html)

FreewareFire 13. Aug 2004 12:50


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:
BuildValue: Smallint;

BuildValue := RV.Value;
MemoryStream.Write(BuildValue, 2);
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!

:thumb:

Jörn 13. Aug 2004 12:54

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...

FreewareFire 13. Aug 2004 13:06

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.

maximov 13. Aug 2004 13:16

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.

nailor 13. Aug 2004 13:17

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.

TeronG 13. Aug 2004 13:18

Re: Streams - negativen Wert mit Write schreiben???
 
Zitat:

Zitat von FreewareFire
.... bei SpinEdit -10 im Stream um die 6000 ....

Liegt er echt nur bei 6000 oder zufälligerweise so um die 65000 ?!?

Dannyboy 13. Aug 2004 13:22

Re: Streams - negativen Wert mit Write schreiben???
 
Zitat:

Zitat von TeronG
Zitat:

Zitat von FreewareFire
.... bei SpinEdit -10 im Stream um die 6000 ....

Liegt er echt nur bei 6000 oder zufälligerweise so um die 65000 ?!?

... Vielleicht sogar exakt bei 65525 (65535 minus 10)? :gruebel:

FreewareFire 13. Aug 2004 13:25

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?

TeronG 13. Aug 2004 13:26

Re: Streams - negativen Wert mit Write schreiben???
 
[OT]
Zitat:

Zitat von Dannyboy
... Vielleicht sogar exakt bei 65525 (65535 minus 10)? :gruebel:

hrhr :twisted: ich LIEBE diesen "fehler" :love: hab ihn ja schon oft genug getroffen/begangen.
[/OT]

maximov 13. Aug 2004 15:37

Re: Streams - negativen Wert mit Write schreiben???
 
Zitat:

Zitat von FreewareFire
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?

Zeige code und wir zeigen (evtl.) die lösung :stupid:

FreewareFire 13. Aug 2004 15:43

Re: Streams - negativen Wert mit Write schreiben???
 
Siehe das erste Posting - da is er, der Code!

nailor 13. Aug 2004 15:49

Re: Streams - negativen Wert mit Write schreiben???
 
und das einlesen?

FreewareFire 13. Aug 2004 15:54

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?

maximov 13. Aug 2004 16:23

Re: Streams - negativen Wert mit Write schreiben???
 
Zitat:

Zitat von FreewareFire
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?

HALLO! Dem stream ist es völlig egal ob negativ oder nicht. Entscheidend ist, ob die daten genauso wieder raus kommen, wie sie reingetan wurden. Also ist das interessanteste wie, wo, was wieder rauskommt und da wollen (zu recht) den code sehen. Kann ja auch sein das du dir das einfach mit nem hex-editor anschaust und die einzelnen bytes in einen integer umrechnest, was dann rein garnix zu sagen hätte.

Also zier dich nicht :mrgreen: ...oder debugge selbst.

FreewareFire 13. Aug 2004 16:51

Re: Streams - negativen Wert mit Write schreiben???
 
Also Bitte: Ich lade die Daten so in den Stream:

Code:
MemoryStream.LoadFromFile(STV1.Path + '\' + FList.Items.Strings[FList.ItemIndex]);
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!

MacGuyver 13. Aug 2004 16:55

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

FreewareFire 13. Aug 2004 17:02

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

MacGuyver 13. Aug 2004 17:04

Re: Streams - negativen Wert mit Write schreiben???
 
Dann zeige doch mal die Stelle, wo du lädst und in den Spin schreibst.

Stefan

FreewareFire 13. Aug 2004 17:12

Re: Streams - negativen Wert mit Write schreiben???
 
Code:
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;
So sieht's dann eben komplett aus!

MacGuyver 13. Aug 2004 17:22

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

SirThornberry 13. Aug 2004 17:25

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:

mytar 13. Aug 2004 17:29

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:

1. Ich habe mein eigenes Betriebssystem programmiert.
2. Ich hab es versucht zu starten.

Hilfe, was soll ich tun?
Um Hilfe zu geben, muss ein anderer Programmierer den Quellcode (teilweise) verstehen. Und um ihn zu verstehen muss man ihn sich erstmal anschauen. Er genötigt also den vollständigen Code (d.h. also jede nötige Variable und Typ sowie Methode die nötig ist). Dann kann er den Fehler vielleicht ausbessern. Aber ohne Quellcode einen Fehler finden, das wird schwierig, außer der Programmierer kann zaubern.

mytar :x :x

maximov 13. Aug 2004 17:42

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?

FreewareFire 13. Aug 2004 17:56

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.

SirThornberry 13. Aug 2004 17:59

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.

MacGuyver 13. Aug 2004 18:06

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

FreewareFire 13. Aug 2004 18:06

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!

FreewareFire 13. Aug 2004 18:10

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.

MacGuyver 13. Aug 2004 18:14

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

FreewareFire 13. Aug 2004 18:24

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!

MacGuyver 13. Aug 2004 19:01

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.

FreewareFire 13. Aug 2004 19:38

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?

MacGuyver 13. Aug 2004 22:18

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?

maximov 13. Aug 2004 23:36

Re: Streams - negativen Wert mit Write schreiben???
 
:mrgreen:

Zitat:

Zitat von maximov
...
Kann ja auch sein das du dir das einfach mit nem hex-editor anschaust und die einzelnen bytes in einen integer umrechnest, was dann rein garnix zu sagen hätte..

Zitat:

Zitat von maximov
...
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...

Meine neue glaskugel ist echt gut 8) ...sehen sie selbst:


Zitat:

Zitat von Freewarefire
...
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
...
Ist eine Datei von einem Spiel (RollerCoaster Tycoon 2). Das muss so sein.


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

FreewareFire 14. Aug 2004 00:03

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!

scp 14. Aug 2004 01:15

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.

Die Muhkuh 14. Aug 2004 08:09

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:
MemoryStream.SaveToFile()
schreiben?


Wenn ich falsch liege, dann berichtigt mich bitte!

Die Muhkuh 14. Aug 2004 08:20

Re: Streams - negativen Wert mit Write schreiben???
 
Zitat:

Zitat von FreewareFire
Und die Daten, die ich speichern will, befinden sich eben an $A1 !


Ja was nun?

Code:
MemoryStream.Position := [color=#ff0009]$1A[/color];

Die Muhkuh 14. Aug 2004 08:23

Re: Streams - negativen Wert mit Write schreiben???
 
Also,

ich habs jetzt selbst mal getestet:

Schreiben:

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;
    BuildValue := BC.Value * 10;
    MemoryStream.Write(BuildValue, 2);
    MemoryStream.SaveToFile('F:\Test.bin');
  finally
    MemoryStream.Free;
  end;
end;
Und so lesen:

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:

FreewareFire 14. Aug 2004 09:32

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.
Seite 1 von 2  1 2      

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