Avatar billede Slettet bruger
08. juni 2006 - 18:47 Der er 24 kommentarer og
1 løsning

gemme image til næste gang programmet startes

jeg har følgende kode:

if
op.Execute then
Image1.Picture.LoadFromFile(op.FileName); // op er TOpenPictureDialog
if
Checkbox1.Checked then
kvitering.QRImage1.Picture := image1.picture;

det jeg er ude efter er at når det valgte billede er valgt, så skal programmet hente den automatisk hver gang checkbox1 er checked men uden at bruge op.execute

men den valgte logo.gif kunne også hedde noget andet - logo.jpg osv...

hvordan kan jeg gemme det valgte billede så når programmet startes næste gang så bliver det valgte billede vist via ovenstående kode?

alle indstillinger i checkbox gemmer jeg i en ini fil - det er på plads.


Det optimale vil være at når "op" køres og man vælger et billede så kopieres det til et underbibliotek i biblioteket hvor *. exe filen er - og alle indstillinger gemmes så når
programmet køres bliver billedet hentet og vist.

synes det er lidt svært at formulere men bær over med mig og spørg endelig hvis i er i tvivl om hvad jeg mener.
lige en beskrivelse af programmet:

Man skal med programmet kunne designe sin egen kvittering i en light udgave

i design vinduet vælges det billede(logo) som skal være i kvittering(qrrapport)
en label under billedet bekriver firmaet

3 labels (ude til højre i qrrapport)
firmanavn
adresse
postnr by
6 checkbox når de er checked vises den tekst fra 6 edit i qrrapport
Avatar billede nca Juniormester
08. juni 2006 - 18:53 #1
Hvis jeg forstår dig ret, kunne du oprette en undermappe, som du kopierede det valgte logo til. I din ini-fil laver du en nøgle, der hedder logo og en key, hvor du skriver navnet på logofilen. Hvis Checkbo1 er markeret, indlæser du filen.
Avatar billede Slettet bruger
08. juni 2006 - 19:13 #2
yep det er i store træk det jeg vil.
Avatar billede nca Juniormester
08. juni 2006 - 19:56 #3
Hvad så?
Skal du ha' mere hjælp?
Avatar billede Slettet bruger
08. juni 2006 - 22:22 #4
ja med lidt kode ss
Avatar billede Slettet bruger
08. juni 2006 - 22:25 #5
logo skal være en variabel da jeg ikke ved hvilket grafik format der vælges og derfor ikke kan forudbestemme.
Avatar billede tolderlund Nybegynder
09. juni 2006 - 10:36 #6
Man kunne også blot gemme navnet på billedet i inifilen.
Du kender navnet (op.FileName), så det er bare at gemme det navn i inifilen.
Når du så vil vise billedet er det bare at lave en
  Image1.Picture.LoadFromFile(FileNameFraIniFile);
Avatar billede Slettet bruger
09. juni 2006 - 13:30 #7
hvordan gemmer man navnet på billedet i en inifile?
Avatar billede tolderlund Nybegynder
09. juni 2006 - 13:50 #8
Jeg har ikke lige Delphi her ved mig, men jeg går ud fra at du bruger TIniFile klassen i forvejen, ikke?
Så skriver du bare noget med
  Ini.WriteString('sektionnavn', 'identnavn', op.FileName);
Altså på samme måde som du skrive de andre ting i din inifil.
Avatar billede nca Juniormester
10. juni 2006 - 08:52 #9
Her er et par eksempler på at skrive til og læse fra en ini-fil.
Eksemplet er hentet fra Delphis indbyggede hjælpefunktion:

procedure TForm1.Button1Click(Sender: TObject);

var
  MyIniFile: TIniFile;
  begin
  MyIniFile := TIniFile.Create('myapp.ini');
  Memo1.Clear;
  MyIniFile.ReadSectionValues('Transfer', Memo1.Lines);
  if Memo1.Lines.Values['Title1'] <> 'Picture Painter' then
    MyIniFile.WriteString('Transfer', 'Title1', 'Picture Painter');
  MyIniFile.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);

var
  MyIniFile: TIniFile;
  begin

  MyIniFile := TIniFile.Create('myapp.ini');

  { if the entry wasn’t there before, delete it now }
  if Memo1.Lines.Values['Title1'] = '' then
    MyIniFile.DeleteKey('Transfer', 'Title1')
  { otherwise, restore the old value }
  else
    MyIniFile.WriteString('Transfer', 'Title1', Memo1.Lines.Values['Title1']);
  MyIniFile.Free;
end;
Avatar billede Slettet bruger
10. juni 2006 - 15:46 #10
er der ikke en anden måde at definere 2 grafik formater på
logo.jpg
logo.gif
end at bruge ini files
Avatar billede Slettet bruger
11. juni 2006 - 00:41 #11
kan ikke få det til at virke er det ikke getnamepath der skal bruges?

den opretter godnok settings.ini //gem
[Settings]
image1=TPicture

