Avatar billede delphiuser Mester
01. september 2009 - 18:45 Der er 7 kommentarer og
1 løsning

Valuta udregner

Hej eksperter...

Jeg er igang med at lave en valuta udregner. det hele fungere egentlig fint. har dog bare en ting jeg ikke ved hvad jeg skal gøre.

jeg har en combobox i min form hvor jeg trækker nogle data ind i fra en database. de dataer som jeg trækker ind er landets navn og dets forkortelse.

mit spørgsmål er nu hvordan får jeg den til at vælge den kurs som høre til landet når jeg trykker på min knap udregn. for hvis det nu er € jeg skal have udregnet ville jeg sætte det meste op sådan her

edit1.text:=(strtofloat(edit2.text)...

hvad der skal stå derefter ved jeg ikke. for somsagt skal kursen hentes fra en databasetabel. kan da lige skrive min tabel ned her.

CREATE TABLE `amount` (
  `id` int(11) NOT NULL auto_increment,
  `land` varchar(50) NOT NULL default '',
  `area` varchar(5) NOT NULL default '',
  `kurs` varchar(10) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;

så i korte træk.

landets navn staår i min combobox og kursen skal så trækkes ud til udregningen. hvordan gøres dette?

på forhånd tak for hjælpen
Avatar billede hrc Mester
01. september 2009 - 20:28 #1
Du kan bruge Items.Objects i Comboen. Enten kan du tvinge den til at være et heltal hvor du gemmer valutakursen i ører, eller det kan, som tiltænkt, være gemmestedet for små objekter der indeholder valutaen.

Den første er langt lettest, men den er ikke så køn:

ComboBox1.Items.Clear;
while not Query.Eof do
begin
  ComboBox.Items.AddObject(Query.FieldByName('land').AsString,
                          integer(trunc(Query.FieldByName('kurs').AsFloat * 1000))));
  Query.Next;
end;


I dit program finder du så kursen på følgende måde:

var
  Kurs: double;
begin
  Kurs := 0.0;
  with ComboBox1 do
    if ItemIndex >= 0 then
      Kurs := integer(Items.Objects[ItemIndex]) * 1000;

  ..
end;


Den mere forkromede version kommer herefter
Avatar billede hrc Mester
01. september 2009 - 21:09 #2
Det her fylder lidt mere, men det sker i en pæn ispleret unit som main-formen bruger. Der fylder brugen af klasserne så bare 4 linjer. Det er langt fra første gang jeg presser denne løsning ned over hovedet på folk. Da jeg har lavet den så mange gange kan jeg næsten ikke forestille mig anden.

Den store fordel er at man får koblet objektet til den linje man vælger. Desuden er det en pæn isoleret løsning hvor det er nemt at håndtere data (eks. trimmer jeg strengene) og nem at udbygge.

Data-objektet kunne nedarve fra TPersistent hvis man havde ønske om at gemme/læse valutaerne i/fra en fil.

Først unitten:

unit UValuta;

interface

uses
  SysUtils, ContNrs, Classes;

type
  TValutaData = class
  private
    fID: integer;
    fLand: string;
    fArea: string;
    fKurs: double;
  public
    constructor Create(const aID: integer; const aLand, aArea: string; const aKurs: double);
    property ID: integer read fID;
    property Land: string read fLand;
    property Area: string read fArea;
    property Kurs: double read fDouble write fDouble; // Måske kan den ændres?
  end;

  TValutaList = class(TObjectList)
  private
    function GetItems(const aIndex: integer): TValutaData;
  public
    property Items[const aIndex: integer]: TValutaData read GetItems; default;
    procedure Initialize;
    procedure FillStrings(aStrings: TStrings);
  end;

implementation

{ TValutaData }

constructor TValutaData.Create(const aID: integer; const aLand, aArea: string; const aKurs: double);
begin
  inherited Create;
  fID := aID;
  fLand := trim(aLand);
  fArea := trim(aArea);
  fKurs := aKurs;
end;

{ TValutaList }

function TValutaList.GetItems(const aIndex: integer): TValutaData;
begin
  result := inherited Items[aIndex] as TValutaData;
end;

procedure TValutaList.Initialize;
var
  Query: TADOQuery; // Bruger her ADO, ved ikke hvad du gør
begin
  Query := TADOQuery.Create(nil);
  try
    Clear;

    Query.Connection := <enellerandenforbindelsetilendatabase>;
    Query.SQL.Add('select ID, land, area, kurs');
    Query.SQL.Add('from amount');
    Query.SQL.Add('order by land');
    Query.Open;
    while not Query.Eof do
    begin
      Add(TValutaData.Create(Query.FieldByName('ID').AsInteger,
                            Query.FieldByName('land').AsString,
                            Query.FieldByName('area').AsString,
                            Query.FieldByName('kurs').AsFloat));
      Query.Next;
    end;
  finally
    Query.Free;
  end;
end;

procedure TValutaList.FillStrings(aStrings: TStrings);
var
  i: integer;
  ValutaData: TValutaData;
begin
  aStrings.BeginUpdate;
  try
    aStrings.Clear;
    for i := 0 to Count - 1 do
    begin
      ValutaData := Items[i];
      aStrings.AddObject(ValutaData.ToString,ValutaData);
    end;
  finally
    aStrings.EndUpdate;
  end;
end;

end.


Her er mainformen:

uses
  SysUtils, FOrms, Windows, Classes, UValuta, ...;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Button1: TButton;
    Edit1: TEdit1;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Press(Sender: TObject);
  private
    fValutaList: TValutaList;
  public
  end;

implementation

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  fValutaList := TValutaList.Create;
  fValutaList.Initialize;
  fValutaList.FillStrings(ComboBox.Items);
  if ComboBox.Items.Count > 0 then
    ComboBox.ItemIndex := 0;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  fValutaList.Free;
end;

procedure TForm1.Button1Press(Sender: TObject);
var
  ValutaData: TValutaData;
  Antal: integer;
  Belob: double;
begin
  try
    ValutaData := nil;
    with ComboBox1 do
      if ItemIndex >= 0 then
        ValutaData := Items.Objects[ItemIndex];

    if not assigned(ValutaData) then
      raise Exception.Create('Vælg en valuta');

    Antal := StrToIntDef(Edit1.Text,0);

    Belob := Antal * ValutaData.Kurs;

    MessageDlg(FloatToStr(Belob),mtInformation,[mbOK],0);
  except
    on e: exception do
      MessageDlg(e.Message,mtInformation,[mbOK],0);
  end;
end;

end.


Jeg har p.t. ikke nogen Delphi på min maskine, så det er muligt der har sneget sig en fejl ind hist og her.
Avatar billede hugopedersen Nybegynder
03. september 2009 - 10:37 #3
Som jeg skrev til dig i går hrc, så har jeg rodet lidt med din kode.
Når jeg kommer til linien ValutaData := Items.Objects[ItemIndex];
så får jeg 'Incompatible types: 'ValutaData' and 'TObject'

Der må være en misser der
Avatar billede hrc Mester
03. september 2009 - 11:10 #4
ValutaData := Items.Objects[ItemIndex] as TValutaData;
Avatar billede hugopedersen Nybegynder
03. september 2009 - 11:54 #5
Hjalp en anelse ja :-)
Avatar billede borrisholt Novice
05. september 2009 - 09:51 #6
Kig i de demoer der følger med til delphi der ligger en fuld valuta og vægt omregner ...
Avatar billede borrisholt Novice
05. september 2009 - 09:52 #7
@Hrc .... Er du blevet klogere på om jeg skal undervise ? Det er ikke meget jeg hører fra dig.

Jens B
Avatar billede delphiuser Mester
28. juli 2010 - 14:19 #8
lukker
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