| Autor | Beitrag | 
| IhopeonlyReader 
          Beiträge: 600
 Erhaltene Danke: 23
 
 
 Delphi 7 PE
 
 | 
Verfasst: Mo 02.09.13 12:05 
 
Moderiert von  Narses: Abgetrennt von [url=www.entwickler-ecke....t=111829]hier[/url]. ich habe noch einen Unterschied festgestellt ! 
 Falls man etwas in einem Stream überschreiben will, MUSS man Writebuffer verwenden (vorher Position entsprechend setzten)
 Write hängt es hinten dran oder macht gar nix damit :O
 Writebuffer überschreibt und fertig    Hab ich heute erst bemerkt, denn
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 
 |   FS.Read( aByte, 1 );        aByte := aByte xor Mask;    FS.Position := FS.Position -1;   FS.WriteBuffer( aByte, 1 ); 					 |  das klappt so, dagegen klappt
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 
 |   FS.Read( aByte, 1 );        aByte := aByte xor Mask;    FS.Position := FS.Position -1;   FS.Write( aByte, 1 ); 					 |  nicht !
 oder gibt es dafür andere erklärungen`? _________________ Sucht "neueres" Delphi    Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
 | 
|  | 
| Blup 
          Beiträge: 174
 Erhaltene Danke: 43
 
 
 
 
 | 
Verfasst: Mo 02.09.13 16:55 
 
Wer "Write" verwendet muss immer den Rückgabewert auswerten (sonst kann man nur raten wie das Ergebnis zustande kommt).
Abhängig vom Stream eventuell auch noch LastError.
 Das sollte man besser dem Stream selbst überlassen, sonst schafft man unnötige Abhängigkeiten.
 | 
|  | 
| rushifell 
          Beiträge: 306
 Erhaltene Danke: 14
 
 
 
 
 | 
Verfasst: Mo 02.09.13 23:39 
 
Bist du Dir sicher, dass das Offset zum Lesen und Schreiben korrekt ist?
 Kennst Du die Methode 'seek'?
 | 
|  | 
| IhopeonlyReader  
          Beiträge: 600
 Erhaltene Danke: 23
 
 
 Delphi 7 PE
 
 | 
Verfasst: Mi 04.09.13 09:39 
 
ob seek( x ) oder Position := x; ich merke keinen unterschied ! _________________ Sucht "neueres" Delphi    Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
 | 
|  | 
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Mi 04.09.13 12:30 
 
Das könnte daran liegen, dass Position intern auch nur Seek verwendet.   | 
|  | 
| rushifell 
          Beiträge: 306
 Erhaltene Danke: 14
 
 
 
 
 | 
Verfasst: Mi 04.09.13 16:05 
 
Warum sollte das im Ergebnis einen Unterschied machen? Habe ich nie behauptet.
 Habe mich nur gewundert, dass Du die Position so umständlich setzt.
 | 
|  | 
| Martok 
          Beiträge: 3661
 Erhaltene Danke: 604
 
 Win 8.1, Win 10 x64
 Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
 
 | 
Verfasst: Mi 04.09.13 17:02 
 
Hach ist hier viel Halbwissen. Use the source, Luke!
 		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 
 | procedure TStream.WriteBuffer(const Buffer; Count: Longint);begin
 if (Count <> 0) and (Write(Buffer, Count) <> Count) then
 raise EWriteError.CreateRes(@SWriteError);
 end;
 |    einziger Unterschied ist eine Exception wenn's nicht klappt.
 	  |  IhopeonlyReader hat folgendes geschrieben  : |  	  | ob seek( x ) oder Position := x; ich merke keinen unterschied ! | 
 Doch, da ist einer. Ein Lesezugriff auf Position ist ein Seek(0, soFromCurrent) , ein Schreibzugriff Seek(aValue, soFromBeginning) . Verwendest du das Property, sind da zwei Dateioperationen, Seek(-1, soFromCurrent)  direkt aufzurufen ist also schneller. Wenn man das ein paar tausend mal macht, fällt das schon (natürlich auch abhängig von der Streamklasse) auf._________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
 | 
|  | 
| IhopeonlyReader  
          Beiträge: 600
 Erhaltene Danke: 23
 
 
 Delphi 7 PE
 
 | 
Verfasst: Mi 04.09.13 17:16 
 
_________________ Sucht "neueres" Delphi    Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
 | 
|  | 
| rushifell 
          Beiträge: 306
 Erhaltene Danke: 14
 
 
 
 
 | 
Verfasst: Mi 04.09.13 18:22 
 
Deshalb habe ich geschrieben, das es im "Ergebnis" keinen Unterschied macht. Beides funktioniert. Dass Position intern Seek aufruft, hat ja bereits Jaenicke geschrieben. Dass es daher mehr Sinn macht, direkt Seek zu verwenden ist dadurch ja klar.
 In den Personal Editions gibt's leider keinen Source.
 | 
|  | 
| IhopeonlyReader  
          Beiträge: 600
 Erhaltene Danke: 23
 
 
 Delphi 7 PE
 
 | 
Verfasst: Mi 04.09.13 19:24 
 
ich meinte Write und Writebuffer.. Writebuffer funktioniert, write alleine nicht _________________ Sucht "neueres" Delphi    Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
 | 
|  | 
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Mi 04.09.13 19:52 
 
Ohne ein konkret funktionierendes Beispielprojekt wird da wohl niemand mehr dazu sagen können. Bei mir haben Write und WriteBuffer immer funktioniert wie sie sollen.   | 
|  | 
| IhopeonlyReader  
          Beiträge: 600
 Erhaltene Danke: 23
 
 
 Delphi 7 PE
 
 | 
Verfasst: Mi 04.09.13 20:22 
 
		                       Delphi-Quelltext 
 									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 
 | var aByte,Mask: Byte;
 C: Integer;
 FS: TFileStream;
 begin
 FS := TFileStream.Create( aFileName, fmOpenReadWrite or fmShareDenyRead or fmShareDenyWrite );
 try
 FS.Position := 0;
 For C := 1 to FS.Size do
 begin
 
 FS.Read( aByte, 1 );        aByte := aByte xor Mask;    Seek( FS.Position -1 , soFromBeginning );   FS.WriteBuffer( aByte, 1 );   end;
 finally
 FS.Free;
 end;
 end;
 |  aber als ich jetzt Write verwendete funktionierte es, mein Delphi spinnt öfter mal    Delphi neustarten lässt write plötzlich auch in der compilierten exe funktionieren    Und bei einem anderen Programm habe ich sogar das Problem, dass sich meine Form nicht enabled obwohl ich sie nie disable :O Meine Form wird also nicht ansprechbar, bei allen anderen Projekten funktionierts, nur da nicht... es liegt ganz sicher kein fehler vor ! Aber ich muss wohl wieder 2-3 tage warten und dann Wunder funktionierts wieder.._________________ Sucht "neueres" Delphi    Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
 | 
|  | 
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Mi 04.09.13 21:11 
 
  Vor dem Seek hast du das FS vergessen. Dass das nicht geht, ist klar...
 Wie wärs einfach so... 		                       Delphi-Quelltext 
 									| 1:
 | FS.Seek(-1, soFromCurrent);					 |  | 
|  | 
| rushifell 
          Beiträge: 306
 Erhaltene Danke: 14
 
 
 
 
 | 
Verfasst: Mi 04.09.13 21:20 
 
Zeile 8 ist überflüssig, einfach weglassen. Und wenn du FS.Read verwendest, musst du den Rückgabewert überprüfen.
 Eine For-Schleife zu verwenden, wäre mir auch nicht geheuer.
 | 
|  | 
| IhopeonlyReader  
          Beiträge: 600
 Erhaltene Danke: 23
 
 
 Delphi 7 PE
 
 | 
Verfasst: Mi 04.09.13 21:46 
 
ja, eigentlich steht da 
 FS.Position := FS.Position -1;
 aber ich wollte es auf "eure" Vorschläge schonmal anpassen..
 Ob Zeile 8 überflüssig ist, weiß ich nicht. Lieber initialisieren    und warum soll eine For-Schleife nicht geheuer sein? Ich gehe Byte für Byte durch, dass ich das genau so oft mache, wie viele Bytes enthalten sind ist doch logisch oder?
 Bei Read und Write überprüfe ich keine Rückgabewerte ! Es wird das gemacht, was möglich ist.
 Wenn ich ein 2tes mal mache, wird es ebenso nicht möglich sein, und somit macht es kein Unterschied ! ggf. könnte ich, falls der positionszeiger nicht aktualisiert wird, da das schreiben/lesen nicht geklappt hat, diesen einen weiter setzten, sonst versucht er immer an der "nicht möglich" stelle zu lesen, aber wenn ich gehe davon aus, dass alles oder nichts klappt. ich kenne keine Datei die nur zulässt Byte 1-X und ab X+1 zu beschreiben.._________________ Sucht "neueres" Delphi    Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
 | 
|  | 
| rushifell 
          Beiträge: 306
 Erhaltene Danke: 14
 
 
 
 
 | 
Verfasst: Mi 04.09.13 22:11 
 
Du bist sehr beratungsresistent.   
 Zuletzt bearbeitet von rushifell am Mi 04.09.13 22:34, insgesamt 2-mal bearbeitet
 | 
|  | 
| Gerd Kayser 
          Beiträge: 632
 Erhaltene Danke: 121
 
 Win 7 32-bit
 Delphi 2006/XE
 
 | 
Verfasst: Mi 04.09.13 22:27 
 | 
|  | 
| IhopeonlyReader  
          Beiträge: 600
 Erhaltene Danke: 23
 
 
 Delphi 7 PE
 
 | 
Verfasst: Do 05.09.13 12:41 
 
	  |  Gerd Kayser hat folgendes geschrieben  : |  	  | 	  |  IhopeonlyReader hat folgendes geschrieben  : |  	  | Falls man etwas in einem Stream überschreiben will, MUSS man Writebuffer verwenden (vorher Position entsprechend setzten) | 
 Das ist falsch, denn das hier funktioniert:
 | 
 aber als ich jetzt Write verwendete funktionierte es, mein Delphi spinnt öfter mal    (sagte ich schonmal)
 	  |  rushifell hat folgendes geschrieben  : |  	  | Du bist sehr beratungsresistent.  | 
 Naja, deine Aussage
 	  | Zitat: |  	  | Eine For-Schleife zu verwenden, wäre mir auch nicht geheuer. 
 | 
 sagt soviel wie, "ich würde eine andere schleife verwenden"
 da ich sonst nur while und repeat kenne und diese langsamer sind frage ich mich, warum ich while oder repeat benutzen sollte, ich weiß doch wieviele Bytes ich durchgehen muss...
 Zu dem "FS vergessen" habe ich auch ausgesagt, dass das eine Anpassung war und nicht direkt die Fehlerquelle.._________________ Sucht "neueres" Delphi    Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
 | 
|  | 
| jaenicke 
          Beiträge: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Do 05.09.13 12:46 
 | 
|  | 
| rushifell 
          Beiträge: 306
 Erhaltene Danke: 14
 
 
 
 
 | 
Verfasst: Do 05.09.13 16:42 
 
Wo hast Du das aufgeschnappt, dass man nach dem Erzeugen eines Streams die Position auf 0 bzw. den Anfang setzen muss? Hab ich noch nie gesehen, lass mich aber gerne eines Besseren belehren.
 Wenn Du die Rückgabewerte nicht prüfst, ist das zumindest meiner Meinung nach schlechter Programmierstil. Dann nimm lieber ReadBuffer.
 
 Nicht alles, was funktioniert ist gut. Die For-Schleife ist schon in Ordnung. Warum soll aber die For-Schleife schneller sein? Hast Du Beweise dafür?
 | 
|  |