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.