der skulle stå stien til billedet
Avatar billede nca Juniormester
11. juni 2006 - 11:07 #12
Du blander tingene sammen ;-)
Grafikformatet har intet at gøre med ini-filen. Ini-filen er blot et sted, hvor du gemmer dine data, når programmet er slukket. Du kan også gemme dine data i registry. Så vidt jeg ved, anbefaler Microsoft dog, at man gemmer sine data i en ini-fil.
Tilbage til dit problem.
Du vil gerne ha' at folk kan vælge et image til deres kvittering. De skal selvfølgelig kun kunne vælge et format, som din Imagebox understøtter.
Når de har valgt et image, uploader du det i din Imagebox. Samtdig kopierer du en kopi af imagedet til en programmappe, så du også har det næste gang programmet startes, selv om brugeren har slettet det fra den oprindelige placering.
Til sidst "noterer" du navnet på filen i din ini-fil, så du kan indlæse billedet næste gang kvitteringen vises på skærmen.
Hvis der er dele af denne process du mangler hjælp til, så sig til. Men jeg vil ikke lave programmet for dig.
Avatar billede Slettet bruger
11. juni 2006 - 11:26 #13
nej man lærer ikke ved at de andre laver programmet,

jeg ved godt at grafik formatet ikke kan skrives i ini filen men det kan stien ned til billedet som skal loades ved readstring

det er stort set det eneste problem jeg har....

har leget lidt med ini filer, men kan ikke få stien til billedet skrevet i ini filen
Avatar billede nca Juniormester
11. juni 2006 - 11:33 #14
OK, inden jeg sender lidt hjælp, vil jeg gerne have nogle få oplysninger
1) Hvilken billedkontainer bruger du?
2) Hvilke grafikformatet tillader du?
2) Kopierer du billedet til en mappe og hvis ja, hvad er navnet på mappen?
Avatar billede Slettet bruger
11. juni 2006 - 12:03 #15
1: Timage
2: billeder  formater *.gif og *.jpg
3: nej
Avatar billede Slettet bruger
11. juni 2006 - 23:50 #16
her er hvad jeg har nørklet med..
gem kører uden problemer men load giver en acces error
procedure TForm1.Button2Click(Sender: TObject);
var
  IniFile : TIniFile;
begin      //save
  IniFile := TIniFile.create(ExtractFilePath(ParamStr(0))+'settings.ini');
  iniFile.WriteString('Settings','Image1.Picture','c:\temp\logo.gif');
end;

procedure TForm1.Button3Click(Sender: TObject);
var      //load
IniFile : TIniFile;
s: string;
begin
s:=inifile.ReadString('Settings','Image1.Picture','');
Image1.Picture.LoadFromFile(s);
Avatar billede kroning Nybegynder
12. juni 2006 - 01:36 #17
Du mangler denne linie i din load procedure:
IniFile := TIniFile.create(ExtractFilePath(ParamStr(0))+'settings.ini');
Avatar billede tolderlund Nybegynder
12. juni 2006 - 12:02 #18
Og i begge procedurer skal der være en en
  iniFile.Free;
som sidste linje.
Og skal det være helt godt skal der bruges try..finally for at sikre Free at inifile objektet.
Avatar billede Slettet bruger
12. juni 2006 - 13:25 #19
har lige en total shutdown af min pc - har købt en ny som jeg lige skal have installeret delphi på. så jeg har ikke lige mulighed for at prøve det...

men hæng på kroning du er jo en kanon hjælp her....
Avatar billede nca Juniormester
12. juni 2006 - 17:22 #20
Jeg ved ikke havd der er sket. Mere en halvdelen af koden er forsvundet under kopieringen.
Jeg prøver én gang til.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ExtDlgs, IniFiles, jpeg;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    OpenPictureDialog1: TOpenPictureDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  AppDir: String;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var
  MyIniFile: TIniFile;

begin
  If OpenPictureDialog1.Execute then begin
    Image1.Picture.LoadFromFile(OpenPictureDialog1.Filename);
    MyIniFile := TIniFile.Create(AppDir+'Settings.ini');
    MyIniFile.WriteString('Graphics','Logo',OpenPictureDialog1.Filename);
    MyIniFile.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Filename: String;
var
  MyIniFile: TIniFile;
begin
  MyIniFile := TIniFile.Create(AppDir+'Settings.ini');
  Filename:=MyIniFile.ReadString('Graphics','Logo','*FEJL*');
  MyIniFile.Free;
  if Filename<>'*FEJL*' then
    Image1.Picture.LoadFromFile(Filename)
  else
    Showmessage('Filen '+Filename+' kan ikke indlæses.');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  AppDir:= ExtractFilePath(Application.ExeName)
end;

end.
Avatar billede Slettet bruger
23. juni 2006 - 13:47 #21
hej nca

det virker jo fint.. men den loader billedet unaset hvordan checkbox1 er checked eller ikke og det er ikke optimalt.

når checkbox1 er checked skal billedet indlæses ellers ikke
Avatar billede nca Juniormester
23. juni 2006 - 15:30 #22
Hej Sharon
Du skal ét passende sted i din kode kontrollere om Checkbox1 er checked:
If CheckBox1.Checked then begin
... Her skal min kode fra fra Button2Click stå
endif
Avatar billede Slettet bruger
23. juni 2006 - 16:00 #23
hvorfor er der en dobbelt var? er det ik nok med en
Avatar billede nca Juniormester
23. juni 2006 - 20:05 #24
Jo, du kan vælge at lave MyIniFile som en global variabel. Så kan du slette de 2 i procedurerne. Jeg foretrækker selv at bruge lokale variable, da jeg synes det giver en bedre oversigt over både proceduren og de variable, man bruger.
Avatar billede Slettet bruger
07. december 2006 - 01:08 #25
smid lige et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester