Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wie funktioniert BlockRead/Write? (https://www.delphipraxis.net/33598-wie-funktioniert-blockread-write.html)

fiasko 11. Nov 2004 06:26

Re: Wie funktioniert BockRead/Write?
 
Hallo,

hier mal ein paar Änderungen am Code:


Delphi-Quellcode:
var EinleseString: Char; // wir lesen sowieso immer nu einzelne Zeichen - brauchen also nicht unbedingt einen String
    zweiteListBox: boolean;
begin
  Vokabel:='';         //dann bricht das Prog beim Einlesen auch ab
  zweiteListBox := false;
  OpenDialog1.Execute;       // <--- Du solltest hier schauen ob das nicht false zurückgibt, dann hat der Benutzer nämlich abbrechen gedrückt!
  AssignFile(Datei,OpenDialog1.FileName);  
  Reset(Datei);  // <---- Was ist denn wenn's einen Fehler gibt?!     

  // Rest wie oben.
end;
Es gab bei deiner Version immer eine AV da dein EinleseString falsch verwendet wurde. Du müßtest den imho mit EinleseString[1] angeben damit es richtig funktioniert, oder halt nur einen Char-Typ nehmen - du liest ja immer nur ein Zeichen.

Luckie 11. Nov 2004 06:54

Re: Wie funktioniert BockRead/Write?
 
Ich habe mir mal erlaubt das Topic zu korrigieren. :roll:

Zitat:

Wie funktioniert BockRead/Write?
:mrgreen:

PAX 11. Nov 2004 11:41

Re: Wie funktioniert BlockRead/Write?
 
Jetzt wird die While-Schleife wenigstens ein paar mal durchlaufen :lol: (war glaub ich vorher nicht so). Das Prolbem ist nur, dass ich dann via Haltepunkte beim Kontrollieren des eingelesen Zeichens feststellte, dass ich vorher in die DAtei nicht solche Zeichen geschrieben hatte. Und dann, wenn irgendwann der Einlesestring einen "nicht verfügbaren" Wert hat, bricht das Programm beim Vergleich EinString = '¿' mit AV ab.
Naja, jedenfalls scheint das nicht die Wurzel des Problems zu sein, denn mir fiel in der Hilfe auf, dass bei der Prozedur Rewrite optional die Blockgröße angegeben werden kann. Falls man dies nicht tut (so wie ich), dann ist der Standardwert 128 gesetzt. Und das ist die Wurzel allen Leids
(@ Ausdrucksweise: sorry, ich glaub die is nur bei allmystery.de angemessen). Ich möchte eine feste Blockgröße garnicht angeben, da ja die zu schreibenden Strings unterschiedlich groß sind. Sie sollen hintereinander (Zeichen für Zeichen) in dieser Datei stehen, ohne Leerzeichen/Nichts (oder was auch immer). Geht das irgendwie? Ich könnte ermitteln, was der längste String ist, aber dann stehen ja zum Schluss nach den kürzeren Strings immer noch die Leerzeichen, damit die angegebene Blockgröße übereinstimmt. (?)
Danke für euren Einsatz :)


@Luckie: Ups... Danke fürs Ändern :)

fiasko 11. Nov 2004 12:17

Re: Wie funktioniert BlockRead/Write?
 
Hallo,

Zitat:

Zitat von PAX
Naja, jedenfalls scheint das nicht die Wurzel des Problems zu sein, denn mir fiel in der Hilfe auf, dass bei der Prozedur Rewrite optional die Blockgröße angegeben werden kann.

Setze doch die Blockgröße beim "rewriten" einfach auf 1. Das erklährt aber eigentlich nicht so richtig woher die unbekannten zeichen kommen :gruebel:

PAX 11. Nov 2004 15:13

Re: Wie funktioniert BlockRead/Write?
 
Hurra, es hat das erste mal geklappt, zwei Strings in die Datei zu schreiben und sie wieder einzulesen und sogar in die ListBoxen einzufügen (ohne AV!)! :cheers:
Die Variante, bei Rewrite/Reset als Blockgröße 1 anzugeben war korrekt. Ich dachte nur, dass der eventuell längere string sonst abgeschnitten wird (war aber nicht so).
Naja, nur es sind nicht die ASCII-zeichen, die ich vorher in die LB eingetragen habe.
Ich versuch hier mal ne Tabelle zu machen, welche das veranschaulicht:

