Lazarus- Form, problemy ze zmiennymi

0

Mam projekt komiwojażera na ACO i mam 2 małe problemiki związane z konwersją tekstu jak i z przypisywaniem wartości do zmiennych. Ale po kolei.

  1. W Form1 mam zmienne konfigurowalne dla algorytmu (ilość pokoleń, ilość agentów w pokoleniu itp), w Form2 mam Edity odpowiedzialne za zmiany, przy jego załadowaniu wykonywane jest:
 
Edit4.Text:=inttostr(Fstart);
Edit5.Text:=inttostr(Tau);
Edit6.Text:=inttostr(pA);
Edit7.Text:=inttostr(pB);
(...)

Mam button który wywołuje takie coś:

 
val(Edit7.Text,g,code);
  if code<>0 then
  begin         
  (...)
  end
 pB:=g;
Form2.Close();

Ale nowa zawartość do zmiennej jest przypisywana nawet jak zamykam form2 normalnie krzyżykiem. Czemu się tak dzieje?

  1. Też związane z edycją, mam jedną zmienną double która na starcie ma przypisaną wartość 0.09, przy wrzuceniu jej do Edita jest 0,09 i val nie może poprawnie zrobić konwersji, dopiero jak zamienię przecinek na kropkę działa. I po tym jak zamienię to i wrócę do Edycji zmiennych to już jest konwersja do Edita robiona z kropką i mogę bez problemu zapisywać bez kombinowania. Da się to jakoś naprawić po prostu czy muszę w stringu zamieniać , na .?
0

W Delphi i prawdopodobnie w FPC też jest coś takiego jak DecimalSeparator ustawiając wartość tej zmiennej zmieniasz separator dziesiętny na jaki ci pasuje przecinek, kropka czy co tam chcesz. Tyle że coś z Val to nie działa natomiast działa dobrze z innymi funkcjami z StrToFloat i FloatToStr

DecimalSeparator:= ',';
0
  1. możesz zmienić ustawienia windowsów na odpowiedni znak dziesiętny
  2. możesz sztucznie zrobić uniwersalnie DoubleValue:=FloatToStr(StringReplace(StringReplace(Edit1.text,'.',DecimalSeparator,[]),',',DecimalSeparator,[]));
  3. możesz nie przyjmować się błędnie wpisanymi wartościami:
class procedure Form1.execute(var Value:Double);
begin
  with Create(Application) do
  begin
    try
      Edit1.Text:=FloatToStr(Value);
      ShowModal;
      Value:=StrToFloatDef(Edit1.Text,Value);
    finally
      Free;
    end;
  end;
end;
0

Dzięki, pobawię się z tym separatorem jakoś. A jak rozwiązać ten problem z nadpisywaniem się zmiennych przy zamykaniu Forma krzyżykiem? Jest tak że wartości są pobierane i przypisywane zmiennym jak tylko użyje buttona a tak nie jest.

0
class procedure Form1.execute(var Value:Double);
begin
  with Create(Application) do
  begin
    try
      Edit1.Text:=FloatToStr(Value);
      if ShowModal=mrOk then
      begin
        Value:=StrToFloatDef(Edit1.Text,Value);
      end;
    finally
      Free;
    end;
  end;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1