From f6e4306d5b6faa060b89e46f3a79636270b49359 Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Mon, 1 Oct 2018 22:12:57 +0200 Subject: speichern und laden --- raetsel.lps | 110 ++++++++++++++++--------------- raetselunit.inc | 35 ++++++++++ raetselunit.pas | 197 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 280 insertions(+), 62 deletions(-) diff --git a/raetsel.lps b/raetsel.lps index f45239f..ea83dbf 100644 --- a/raetsel.lps +++ b/raetsel.lps @@ -9,7 +9,7 @@ - + @@ -20,9 +20,8 @@ - + - @@ -33,24 +32,25 @@ - + - - + + + - - - + + + @@ -90,7 +90,7 @@ - + @@ -126,124 +126,122 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + - - + + - - + + - - + - + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/raetselunit.inc b/raetselunit.inc index b0d85d1..e319ea1 100644 --- a/raetselunit.inc +++ b/raetselunit.inc @@ -17,6 +17,8 @@ type procedure randErzeugen; override; function loesen(lPos: integer): boolean; override; function anzLoesungen(lPos: integer): integer; override; + procedure speichern(var datei: file); override; + procedure laden(var datei: file); override; public constructor create(aOwner: tForm); destructor destroy; override; @@ -791,3 +793,36 @@ begin result:=1; end; {$ENDIF} + +{$IFDEF speichern} +// procedure tHochhausRaetsel.speichern(var datei: file); +begin + {$IFDEF hochhaus} + blockWrite(datei,'Ho',2); + {$ENDIF} + {$IFDEF buchstaben} + blockWrite(datei,'Bu',2); + {$ENDIF} + inherited speichern(datei); +end; +{$ENDIF} + +{$IFDEF laden} +// procedure tHochhausRaetsel.laden(var datei: file); +var + s: string[2]; +begin + s:=#0#0; + blockRead(datei,s[1],2); + {$IFDEF hochhaus} + assert(s='Ho','Die zu ladende Datei ist kein Hochhausrätsel!'); + uebersetze:=@zahlenAlphabetFunktion; + {$ENDIF} + {$IFDEF buchstaben} + assert(s='Bu','Die zu ladende Datei ist kein Buchstabenrätsel!'); + uebersetze:=@buchstabenAlphabetFunktion; + {$ENDIF} + inherited laden(datei); +end; +{$ENDIF} + diff --git a/raetselunit.pas b/raetselunit.pas index c43d0f0..4e0ffae 100644 --- a/raetselunit.pas +++ b/raetselunit.pas @@ -4,8 +4,6 @@ unit raetselunit; interface -// TODO: Speichern/Laden - // TODO: Spielnummernzufall // TODO: Cross-Compilieren @@ -39,7 +37,9 @@ type besitzer: tForm; farbWahlFlaeche, zeichenflaeche: tImage; - erzeugeBtn: tButtonWithArrowKeys; + erzeugeBtn, + speichernBtn, + ladenBtn: tButtonWithArrowKeys; progressbar1: tProgressBar; aktuelleFarbe: tColor; function besitzerHoehe: longint; dynamic; @@ -51,6 +51,8 @@ type procedure onFarbWahlMouseMove(sender: tObject; shiftState: tShiftState; x,y: longint); procedure onFarbWahlMouseUp(sender: tObject; button: tMouseButton; shiftState: tShiftState; x,y: longint); procedure erzeugeOnClick(sender: tObject); + procedure speichernOnClick(sender: tObject); + procedure ladenOnClick(sender: tObject); procedure farbWahlFlaecheBemalen; procedure loeschen; dynamic; abstract; procedure leeren; dynamic; abstract; @@ -61,6 +63,8 @@ type function geloest: boolean; dynamic; abstract; procedure randErzeugen; dynamic; abstract; procedure startfelderFestlegen; dynamic; abstract; + procedure speichern(var datei: file); dynamic; + procedure laden(var datei: file); dynamic; public constructor create(aOwner: tForm); destructor destroy; override; @@ -95,6 +99,8 @@ type procedure gesamtRaenderErzeugen; dynamic; abstract; procedure startfelderfestlegen; override; procedure alsZugSpeichern; + procedure speichern(var datei: file); override; + procedure laden(var datei: file); override; public constructor create(aOwner: tForm; anzInhTypen: longint; alphabetFunktion: tAlphabetFunktion); destructor destroy; override; @@ -193,6 +199,7 @@ end; constructor tRaetsel.create(aOwner: tForm); begin inherited create; + randomize; besitzer:=aOwner; zeichenflaeche:=tImage.create(besitzer); zeichenflaeche.parent:=besitzer; @@ -204,11 +211,25 @@ begin farbWahlFlaeche.onMouseUp:=@onFarbWahlMouseUp; erzeugeBtn:=tButtonWithArrowKeys.create(besitzer); erzeugeBtn.parent:=besitzer; - erzeugeBtn.left:=spacing;; - erzeugeBtn.top:=spacing;; + erzeugeBtn.left:=spacing; + erzeugeBtn.top:=spacing; erzeugeBtn.caption:='Erzeugen!'; erzeugeBtn.onClick:=@erzeugeOnClick; erzeugeBtn.onKeyDown:=@onKeyDown; + speichernBtn:=tButtonWithArrowKeys.create(besitzer); + speichernBtn.parent:=besitzer; + speichernBtn.left:=erzeugeBtn.left+erzeugeBtn.width+spacing; + speichernBtn.top:=spacing; + speichernBtn.caption:='Speichern!'; + speichernBtn.onClick:=@speichernOnClick; + speichernBtn.onKeyDown:=@onKeyDown; + ladenBtn:=tButtonWithArrowKeys.create(besitzer); + ladenBtn.parent:=besitzer; + ladenBtn.left:=speichernBtn.left+speichernBtn.width+spacing; + ladenBtn.top:=spacing; + ladenBtn.caption:='Laden!'; + ladenBtn.onClick:=@ladenOnClick; + ladenBtn.onKeyDown:=@onKeyDown; progressbar1:=tProgressBar.create(besitzer); progressbar1.visible:=false; progressbar1.parent:=besitzer; @@ -228,7 +249,11 @@ end; function tRaetsel.besitzerBreite: longint; begin - result:=zeichenflaeche.width+zeichenflaeche.left+spacing; + result:= + max( + zeichenflaeche.width+zeichenflaeche.left, + ladenBtn.width+ladenBtn.left + )+spacing; end; procedure tRaetsel.zeichenFlaecheNeuKreieren; @@ -294,6 +319,38 @@ begin zeichnen; end; +procedure tRaetsel.speichernOnClick(sender: tObject); +var + saveDialog1: tSaveDialog; + dat: file; +begin + saveDialog1:=tSaveDialog.create(besitzer); + if saveDialog1.execute then begin + assignFile(dat,saveDialog1.fileName); + rewrite(dat,1); + speichern(dat); + closeFile(dat); + end; + saveDialog1.free; +end; + +procedure tRaetsel.ladenOnClick(sender: tObject); +var + openDialog1: tOpenDialog; + dat: file; +begin + openDialog1:=tOpenDialog.create(besitzer); + if openDialog1.execute then begin + assignFile(dat,openDialog1.fileName); + reset(dat,1); + laden(dat); + assert(eof(dat),'Zu viele Daten in Datei!'); + closeFile(dat); + zeichnen; + end; + openDialog1.free; +end; + procedure tRaetsel.farbWahlFlaecheBemalen; var i: integer; @@ -308,6 +365,16 @@ begin end; end; +procedure tRaetsel.speichern(var datei: file); +begin + blockWrite(datei,aktuelleFarbe,sizeOf(aktuelleFarbe)); +end; + +procedure tRaetsel.laden(var datei: file); +begin + blockRead(datei,aktuelleFarbe,sizeOf(aktuelleFarbe)); +end; + // tFelderRaetsel ************************************************************** constructor tFelderRaetsel.create(aOwner: tForm; anzInhTypen: longint; alphabetFunktion: tAlphabetFunktion); @@ -663,6 +730,102 @@ begin zuege[length(zuege)-1].vorherMalFarbe:=zuege[length(zuege)-2].nachherFarbe; end; +procedure tFelderRaetsel.speichern(var datei: file); +var + b: byte; + i: longint; +begin + blockWrite(datei,'Fe',2); + b:=byte(diagonalenCB.checked); + blockWrite(datei,b,1); + b:=byte(sudokuCB.enabled); + blockWrite(datei,b,1); + b:=byte(sudokuCB.checked); + blockWrite(datei,b,1); + i:=length(groeszen); + blockWrite(datei,i,sizeof(i)); + if length(groeszen)>0 then + blockWrite(datei,groeszen[0],length(groeszen)*sizeof(groeszen[0])); + i:=length(inhalt); + blockWrite(datei,i,sizeof(i)); + if length(inhalt)>0 then + blockWrite(datei,inhalt[0],length(inhalt)*sizeof(inhalt[0])); + i:=length(rand); + blockWrite(datei,i,sizeof(i)); + if length(rand)>0 then + blockWrite(datei,rand[0],length(rand)*sizeof(rand[0])); + blockWrite(datei,dim,sizeof(dim)); + blockWrite(datei,nSqrt,sizeof(nSqrt)); + blockWrite(datei,cursorPosition,sizeof(cursorPosition)); + i:=length(feldFarben); + blockWrite(datei,i,sizeof(i)); + if length(feldFarben)>0 then + blockWrite(datei,feldFarben[0],length(feldFarben)*sizeof(feldFarben[0])); + i:=length(startFeld); + blockWrite(datei,i,sizeof(i)); + if length(startFeld)>0 then + blockWrite(datei,startFeld[0],length(startFeld)*sizeof(startFeld[0])); + i:=length(zuege); + blockWrite(datei,i,sizeof(i)); + if length(zuege)>0 then + blockWrite(datei,zuege[0],length(zuege)*sizeof(zuege[0])); + inherited speichern(datei); +end; + +procedure tFelderRaetsel.laden(var datei: file); +var + s: string[2]; + b: byte; + i: longint; +begin + s:=#0#0; + b:=0; + i:=0; + blockRead(datei,s,2); + assert(s='Fe','Die zu lesende Datei ist kein Felder-Rätsel!'); + blockRead(datei,b,1); + assert(b<=1,'Syntaxfehler in Datei!'); + diagonalenCB.checked:=odd(b); + blockRead(datei,b,1); + assert(b<=1,'Syntaxfehler in Datei!'); + sudokuCB.enabled:=odd(b); + blockRead(datei,b,1); + assert(b<=1,'Syntaxfehler in Datei!'); + sudokuCB.checked:=odd(b); + blockRead(datei,i,sizeOf(i)); + assert(length(groeszen)=i,'Falsche Anzahl freier Paraemeter in gespeichertem Spiel!'); + if length(groeszen)>0 then + blockRead(datei,groeszen[0],length(groeszen)*sizeof(groeszen[0])); + for i:=0 to length(groeszen)-1 do + spinEdits[i+1].value:=groeszen[i]; + blockRead(datei,i,sizeOf(i)); + setLength(inhalt,i); + if length(inhalt)>0 then + blockRead(datei,inhalt[0],length(inhalt)*sizeof(inhalt[0])); + blockRead(datei,i,sizeOf(i)); + setLength(rand,i); + if length(rand)>0 then + blockRead(datei,rand[0],length(rand)*sizeof(rand[0])); + blockRead(datei,dim,sizeof(dim)); + blockRead(datei,nSqrt,sizeof(nSqrt)); + blockRead(datei,cursorPosition,sizeof(cursorPosition)); + blockRead(datei,i,sizeOf(i)); + setLength(feldFarben,i); + if length(feldFarben)>0 then + blockRead(datei,feldFarben[0],length(feldFarben)*sizeof(feldFarben[0])); + blockRead(datei,i,sizeOf(i)); + setLength(startFeld,i); + if length(startFeld)>0 then + blockRead(datei,startFeld[0],length(startFeld)*sizeof(startFeld[0])); + blockRead(datei,i,sizeOf(i)); + setLength(zuege,i); + if length(zuege)>0 then + blockRead(datei,zuege[0],length(zuege)*sizeof(zuege[0])); + inherited laden(datei); +end; + +// tHochhausRaetsel und tBuchstabenRaetsel + {$DEFINE create} constructor tHochhausRaetsel.create(aOwner: tForm); {$DEFINE hochhaus} @@ -785,5 +948,27 @@ function tBuchstabenRaetsel.anzLoesungen(lPos: integer): integer; {$UNDEF buchstaben} {$UNDEF anzLoesungen} +{$DEFINE speichern} +procedure tHochhausRaetsel.speichern(var datei: file); +{$DEFINE hochhaus} +{$I raetselunit.inc} +{$UNDEF hochhaus} +procedure tBuchstabenRaetsel.speichern(var datei: file); +{$DEFINE buchstaben} +{$I raetselunit.inc} +{$UNDEF buchstaben} +{$UNDEF speichern} + +{$DEFINE laden} +procedure tHochhausRaetsel.laden(var datei: file); +{$DEFINE hochhaus} +{$I raetselunit.inc} +{$UNDEF hochhaus} +procedure tBuchstabenRaetsel.laden(var datei: file); +{$DEFINE buchstaben} +{$I raetselunit.inc} +{$UNDEF buchstaben} +{$UNDEF laden} + end. -- cgit v1.2.3-70-g09d2