geschriebener Wert eingelesener Wert kommentar

A  ein bisschen fetter

B $ Dollarzeichen

C  (siehe oben)

D $ (siehe oben)


wie gesagt, es sind nicht die originalcharacter. auffällig: die verfälschten strings haben in listbox1 alle den selben wert und in listbox2 sind sie anders als jene in LB1, aber wiederum untereinander in LB2 gleich.
jepp, und genauso wie sie eingelsen aussehen, schauen sie auch direkt in der datei aus. also lief beim schreiben in die datei was falsch. um die strings zu ermitteln benutze ich listbox1.items.strings[i], is doch ok, oder? außerdem hängt das programm für ca. 20 sekunden, wenn ich einlese.
leute, ich sag euch, es ist alles recht seltsam.
aber ich bin ja jetzt schon ein ganze stück weiter :lol: , dank euch. zusammen schaffen wir das schon 'g'. :cheers:


PAX

PAX 11. Nov 2004 15:16

Re: Wie funktioniert BlockRead/Write?
 
ok, das mit der tabelle macht er wohl.

aus "A" wurde "" (ein bisschen fetter)

aus "B" wurde "$" (Dollarzeichen)

aus "C" wurde "" (siehe oben)

aus "D" wurde "$" (siehe oben)

fiasko 11. Nov 2004 19:01

Re: Wie funktioniert BlockRead/Write?
 
Zitat:

Zitat von PAX
um die strings zu ermitteln benutze ich listbox1.items.strings[i], is doch ok, oder?

Im Prinzip schon, aber was übergibst du denn genau an das blockwrite? Da muß etwas der Art BlockWrite(datei,listbox1.items.strings[i][1],length(listbox1.items.strings[i])) stehen!

PAX 11. Nov 2004 19:20

Re: Wie funktioniert BlockRead/Write?
 
Delphi ist verhext. Beim schreiben des Strings hat er noch den exakten Wert, aber geschrieben werden dann doch andere ASCIIs. Liegts vielleicht an der Charset-Einstellung (die von den ListBoxen ist auf irgedwas mit "default" gestellt)?
Ihr könnts euch nicht erklären, ich kanns mir nicht erklären... :( Soll ich darüber ein neues Thema aufmachen? (hier guckt sowieso keiner rein, der über diese letztere Problematik etwas sagen könnte)

PAX :kotz:



PS: Ähm, ListBox.Items.Strings[fuck] kann ich nicht direkt in die BlockWrite-Prozedure reinschreiben, also mach ich folgendes:
Delphi-Quellcode:
var Vokabel: string;

Vokabel := ListBox1.Items.Strings[i-1];
BlockWrite(Datei,Vokabel,Length(Vokabel));

PAX 11. Nov 2004 19:28

Re: Wie funktioniert BlockRead/Write?
 
Hä? Ich hab jetzt mal (wie du es gesagt hast) Vokabel[1] geschrieben,... es läuft?!! lol, versteh ich nich. Vokabel is doch nicht als Array deklariert? was heißt denn dieser Index 1 dort?
Dann dankeschön!
Also, ich hab jetzt grad absolute dopaminausschüttung...
Vielen Dank!

Kleines/(großes) Problem beseitigt, hilfsbereite Leute, Thema abgeschlossen! :cheers:

Machts mal ganz gut!

PAX :-D

Ultimator 11. Nov 2004 19:34

Re: Wie funktioniert BlockRead/Write?
 
Du kannst in einer string-Variable auf die einzelnen Zeichen Zugriff erhalten.

Angenommen der String MeinString ist 'Hallo!'.
Dann wäre MeinString[1] also H, MeinString[3] dann l, und eben so weiter.
Also gibt dir string[n] das n-te Zeichen eines Strings aus ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:16 Uhr.
Seite 2 von 3     12 3      

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