Avatar billede goldeneyes Nybegynder
05. april 2004 - 20:23 Der 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?
Avatar billede lanstorp Nybegynder
05. april 2004 - 22:18 #1
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.
Avatar billede goldeneyes Nybegynder
05. april 2004 - 22:28 #2
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
Avatar billede lanstorp Nybegynder
05. april 2004 - 23:33 #3
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...
Avatar billede goldeneyes Nybegynder
06. april 2004 - 00:08 #4
Jeg forstår princippet, menda jeg er lidt newbee,kunne jeg godt tænke mig atfå det forklaret lidt mere praktisk.
Avatar billede hrc Mester
13. april 2004 - 19:05 #5
type
  TVarTypes = (vtU, vtR, vtI);

  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;

procedure TfrmMain.btnClearClick(Sender: TObject);
begin
  fSkipEvents := true;
  try
    fValuesPresent[vtU] := false;
    fValuesPresent[vtR] := false;
    fValuesPresent[vtI] := false;
    eU.Text := '';
    eR.Text := '';
    eI.Text := '';
  finally
    fSkipEvents := false;
  end; // try
end;

end.
Avatar billede hrc Mester
13. april 2004 - 19:07 #6
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
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