05. april 2004 - 20:23Der er
5 kommentarer og 1 løsning
3 felter 2 udfyldes tredje beregnes
Jeg har en form med 3 DBEdit felter, Distance, Tid, Hastighed. HVis de to af dem er udfyldt, skulle værdien af det tredje kunne beregnes. Hvordan gøre jeg det?
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
Kik lidt på de events der kommer med DBEdit kontrollen. OnChange, OnClick ... hvad der nu passer bedst. Brug kun DBEdit hvis du ikke koblet op på en database ellers brug TEdit.
Jeg bruger en Paradox-database hvor mine værdier er gemt. Mit problem ligger i at brugeren selv skal kunne vælge hvilke to felter han vil udfylde, hvorefter programmet selv beregner den sidste værdi
Hvis du bruger OnChange eventet på kontrollerne kan du vente til der er fanget 2 ændringer, hvorefter du beregner den der ikke er ændret. Det kan laves med et boolsk flag for hver kontrol: bDistUsed, bTidUsed, bHashUsed, sæt dem alle til False. Når onchange eventet for en kontrol eksekveres sættes dens flag til true. For hver gang onchange eventet eksekveres undersøger du, om der et eller to True flag. Hvis der er to True flag må det være den med flag False der skal beregnes. Hvis der kun er et True flag venter der til næste event rammes. Osv..... Eller er det sort snak. G'nat...
TfrmMain = class(TForm) eU: TEdit; eR: TEdit; eI: TEdit; lU: TLabel; lR: TLabel; lI: TLabel; lGange: TLabel; lLigMed: TLabel; btnClear: TButton; procedure FormCreate(Sender: TObject); procedure EditsChange(Sender: TObject); procedure EditsKeyPress(Sender: TObject; var Key: Char); procedure btnClearClick(Sender: TObject); private fSkipEvents : boolean; // Boolean to prevent events to happen while updating TEdits fValuesPresent : array[TVarTypes] of boolean; function CalculateU(const aR, aI : real) : real; function CalculateR(const aU, aI : real) : real; function CalculateI(const aU, aR : real) : real; public end;
var frmMain: TfrmMain;
implementation
uses Math;
{$R *.dfm}
{ TfrmMain }
procedure TfrmMain.FormCreate(Sender: TObject); begin btnClear.Click; fSkipEvents := false; end;
function TfrmMain.CalculateI(const aU, aR: real): real; begin result := aU / aR; end;
function TfrmMain.CalculateR(const aU, aI: real): real; begin result := aU / aI; end;
function TfrmMain.CalculateU(const aR, aI: real): real; begin result := aR * aI; end;
procedure TfrmMain.EditsChange(Sender: TObject); var i : TVarTypes; j : integer; Edit : TEdit; begin if fSkipEvents then exit;
j := 0; Edit := (Sender as TEdit); // One of the three TEdits
// Having set tags: eU.Tag = 0, eR.Tag = 1, eI.Tag = 2 -> which numerically is // the same as as the TVarTypes of the array, I typecast it to TCarTypes and // sets it true if Edit.Text <> '', otherwise false fValuesPresent[TVarTypes(Edit.Tag)] := Edit.Text <> '';
// Count the number of filles values for i := low(fValuesPresent) to high(fValuesPresent) do if fValuesPresent[i] then inc(j); // I prefer the compactier: inc(j,integer(fValuesPresent[i])); - but I'm a nerd
if j = 2 then begin // Take action!! fSkipEvents := true; try if fValuesPresent[vtR] and fValuesPresent[vtI] then // R and I: Calculate U eU.Text := FloatToStr(CalculateU(StrToFloat(eR.Text),StrToFloat(eI.Text))) else if fValuesPresent[vtU] and fValuesPresent[vtR] then // U and R: Calculate I eI.Text := FloatToStr(CalculateI(StrToFloat(eU.Text),StrToFloat(eR.Text))) else if fValuesPresent[vtU] and fValuesPresent[vtI] then // U and I: Calculate R eR.Text := FloatToStr(CalculateR(StrToFloat(eU.Text),StrToFloat(eI.Text))); finally fSkipEvents := false; end; // try end; // if end;
procedure TfrmMain.EditsKeyPress(Sender: TObject; var Key: Char); begin if fSkipEvents then exit;
// Only allow floats if Key >= #32 then begin if not (Key in ['0'..'9',DecimalSeparator]) then Key := #0; if (pos(DecimalSeparator,(Sender as TEdit).Text) > 0) and (Key = DecimalSeparator) then Key := #0; end; end;
I ovenstående eksempel beregner jeg Ohms lov som har følgende tre formler (hvis man ikke inddrager effektberegningen):
U := R * I; R := U / I; // Bør kontrollere for division med nul I := U / R; // Bør kontrollere for division med nul
Synes godt om
Ny brugerNybegynder
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.