Lazarus- Form, problemy ze zmiennymi

Odpowiedz Nowy wątek
2013-05-23 19:12

Rejestracja: 7 lat temu

Ostatnio: 5 lat temu

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 .?

Pozostało 580 znaków

2013-05-23 20:28

Rejestracja: 14 lat temu

Ostatnio: 2 minuty temu

Lokalizacja: Gorlice

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:= ',';

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek, 2013-05-23 20:31
Val nie skonwertuje ciągu, jeśli jako separator dziesiętny podany jest przecinek, za to z kropką idzie mu nieźle; Nie jestem pewny, ale Val nie korzysta z DecimalSeparator, więc raczej musi mieć kropkę; - furious programming 2013-05-23 23:15

Pozostało 580 znaków

2013-05-23 21:01

Rejestracja: 14 lat temu

Ostatnio: 2 minuty temu

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;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-05-24 19:07

Rejestracja: 7 lat temu

Ostatnio: 5 lat temu

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.

Pozostało 580 znaków

2013-05-24 21:20

Rejestracja: 14 lat temu

Ostatnio: 2 minuty temu

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;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

Odpowiedz

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