Witam. Potrzebuje zrobić obliczenie temperatur w języku Delphi. Dodaje źródła aby łatwiej można było mi pomóc. Mój problem polega na tym że nie mogę dodać "farenhajtów" ponieważ tworzą mi się błędy których nie potrafię rozwikłać.... Prosiłbym o pomoc, z góry dzięki :)
Jakie błędy ?
Problem polega na tym że jak mam te 3 okna (SpinEdit) to 3 nie współgra z pozostałymi z automatu ; trzeba kliknąć żeby działało...
function Fahrenheite(Celcjusz: Integer): Extended;
begin
Fahrenheite := 32 + (9/5 * Celcjusz);
end;
function Celcjusz(Fahrenheite: Integer): Extended;
begin
Celcjusz := 5/9 * (Fahrenheit - 32);
end;
Mógłbyś mi to wklepać w źródło? Ja motam się już 3 godzinki i tyle kombinacji że mój mózg(o ile go jeszcze mam xD) mi się zlasował ;| będę wdzięczny
Dobra, napisałem Ci funkcję
type
Temperature = (Fahrenheite, Kelvin, Celcjusz);
function Temperature(Ile: Integer; First, Second: Temperature;): Integer;
begin
Result := Ile;
if First = Fahrenheite then
Result := Round(5/9 * (Ile - 32));
if First = Kelvin then
Result := Ile - 273;
if Second = Kelvin then
Result := Result + 273;
if Second = Fahrenheite then
Result := Round(32 + (9/5 * Result));
end;
Np. Chcesz zamienić 20 Celcjusza na Kelivn.
Temperature(20, Celcjusz, Kelvin);
Twoja procedura obsługi zdarzenia OnChange po modyfikacji:
procedure TForm1.celeditChange(Sender: TObject);
begin
if Sender is TSpinEdit then with TSpinEdit(Sender) do
if (Name = 'celedit') and (Text <> '') and (ActiveControl.Tag = 1) then begin
keledit.Value:= Round(celedit.Value + 273.15);
faredit.Value:= Round(1.8*celedit.Value + 32);
end
else if (Name = 'keledit') and (Text <> '') and (ActiveControl.Tag = 2) then begin
celedit.Value:= Round(keledit.Value - 273.15);
faredit.Value:= Round(1.8*keledit.Value - 459.67);
end
else if (Name = 'faredit') and (Text <> '') and (ActiveControl.Tag = 3) then begin
celedit.Value:= Round((faredit.Value - 32)/1.8);
keledit.Value:= Round((faredit.Value + 459.67)*5/9);
end;
end;
Ważne: musisz zróżnicować właściwości Tag dla kontrolek SpinEdit tak jak w kodzie (celedit - 1 itd). Bez sprawdzania tego warunku zmiana wartości w jednej kontrolce spowoduje zmianę wartości dwóch pozostałych i wywołanie dla nich procedury OnChange i tak w nieskończoność.
hmm... co do Tag nie mam pojęcia o co chodzi ? Było by problemem jak byś zuploadował źródło?
ja rozważałem jeszcze taki sposób:
var
celkel : real;
begin
celkel := 273.15;
if TSpinEdit(Sender).Name = 'celedit' then
begin
if (keledit.Text <> '') and (celedit.Text <> '') then
keledit.Text := FloatToStr(StrToFloat(celedit.text) + celkel))
end else
if (keledit.Text <> '') and (celedit.Text <> '') then
if TSpinEdit(Sender).Name = 'keledit' then
celedit.Text := FloatToStr(StrToFloat(keledit.text) - celkel));
begin
if (faredit.Text <> '') and (celedit.Text <> '') then
if TSpinEdit(Sender).Name = 'faredit' then
faredit.Text := FloatToStr(StrToFloat(celedit.Text)*1.8 +32));
end
end;
end.
Xzetor napisał(a)
hmm... co do Tag nie mam pojęcia o co chodzi ?
Zaznaczasz myszką pierwszą kontrolkę SpinEdit (celedit) na formularzu i w oknie Object Inspector po lewej stronie ekranu w zakładce Properties odszukujesz właściwość Tag i zmieniasz wartość 0 na 1. Podobnie postępujesz z pozostałymi 2 kontrolkami, zmieniając Tag odpowiednio na 2 i 3. Oczywiście zamieniasz swoją procedurę obsługi zdarzenia, na tą którą podałem i to wszystko. Musi działać.
Całe źródła mogę podesłać, ale gdy sam do tego dojdziesz, to przynajmniej się czegoś nauczysz
Xzetor napisał(a)
hmm... co do Tag nie mam pojęcia o co chodzi ? Było by problemem jak byś zuploadował źródło?
A co za problem zmienić własność Tag z 0 na inne koniecznie jak 1, 2 i 3? Możesz to zrobić w Insektorze Obiektów lub poprzez kod - najlepiej w zdarzeniu OnCreate dla formatki.
Tak dla ścisłości - celSjusz, nie celCjusz. :)
Hahs. Myślałem że te tag'i to trudniejsza opcja a nawet nie szukałem :) Dzięki panowie :))
Miałbym jeszcze jedno pytanie :) chciałbym do tego dodać scroll'e tylko że jak dodam to liczby zmieniają mi się tylko w Celsjuszasz mimo że ustawiam tag; ktoś pomoże?