|
| Gemme/hente m.v. Fra : Skindbeni |
Dato : 08-07-05 17:01 |
|
Hej igen.
Ja, så har jeg igen lidt spørgsmål // problemer / opgaver eller hvad man nu
vil kalde dem), som er lidt svære for mig.
1) Jeg har før anvendt SaveDialog og OpenDialog i forbindelse med at gemme
en textfil. Altså gemme / åbne indholdet i en memo.
Men jeg har nu brug for at kunne gemme og åbne en række oplysninger - det
være sig i form af nogle valg og noget indhold i nogle editbokse, labels og
checkbokse m.v. Hvordan vil det kunne laves (uden brug af databaser).
2) Så er der igen det med beregninger og variabler.
Jeg har nogle forme med tilhørende units.
Fra start af har jeg oprettet et unit, hvor jeg gerne vil gemme konstanter
og variabler, som skal slå igennem i (stort set) samtlige forme. Den skal
dels hente data fra sig selv og fra de øvrige forme, som skal gemmes i
unitens variabler.
Men hvordan skal det gøres?
Indtil nu har jeg i setting-unit'ens interface skrevet:
---------------------
Interface
const
aar = 2005;
var
beloeb: integer;
---------------------
Men hvordan får jeg i min variabel herover gemt et resultat af en beregning
af tal fra en række editbokse i en anden form, så jeg kan arbejde videre med
variablens indhold i samtlige forme??
--
Med venlig hilsen
Skindbeni
alias Michael Sørensen
8700 Horsens
| |
Michael Haase (08-07-2005)
| Kommentar Fra : Michael Haase |
Dato : 08-07-05 18:18 |
|
Skindbeni skrev:
>
> Men jeg har nu brug for at kunne gemme og åbne en række oplysninger - det
> være sig i form af nogle valg og noget indhold i nogle editbokse, labels og
> checkbokse m.v. Hvordan vil det kunne laves (uden brug af databaser).
Du kan enten vælge at gemme det i en ini-fil, som vistnok automatisk
bliver gemt når programmet lukker ned, eller du kan selv gemme det i en
textfile, som du så selv skal huske at gemme.
> var
> beloeb: integer;
>
> ---------------------
>
> Men hvordan får jeg i min variabel herover gemt et resultat af en beregning
> af tal fra en række editbokse i en anden form, så jeg kan arbejde videre med
> variablens indhold i samtlige forme??
>
I den anden form (andenform) kan du skrive noget lignende som
FormMain.beloeb:= din beregning
Når beloeb så skal bruges i en beregning i en 3. form vil det så være:
NytBeloeb:=en_beregning(FormMain.beloeb);
hvor en_beregning er det der skal gøres ved beloeb.
--
Michael Haase
| |
Skindbeni (08-07-2005)
| Kommentar Fra : Skindbeni |
Dato : 08-07-05 18:32 |
|
Hej Michael,
og tak for dit svar.
Jeg faldt dog af i svinget
"Michael Haase" <micvans@netscape.net> skrev i en meddelelse
news:78f50$42ceb4ee$3e3d8433$29597@news.arrownet.dk...
> Skindbeni skrev:
>
>>
>> Men jeg har nu brug for at kunne gemme og åbne en række oplysninger - det
>> være sig i form af nogle valg og noget indhold i nogle editbokse, labels
>> og checkbokse m.v. Hvordan vil det kunne laves (uden brug af databaser).
>
> Du kan enten vælge at gemme det i en ini-fil, som vistnok automatisk
> bliver gemt når programmet lukker ned, eller du kan selv gemme det i en
> textfile, som du så selv skal huske at gemme.
Kan det lade sig gøre med en alm. textfile, når der _ikke_ er tale om, at
der skal gemmes en memo?
Det er som sagt indstillinger, valg og data fra editbokse m.v., der skal
gemmes.
>> var
>> beloeb: integer;
>>
>> ---------------------
>>
>> Men hvordan får jeg i min variabel herover gemt et resultat af en
>> beregning af tal fra en række editbokse i en anden form, så jeg kan
>> arbejde videre med variablens indhold i samtlige forme??
>>
> I den anden form (andenform) kan du skrive noget lignende som
>
> FormMain.beloeb:= din beregning
>
> Når beloeb så skal bruges i en beregning i en 3. form vil det så være:
>
> NytBeloeb:=en_beregning(FormMain.beloeb);
>
> hvor en_beregning er det der skal gøres ved beloeb.
Prøver at lave det til mit eksempel:
oEn Unit kaldet "Settings" (til brug for konstanter og variabler, der skal
slå igennem alle fomrs)
oEn form/unit kaldet "data"
- Herpå har jeg 3 editbokse.
oEn form/unit kaldet "beregning1"
oEn form/unit kaldet "beregning2"
I Unit'en Settings har jeg defineret mine konstanter. Ligeledes vil jeg
gerne i denne unit gemme nogle variabler, som skal hentes fra formen/uniten
"data"
Jeg har ingen problemer med at benytte variablen i formBeregning1 og
formBeregning2, når den først er gemt i Unit'en Settings, som er mit store
problem.
Hvis jeg i min unit "Settings" vil gemme summen af mine 3 editbokse på
formen "Data", hvordan gøres dette?
| |
Michael Haase (08-07-2005)
| Kommentar Fra : Michael Haase |
Dato : 08-07-05 22:35 |
|
Skindbeni skrev:
>
>
> Kan det lade sig gøre med en alm. textfile, når der _ikke_ er tale om, at
> der skal gemmes en memo?
>
> Det er som sagt indstillinger, valg og data fra editbokse m.v., der skal
> gemmes.
>
Hvis jeg forstår dig rigtigt, så burde du kunne bruge følgende princip:
procedure gemindstillinger;
var IndstillingerFil : textfile;
begin
assignfile(IndstillingerFil,'navnetpåfil');
rewrite(IndstillingerFil);
repeat
writeln(IndstillingerFil, værdi der skal gemmes);
until der ikke er flere indstillinger;
closeFile(IndstillingerFil);
end;
Når du skal indlæse indstillingerne igen benytter du en anden procedure:
procedure Hentindstillinger;
var IndstillingerFil : textfile;
begin
assignfile(IndstillingerFil,'navnetpåfil');
reset(IndstillingerFil);
repeat
readln(IndstillingerFil, værdi der skal hentes);
until der ikke er flere indstillinger;
closeFile(IndstillingerFil);
end;
Det er her kun princippet i det jeg har beskrevet.
>
> Prøver at lave det til mit eksempel:
>
> oEn Unit kaldet "Settings" (til brug for konstanter og variabler, der skal
> slå igennem alle fomrs)
> oEn form/unit kaldet "data"
> - Herpå har jeg 3 editbokse.
> oEn form/unit kaldet "beregning1"
> oEn form/unit kaldet "beregning2"
>
> I Unit'en Settings har jeg defineret mine konstanter. Ligeledes vil jeg
> gerne i denne unit gemme nogle variabler, som skal hentes fra formen/uniten
> "data"
>
> Jeg har ingen problemer med at benytte variablen i formBeregning1 og
> formBeregning2, når den først er gemt i Unit'en Settings, som er mit store
> problem.
>
> Hvis jeg i min unit "Settings" vil gemme summen af mine 3 editbokse på
> formen "Data", hvordan gøres dette?
>
Du bruger linjen
settings.variabel := data.edit1.text+data.edit2.text+data.edit3.text;
Husk dog lige selv strtoint eller strtofloat, da det jo er strenge der
hentes fra editbokse.
Så skal linjen placeres et passende sted, som måske kunne være når
editboksene ændres, dvs en onChange-event.
Håber jeg har gjort mig bare lidt mere forståelig nu
--
Michael Haase
| |
Skindbeni (18-07-2005)
| Kommentar Fra : Skindbeni |
Dato : 18-07-05 01:23 |
|
"Michael Haase" <micvans@netscape.net> skrev i en meddelelse
news:4b2ed$42cef15a$3e3d8433$21060@news.arrownet.dk...
Hej Michael... Nylig hjemkommen fra ferie har jeg kigget på dit svar til
mig... Med fare for at lyde "dum" (hvilket jeg i bund og grund vel (stadig)
også er indenfor emnet) har jeg lidt yderligere spørgsmål, kommentarer og
problemer hertil.
> Skindbeni skrev:
>>
>> Kan det lade sig gøre med en alm. textfile, når der _ikke_ er tale om, at
>> der skal gemmes en memo?
>>
>> Det er som sagt indstillinger, valg og data fra editbokse m.v., der skal
>> gemmes.
>>
> Hvis jeg forstår dig rigtigt, så burde du kunne bruge følgende princip:
>
> procedure gemindstillinger;
> var IndstillingerFil : textfile;
> begin
> assignfile(IndstillingerFil,'navnetpåfil');
> rewrite(IndstillingerFil);
> repeat
> writeln(IndstillingerFil, værdi der skal gemmes);
> until der ikke er flere indstillinger;
> closeFile(IndstillingerFil);
> end;
Herunder har jeg forsøgt noget a la dit forslag.
procedure TFormMain.miGemSomClick(Sender: TObject);
var
IndstillingerFil : textfile;
begin
If SaveDialog.Execute then
Begin
Assignfile(IndstillingerFil,SaveDialog.FileName);
Rewrite(IndstillingerFil);
Writeln(IndstillingerFil, edtEditBoks1.text);
Writeln(IndstillingerFil, edtEditBoks2.text);
CloseFile(IndstillingerFil)
end;
end;
Ovenstående minder om din, men jeg har udeladt repeat og until, da jeg ikke
har kunnet finde ud af deres mening... Jeg kan ikke se, hvordan man kan
bruge en repeat-until løkke her, idet mine indstillinger, der skal gemmes,
er en række indtastede ditbokse samt valgte combobokse, variabler m.v.
Samtidig er jeg i tvivl om jeg bruger linien
Writeln(IndstillingerFil, værdi der skal gemmes);
rigtigt?
Her har jeg forsøgt at skrive indstillinger / oplysninger, der skal gemmes i
min fil. Men kan det gøres således eller hvad gør jeg galt?
I min gemte fil bliver alle mine indstillinger gemt på hver sin linie. Det
er vel okay.
> Når du skal indlæse indstillingerne igen benytter du en anden procedure:
>
> procedure Hentindstillinger;
> var IndstillingerFil : textfile;
> begin
> assignfile(IndstillingerFil,'navnetpåfil');
> reset(IndstillingerFil);
> repeat
> readln(IndstillingerFil, værdi der skal hentes);
> until der ikke er flere indstillinger;
> closeFile(IndstillingerFil);
> end;
Ligesom ovenfor har jeg også prøvet mig frem her med nedenstående:
procedure TFormMain.miAabnClick(Sender: TObject);
Var
IndstillingerFil: Textfile;
begin
If OpenDialog.Execute then
Begin
AssignFile(IndstillingerFil,OpenDialog.Filename);
reset(IndstillingerFil);
Readln(IndstillingerFil, edtEditBoks1.text);
Readln(IndstillingerFil, edtEditBoks2.text);
CloseFile(IndstillingerFil)
end;
end;
Her har jeg igen undladt repeat-until af samme årsag som ovenfor.
Samtidig opstår der en fejl. Jeg får flg. fejlmeddelelse, når jeg prøver at
kompilere:
"left side cannot be assignet to"
Fejlen opstår ud fra linierne
Readln(Indstillinger,Fil, edtEditBoks1.text);
og
Readln(Indstillinger,Fil, edtEditBoks2.text);
Hvordan får jeg korrekt hentet mine indstillinger igen. Hvad gør jeg galt?
***********TILLÆGSSPØRGSMÅL:***********
Jeg har nogle - måske kryptiske - spørgsmål, som du / i måske også kan svare
på:
- Kan man lade savedialog-boksen foreslå et standard bibliotek?
- Kan man lade savedialog-boksen automatisk give filen et givent efternavn.
Jeg vil eksempelvis have alle filnavne til at ende på .sks. Jeg har i
propertien "filter" indsat denne type, men når jeg gemmer min fil og jeg
IKKE manuelt skriver ".sks" efter mit filnavn, så bliver filen til en fil i
formatet "fil" i stedet for formatet "sks"
| |
Lars G (18-07-2005)
| Kommentar Fra : Lars G |
Dato : 18-07-05 03:46 |
|
Skindbeni wrote:
>
> Fejlen opstår ud fra linierne
> Readln(Indstillinger,Fil, edtEditBoks1.text);
> og
> Readln(Indstillinger,Fil, edtEditBoks2.text);
>
> Hvordan får jeg korrekt hentet mine indstillinger igen. Hvad gør jeg galt?
>
Prøv følgende
Var
temp :string;
Readln(Indstillinger,Fil, temp);
edtEditBoks1.text := temp;
Mvh
Lars G
| |
Michael Haase (18-07-2005)
| Kommentar Fra : Michael Haase |
Dato : 18-07-05 12:35 |
|
Skindbeni skrev:
> Ovenstående minder om din, men jeg har udeladt repeat og until, da jeg ikke
> har kunnet finde ud af deres mening... Jeg kan ikke se, hvordan man kan
> bruge en repeat-until løkke her, idet mine indstillinger, der skal gemmes,
> er en række indtastede ditbokse samt valgte combobokse, variabler m.v.
Ok, det var måske nok heller ikke det smarteste at jeg brugte
repeat-until. Meningen er bare at du skal blive ved med at bruge
linien
Writeln(IndstillingerFil, værdi der skal gemmes);
indtil du har fået gemt alle indstillinger, dvs f,eks
Writeln(IndstillingerFil, edtEditBoks1.text);
Writeln(IndstillingerFil, edtEditBoks2.text);
...
Writeln(IndstillingerFil, edtEditBoks77.text);
eller hvor mange du nu har.
> I min gemte fil bliver alle mine indstillinger gemt på hver sin linie. Det
> er vel okay.
De bliver gemt på hver sin linje fordi der bliver brugt writeln, hvis du
bruger write istedet bliver de skrevet på en lang linje, hvilket du også
kan gøre hvis det kun er tal, eller strenge hvis længder du kender. Du
skal så bare huske mellemrum mellem de enkelte værdier.
> Ligesom ovenfor har jeg også prøvet mig frem her med nedenstående:
>
> procedure TFormMain.miAabnClick(Sender: TObject);
> Var
> IndstillingerFil: Textfile;
> begin
> If OpenDialog.Execute then
> Begin
> AssignFile(IndstillingerFil,OpenDialog.Filename);
> reset(IndstillingerFil);
> Readln(IndstillingerFil, edtEditBoks1.text);
> Readln(IndstillingerFil, edtEditBoks2.text);
> CloseFile(IndstillingerFil)
> end;
> end;
>
> Her har jeg igen undladt repeat-until af samme årsag som ovenfor.
>
> Samtidig opstår der en fejl. Jeg får flg. fejlmeddelelse, når jeg prøver at
> kompilere:
>
> "left side cannot be assignet to"
>
> Fejlen opstår ud fra linierne
> Readln(Indstillinger,Fil, edtEditBoks1.text);
> og
> Readln(Indstillinger,Fil, edtEditBoks2.text);
>
> Hvordan får jeg korrekt hentet mine indstillinger igen. Hvad gør jeg galt?
Jeg har nok ikke forklaret mig godt nok her.
Editboksen skal sættes lig med den indlæste værdi, som i Lars G's svar,
så hvis det er en værdi i en editboks:
Var
temp :string;
Readln(Indstillinger,Fil, temp);
edtEditBoks1.text := temp;
og hvis det er en variabel:
Var
tempvalue :integer;
Readln(IndstillingerFil, tempvalue);
a := tempvalue;
>
> ***********TILLÆGSSPØRGSMÅL:***********
>
> Jeg har nogle - måske kryptiske - spørgsmål, som du / i måske også kan svare
> på:
>
> - Kan man lade savedialog-boksen foreslå et standard bibliotek?
>
Jepper, i object inspector for savedialog-boksen, skal du bare indsætte
det ønskede bibliotek under initialDir.
> - Kan man lade savedialog-boksen automatisk give filen et givent efternavn.
> Jeg vil eksempelvis have alle filnavne til at ende på .sks. Jeg har i
> propertien "filter" indsat denne type, men når jeg gemmer min fil og jeg
> IKKE manuelt skriver ".sks" efter mit filnavn, så bliver filen til en fil i
> formatet "fil" i stedet for formatet "sks"
Prøv med at sætte *.sks ind i defaultExt i object inspector.
--
Michael Haase
| |
Skindbeni (22-07-2005)
| Kommentar Fra : Skindbeni |
Dato : 22-07-05 21:28 |
|
"Michael Haase" <micvans@netscape.net> skrev i en meddelelse
news:4e784$42db9387$3e3d8433$21161@news.arrownet.dk...
> Skindbeni skrev:
> Jeg har nok ikke forklaret mig godt nok her.
> Editboksen skal sættes lig med den indlæste værdi, som i Lars G's svar, så
> hvis det er en værdi i en editboks:
>
> Var
> temp :string;
>
> Readln(Indstillinger,Fil, temp);
> edtEditBoks1.text := temp;
>
> og hvis det er en variabel:
>
> Var
> tempvalue :integer;
>
> Readln(IndstillingerFil, tempvalue);
> a := tempvalue;
Nu er jeg ved at have fanget den
Men er det rigtigt forstået, at det både er linien:
Readln(Indstillinger,Fil, temp); / Readln(IndstillingerFil, tempvalue);
_og linien_
edtEditBoks1.text := temp; / a := tempvalue;
der skal skrives for hver gemt indstilling, der ønskes genindlæstj?
>> ***********TILLÆGSSPØRGSMÅL:***********
>>
>> Jeg har nogle - måske kryptiske - spørgsmål, som du / i måske også kan
>> svare på:
>>
>> - Kan man lade savedialog-boksen foreslå et standard bibliotek?
>>
> Jepper, i object inspector for savedialog-boksen, skal du bare indsætte
> det ønskede bibliotek under initialDir.
Hvis jeg nu skal være krævende... (det er måske ikke så meget med Delphi
/ Pascal at gøre)
Jeg vil gerne have oprettet en mappe under dokumenter i Windows, der fx
anvendes til disse *.sks filer.
Men dokumenter i Windows XP hedder jo et eller andet sindsygt, der ofte
inkluderer PC'ens brugers navn.
Eksempelvis er det fulde sti-navn til mit dokumenter-bibliotek følgende:
C:\Documents and Settings\Michael Sørensen\Dokumenter\
Er der en "løsning" i Delphi, hvor man kan indhente oplysninger om stiens
navn til "dokumenter" eller en anden måde for at få automatisk oprettet en
mappe, der placeres i dokumenter?.
Er dette ikke muligt, så er det ikke noget, som I behøver bruge tid på, da
det kun er en "detalje" som ville være ønskeligt, men ikke yderst
nødvendigt.
>> - Kan man lade savedialog-boksen automatisk give filen et givent
>> efternavn. Jeg vil eksempelvis have alle filnavne til at ende på .sks.
>> Jeg har i propertien "filter" indsat denne type, men når jeg gemmer min
>> fil og jeg IKKE manuelt skriver ".sks" efter mit filnavn, så bliver filen
>> til en fil i formatet "fil" i stedet for formatet "sks"
>
> Prøv med at sætte *.sks ind i defaultExt i object inspector.
Jeg forsøgte ovenstående, men uden virkning. Hvis andre skulle få samme
problem, så fik jeg det til at virke ved at undlade "*." og udelukkende
skrive "sks"
Men tak for hjælpen, Michael (og andre). Super at folk vil bruge tid på
individuelle problemer, der virker for komplekse i en lærebog
| |
Michael Haase (23-07-2005)
| Kommentar Fra : Michael Haase |
Dato : 23-07-05 12:32 |
|
Skindbeni skrev:
>
> Nu er jeg ved at have fanget den
>
> Men er det rigtigt forstået, at det både er linien:
>
> Readln(Indstillinger,Fil, temp); / Readln(IndstillingerFil, tempvalue);
>
> _og linien_
>
> edtEditBoks1.text := temp; / a := tempvalue;
>
> der skal skrives for hver gemt indstilling, der ønskes genindlæstj?
Ja, for hver indstilling skal du indlæse i en midlertidig variabel, som
så skal gemmes i den ønskede editboks/combobox/checkbox/Variable og hvad
du ellers har, så det kan nemt blive en længere procedure.
>
> Hvis jeg nu skal være krævende... (det er måske ikke så meget med Delphi
> / Pascal at gøre)
>
> Jeg vil gerne have oprettet en mappe under dokumenter i Windows, der fx
> anvendes til disse *.sks filer.
>
> Men dokumenter i Windows XP hedder jo et eller andet sindsygt, der ofte
> inkluderer PC'ens brugers navn.
>
> Eksempelvis er det fulde sti-navn til mit dokumenter-bibliotek følgende:
>
> C:\Documents and Settings\Michael Sørensen\Dokumenter\
>
> Er der en "løsning" i Delphi, hvor man kan indhente oplysninger om stiens
> navn til "dokumenter" eller en anden måde for at få automatisk oprettet en
> mappe, der placeres i dokumenter?.
>
> Er dette ikke muligt, så er det ikke noget, som I behøver bruge tid på, da
> det kun er en "detalje" som ville være ønskeligt, men ikke yderst
> nødvendigt.
>
Jeg har fået gravet det her frem fra nettets tåger, som gemmer indholdet
i memo1 i dokumenter/sks/test.sks:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, ShlObj, activex;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
SaveDialog1: TSaveDialog;
function GetShellpath( csidl: Integer ): String;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Function Tform1.GetShellpath( csidl: Integer ): String;
Var
pidl: PItemIDList;
buf: Array[0..MAX_PATH] of Char;
begin
Result := '';
If Succeeded( ShGetSpecialFolderLocation( 0, csidl, pidl ))
Then Begin
If ShGetPathfromIDList( pidl, buf ) Then
Result := buf;
CoTaskMemFree(pidl);
End;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Lines.SaveToFile(GetSHellPath( CSIDL_PERSONAL
)+'/sks/test.sks');
end;
end.
Det kræver så bare at biblioteket 'sks' findes under dokumenter.
--
Michael Haase
| |
Skindbeni (22-07-2005)
| Kommentar Fra : Skindbeni |
Dato : 22-07-05 23:13 |
|
"Michael Haase" <micvans@netscape.net> skrev i en meddelelse
news:4e784$42db9387$3e3d8433$21161@news.arrownet.dk...
> Jeg har nok ikke forklaret mig godt nok her.
> Editboksen skal sættes lig med den indlæste værdi, som i Lars G's svar, så
> hvis det er en værdi i en editboks:
>
> Var
> temp :string;
>
> Readln(Indstillinger,Fil, temp);
> edtEditBoks1.text := temp;
>
> og hvis det er en variabel:
>
> Var
> tempvalue :integer;
>
> Readln(IndstillingerFil, tempvalue);
> a := tempvalue;
Hvordan klares ovenstående, når der er tale om eksempelvis en checkbox er
markeret eller ej.
Det virker ikke med var temp: string;
Jeg har yderligere prøvet med var temp: boolean;
På forhånd tak.
| |
Nico de Jong (23-07-2005)
| Kommentar Fra : Nico de Jong |
Dato : 23-07-05 07:12 |
|
"Skindbeni" <ms1@FJERNDETTEskindbeni.dk> skrev i en meddelelse
news:42e16f72$0$7367$ba624c82@nntp02.dk.telia.net...
> Hvordan klares ovenstående, når der er tale om eksempelvis en checkbox
er
> markeret eller ej.
>
Nedenfor er et klip fra et program hvor jeg havde tilsvarende problem.
Gentagelser osv er klippet væk
strg := nbcdata + 'nbcentry.dat';
assignfile(savedata,strg);
rewrite(savedata);
with params do
begin
writeln(savedata, 'originator ' + combobox9.text);
writeln(savedata, 'type ' + combobox10.text);
if combobox2.text = '' then
application.messagebox(pchar(nbctxt[192]),pchar(nbctxt[002]),mb_ok)
(*
default value *)
else
writeln(savedata, 'recipient ' + combobox2.text);
writeln(savedata, 'exercise ' + edit6.text);
writeln(savedata, 'unitsize ' + combobox1.text);
writeln(savedata, 'modem ' + yesno(checkbox1.checked));
writeln(savedata, 'adsl ' + yesno(checkbox2.checked));
writeln(savedata, 'auto ' + yesno(checkbox10.checked));
closefile(savedata);
end;
Funktionen yesno kommer her :
function yesno(boo: boolean): string;
begin
if boo then
yesno := 'checked'
else
yesno := 'unchecked';
end;
Med andre ord, hvis en checkbox er checked, skrives CHECKED i filen,
ellers UNCHECKED . Du kan selvfølgelig rette det til TRUE eller FALSE e.l.
Når man så skal sætte en checkbox igen, afhængig af hvad der står i filen,
kan det ske som flg.: (jeg har igen klippet en del)
assignfile(tekst,strg);
reset(tekst);
while not eof(tekst) do
begin
readln(tekst,stra);
strb := stra;
setlength(strb,pos(' ',strb) - 1);
strb := ansiuppercase(strb);
strc := stra;
delete(strc,1,length(strb) + 1);
stre := ansiuppercase(strc);
if strb = 'UNITSIZE' then
combobox1.text := stre;
if strb = 'SMTP' then
edit1.text := strc;
if strb = 'MODEM' then
checkbox1.checked := stre = 'CHECKED';
if strb = 'LANGUAGE' then
begin
checkbox4.checked := stre = 'DANSK';
checkbox5.checked := stre = 'DEUTSCH';
checkbox6.checked := stre = 'ENGLISH';
checkbox7.checked := stre = 'FRANCAIS';
checkbox8.checked := stre = 'HOLLANDS';
checkbox9.checked := stre = 'SPARE'; (* spare language *)
read_abb;
end;
end (* while not eof *);
closefile(tekst);
Nico
(Så får vi se om Michael H. har kommentarer; har har ihvertfald en rimelig
erfaren læremester (mig))
| |
Skindbeni (23-07-2005)
| Kommentar Fra : Skindbeni |
Dato : 23-07-05 12:24 |
|
"Nico de Jong" <first_name@FARUMDATA.DK> skrev i en meddelelse
news:sclEe.7$8H2.4@news.get2net.dk...
>
> "Skindbeni" <ms1@FJERNDETTEskindbeni.dk> skrev i en meddelelse
> news:42e16f72$0$7367$ba624c82@nntp02.dk.telia.net...
>> Hvordan klares ovenstående, når der er tale om eksempelvis en checkbox
> er
>> markeret eller ej.
>>
> Nedenfor er et klip fra et program hvor jeg havde tilsvarende problem.
> Gentagelser osv er klippet væk
>
> strg := nbcdata + 'nbcentry.dat';
> assignfile(savedata,strg);
> rewrite(savedata);
> with params do
> begin
> writeln(savedata, 'originator ' + combobox9.text);
> writeln(savedata, 'type ' + combobox10.text);
> if combobox2.text = '' then
> application.messagebox(pchar(nbctxt[192]),pchar(nbctxt[002]),mb_ok)
> (*
> default value *)
> else
> writeln(savedata, 'recipient ' + combobox2.text);
> writeln(savedata, 'exercise ' + edit6.text);
> writeln(savedata, 'unitsize ' + combobox1.text);
> writeln(savedata, 'modem ' + yesno(checkbox1.checked));
> writeln(savedata, 'adsl ' + yesno(checkbox2.checked));
> writeln(savedata, 'auto ' + yesno(checkbox10.checked));
> closefile(savedata);
> end;
>
> Funktionen yesno kommer her :
>
> function yesno(boo: boolean): string;
> begin
> if boo then
> yesno := 'checked'
> else
> yesno := 'unchecked';
> end;
>
> Med andre ord, hvis en checkbox er checked, skrives CHECKED i filen,
> ellers UNCHECKED . Du kan selvfølgelig rette det til TRUE eller FALSE e.l.
>
> Når man så skal sætte en checkbox igen, afhængig af hvad der står i filen,
> kan det ske som flg.: (jeg har igen klippet en del)
>
> assignfile(tekst,strg);
> reset(tekst);
> while not eof(tekst) do
> begin
> readln(tekst,stra);
> strb := stra;
> setlength(strb,pos(' ',strb) - 1);
> strb := ansiuppercase(strb);
> strc := stra;
> delete(strc,1,length(strb) + 1);
> stre := ansiuppercase(strc);
> if strb = 'UNITSIZE' then
> combobox1.text := stre;
> if strb = 'SMTP' then
> edit1.text := strc;
> if strb = 'MODEM' then
> checkbox1.checked := stre = 'CHECKED';
> if strb = 'LANGUAGE' then
> begin
> checkbox4.checked := stre = 'DANSK';
> checkbox5.checked := stre = 'DEUTSCH';
> checkbox6.checked := stre = 'ENGLISH';
> checkbox7.checked := stre = 'FRANCAIS';
> checkbox8.checked := stre = 'HOLLANDS';
> checkbox9.checked := stre = 'SPARE'; (* spare language *)
> read_abb;
> end;
> end (* while not eof *);
> closefile(tekst);
Hej Nico.
Findes der ingen nemmere måde, som når det er en almindelig editboks indhold
(text), der skal gemmes eller hentes?
Jeg har prøvet at ændre variablen, så den går fra at hedde
var temp: string;
til
var temp: boolean;
Da det jo er typen boolean og _ikke_ string, som jeg skal bruge (her
refererer jeg ikke til dit indlæg, men til Michaels og mit eget).
Eller er der ingen simpel måde, hvorpå du kan gemme og hente en boolsk
værdi?
| |
Michael Haase (23-07-2005)
| Kommentar Fra : Michael Haase |
Dato : 23-07-05 12:44 |
|
Skindbeni skrev:
> Findes der ingen nemmere måde, som når det er en almindelig editboks indhold
> (text), der skal gemmes eller hentes?
>
> Jeg har prøvet at ændre variablen, så den går fra at hedde
> var temp: string;
>
> til
>
> var temp: boolean;
>
> Da det jo er typen boolean og _ikke_ string, som jeg skal bruge (her
> refererer jeg ikke til dit indlæg, men til Michaels og mit eget).
>
> Eller er der ingen simpel måde, hvorpå du kan gemme og hente en boolsk
> værdi?
>
Jeg mener man bliver nødt til at lave omvejen med at gemme det enten som
en streng, eller evt som 0 eller 1, da det så vidt jeg ved er sådan
Delphi giver resultatet internt, som så bliver "oversat" til true/false,
da det er nemmere for mennesker at forstå.
Jeg har lige opdaget at der faktisk er et par funktioner, der hedder
BoolToStr og StrToBool, som hhv kan oversætte Boolean til strenge og
omvendt.
--
Michael Haase
| |
Skindbeni (08-07-2005)
| Kommentar Fra : Skindbeni |
Dato : 08-07-05 18:56 |
|
"Skindbeni" <ms1@FJERNDETTEskindbeni.dk> skrev i en meddelelse
news:42cea32b$0$21443$ba624c82@nntp06.dk.telia.net...
> 2) Så er der igen det med beregninger og variabler.
>
> Jeg har nogle forme med tilhørende units.
>
> Fra start af har jeg oprettet et unit, hvor jeg gerne vil gemme konstanter
> og variabler, som skal slå igennem i (stort set) samtlige forme. Den skal
> dels hente data fra sig selv og fra de øvrige forme, som skal gemmes i
> unitens variabler.
>
> Men hvordan skal det gøres?
>
> Indtil nu har jeg i setting-unit'ens interface skrevet:
>
> ---------------------
>
> Interface
>
> const
> aar = 2005;
>
> var
> beloeb: integer;
>
> ---------------------
>
> Men hvordan får jeg i min variabel herover gemt et resultat af en
> beregning af tal fra en række editbokse i en anden form, så jeg kan
> arbejde videre med variablens indhold i samtlige forme??
Kunne i øvrigt også godt bruge hjælp til denne (simple) beregning
I en form har jeg 4 editbokse.
Edt1, Edt2, Edt3, Edt4.
Jeg skal have fundet (Edt1+Edt2)-(Edt3+Edt4). Dette kan jeg sagtens, hvis
det foregår i een procedure.
Dette vil jeg dog gerne have delt op, således at første parantes udregnes i
een procedure og udregningen i parantes 2 i en anden procedure og resultatet
af den første minus den anden parantes i en 3. procedure.
Hvis det skulle gøres i een procedure, har jeg gjort sådan:
Procedure Beregn;
Var
a: integer;
Begin
a:= (StrToIntDef(Edt1.text,0) +
StrToIntDef(Edt2.text,0)) -
(StrToIntDef(Edt3.text,0) +
StrToIntDef(Edt4.text,0));
End;
Men jeg ønsker som sagt, at det skal deles op og har forsøgt a la:
Procedure A;
Var
a:integer;
Begin
a:= StrToIntDef(Edt1.text,0) + StrToIntDef(Edt2.text,0);
End;
Procedure B;
Var
b:integer;
Begin
b:= StrToIntDef(Edt3.text,0) + StrToIntDef(Edt4.text,0);
End;
Procedure Resutlat;
Var
c:integer;
Begin
End;
I sidste procedure er jeg så stået af.
Men hvor langt er jeg fra en rigtig / brugbar løsning?
| |
Lars HT (08-07-2005)
| Kommentar Fra : Lars HT |
Dato : 08-07-05 19:06 |
|
"Skindbeni" <ms1@FJERNDETTEskindbeni.dk> wrote in message
news:42cebe39$0$21449$ba624c82@nntp06.dk.telia.net...
bla bla
Function A:integer;
Begin
result:= StrToIntDef(Edt1.text,0) + StrToIntDef(Edt2.text,0);
End;
Function B:integer;
Begin
result:= StrToIntDef(Edt3.text,0) + StrToIntDef(Edt4.text,0);
End;
Procedure Resultat;
var
res:integer;
Begin
res:=A-B;
showmessage('Resultatet er: '+inttostr(res));
End;
| |
Skindbeni (08-07-2005)
| Kommentar Fra : Skindbeni |
Dato : 08-07-05 20:21 |
|
"Lars HT" <aslaktoke@yahoo.danmark> skrev i en meddelelse
news:42cec099$0$21448$ba624c82@nntp06.dk.telia.net...
>
> "Skindbeni" <ms1@FJERNDETTEskindbeni.dk> wrote in message
> news:42cebe39$0$21449$ba624c82@nntp06.dk.telia.net...
>
> bla bla
>
> Function A:integer;
> Begin
> result:= StrToIntDef(Edt1.text,0) + StrToIntDef(Edt2.text,0);
> End;
>
> Function B:integer;
> Begin
> result:= StrToIntDef(Edt3.text,0) + StrToIntDef(Edt4.text,0);
> End;
>
> Procedure Resultat;
> var
> res:integer;
> Begin
> res:=A-B;
> showmessage('Resultatet er: '+inttostr(res));
> End;
Hej Lars.
Hvilken forskel gør det, at du anvender function i stedet for procedure i de
to øverste?
| |
Lars HT (08-07-2005)
| Kommentar Fra : Lars HT |
Dato : 08-07-05 22:05 |
|
"Skindbeni" <ms1@FJERNDETTEskindbeni.dk> wrote in message
news:42ced212$0$21449$ba624c82@nntp06.dk.telia.net...
> Hej Lars.
>
> Hvilken forskel gør det, at du anvender function i stedet for procedure i
> de to øverste?
Funktioner leverer et resultat tilbage, det gør en procedure ikke.
Eksempel: Du ønsker at lægge to tal X og Y sammen og placere resultatet i Z
Variablen Z erklæres:
var
Z:integer;
....og en procedure skrives:
Procedure LaegSammenProcedure (X,Y:integer);
begin
Z:=X+Y;
end;
....samt en funktion:
function LaegSammenFunction (X,Y;integer):integer;
begin
result:=X+Y;
end;
NB: "result" er navnet på den variabel, som en function benytter til at
levere et resultat med. I dette tilfælde er den af typen integer (pga.
":integer" i slutningen af funktions-deklarationen.
Nu skal der regnes:
når du kører følgende to tilfælde:
LaegSammenProcedure(8,10);
Z:=LaegSammenFunction(8,10),
....vil Z i begge tilfælde indeholde tallet 18, så her er det hip som hap!
Hvorfor så bruge en funktion?
Fordi den kan genbruges!
Eksempel:
Nu vil du ikke have resultatet af beregningen i variablen Z, men hellere i
variablen W:
Hvis du kun har din procedure, må du skrive en helt ny, som lægger
beregningen i W istedet for Z, men har du lavet en funktion til at beregne
med, behøver du bare at erklære variablen W og skrive:
W:=LaegSammenFunction(8,10);
Forestil dig at skulle foretage 100 beregninger, som skulle placeres i hver
sin variabel!
Hvis du ser på eksemplerne illustrerer de også en smart måde at kunne
genbruge dem til input af de tal, som der skal regnes på:
Din procedure (omskrevet til eksemplet):
Procedure LaegSammen1;
begin
resultat1:=StrToInt(edit1.text)+StrToInt(edit2.text);
end;
Her er intet at genbruge! Hvis ikke det drejer sig om de to editbokse eller
at resultatet skal lægges i variablen resultat1 - ja, så må du lave en ny
proceduer, som du jo også har gjort, men hvis du laver det som en
funktion(tal1,tal2:integer):integer;
kan du genbruge den i al evighed!
I dit tilfælde kan du altså nøjes med to funktioner - en som lægger sammen -
og en, som trækker fra!
Håber, at det var forståeligt!
Lars
| |
Skindbeni (08-07-2005)
| Kommentar Fra : Skindbeni |
Dato : 08-07-05 22:17 |
|
"Lars HT" <aslaktoke@yahoo.danmark> skrev i en meddelelse
news:42ceea7b$0$21458$ba624c82@nntp06.dk.telia.net...
>
> "Skindbeni" <ms1@FJERNDETTEskindbeni.dk> wrote in message
> news:42ced212$0$21449$ba624c82@nntp06.dk.telia.net...
>> Hej Lars.
>>
>> Hvilken forskel gør det, at du anvender function i stedet for procedure i
>> de to øverste?
>
>
> Funktioner leverer et resultat tilbage, det gør en procedure ikke.
>
> Eksempel: Du ønsker at lægge to tal X og Y sammen og placere resultatet i
> Z
>
> Variablen Z erklæres:
> var
> Z:integer;
>
> ...og en procedure skrives:
>
> Procedure LaegSammenProcedure (X,Y:integer);
> begin
> Z:=X+Y;
> end;
>
> ...samt en funktion:
>
> function LaegSammenFunction (X,Y;integer):integer;
> begin
> result:=X+Y;
> end;
>
> NB: "result" er navnet på den variabel, som en function benytter til at
> levere et resultat med. I dette tilfælde er den af typen integer (pga.
> ":integer" i slutningen af funktions-deklarationen.
>
> Nu skal der regnes:
>
> når du kører følgende to tilfælde:
>
> LaegSammenProcedure(8,10);
> Z:=LaegSammenFunction(8,10),
>
> ...vil Z i begge tilfælde indeholde tallet 18, så her er det hip som hap!
>
> Hvorfor så bruge en funktion?
>
> Fordi den kan genbruges!
>
> Eksempel:
> Nu vil du ikke have resultatet af beregningen i variablen Z, men hellere i
> variablen W:
> Hvis du kun har din procedure, må du skrive en helt ny, som lægger
> beregningen i W istedet for Z, men har du lavet en funktion til at beregne
> med, behøver du bare at erklære variablen W og skrive:
>
> W:=LaegSammenFunction(8,10);
>
> Forestil dig at skulle foretage 100 beregninger, som skulle placeres i
> hver sin variabel!
>
> Hvis du ser på eksemplerne illustrerer de også en smart måde at kunne
> genbruge dem til input af de tal, som der skal regnes på:
>
> Din procedure (omskrevet til eksemplet):
>
> Procedure LaegSammen1;
> begin
> resultat1:=StrToInt(edit1.text)+StrToInt(edit2.text);
> end;
>
> Her er intet at genbruge! Hvis ikke det drejer sig om de to editbokse
> eller at resultatet skal lægges i variablen resultat1 - ja, så må du lave
> en ny proceduer, som du jo også har gjort, men hvis du laver det som en
>
> funktion(tal1,tal2:integer):integer;
>
> kan du genbruge den i al evighed!
>
> I dit tilfælde kan du altså nøjes med to funktioner - en som lægger
> sammen - og en, som trækker fra!
>
> Håber, at det var forståeligt!
Jo tak Lars.
Jeg tager ud af døren på ferie nu, men har lavet et print af ovenstående,
til efter ferien.
Nogle gange er det bedre at få tingene forklaret herinde med "skræddersyede"
eksempler end i en lærebog.
Men endnu engang tak for din tid og hjælp.
| |
Lars HT (08-07-2005)
| Kommentar Fra : Lars HT |
Dato : 08-07-05 22:25 |
|
"Skindbeni" <ms1@FJERNDETTEskindbeni.dk> wrote in message
news:42ceed2f$0$21463$ba624c82@nntp06.dk.telia.net...
>
> Jeg tager ud af døren på ferie nu, men har lavet et print af ovenstående,
> til efter ferien.
>
God ferie - er selv væk i tre uger!
> Nogle gange er det bedre at få tingene forklaret herinde med
> "skræddersyede" eksempler end i en lærebog.
>
Denne her er altså rigtig god til at få overblik over det, du har brug for:
Per Amdal Steffensen: Delphi 4 Programmering. Systime 1999
Fås på biblioteket!
> Men endnu engang tak for din tid og hjælp.
>
Velbekomme!
| |
Skindbeni (09-07-2005)
| Kommentar Fra : Skindbeni |
Dato : 09-07-05 00:17 |
|
"Lars HT" <aslaktoke@yahoo.danmark> skrev i en meddelelse
news:42ceef23$0$21444$ba624c82@nntp06.dk.telia.net...
>
> "Skindbeni" <ms1@FJERNDETTEskindbeni.dk> wrote in message
> news:42ceed2f$0$21463$ba624c82@nntp06.dk.telia.net...
>
>>
>> Jeg tager ud af døren på ferie nu, men har lavet et print af ovenstående,
>> til efter ferien.
>>
> God ferie - er selv væk i tre uger!
Jo tak i lige måde.
>> Nogle gange er det bedre at få tingene forklaret herinde med
>> "skræddersyede" eksempler end i en lærebog.
>>
>
> Denne her er altså rigtig god til at få overblik over det, du har brug
> for: Per Amdal Steffensen: Delphi 4 Programmering. Systime 1999
> Fås på biblioteket!
Ja og så alligevel ikke.
Bogen er både udsolgt og udgået fra forlaget og hverken laves eller kan
købes længere. Forlaget har makuleret alt materiale vedr. bogen og derfor
kan hverken bogens og CD'ens indhold skaffes længere.
Bogen findes heller ikke på mit bibliotek, men jeg har fået den bestilt hjem
fra et andet. Men her følger bogens CD-rom ikke med, den ligger stadig på et
fjernt biblioteks lokalitet. Øv, da en del af bogens kapitler incl.
eksempler ligger herpå.
| |
|
|