Obliczanie rozmiarów komponentu z użyciem pliku tekstowego

0

Witam,
jak już pisałem w innym temacie, próbuje napisać mini grę. Konkretnie interfejs do niej, bo cała reszta jest już gotowa. Teraz trzeba tylko złożyć to w całość. O co chodzi w tym temacie? Gra, którą piszę to w sumie bardziej program. Bo jest to symulacja finansowa. Nie ma jakiegoś trybu graficznego itp. A jedynie tabelki, wykresy itd. I dobieranie odpowiednich opcji. Mógłbym pójść jak najłatwiejszą drogą i napisanie tego tak żeby działało, ale staram się myśleć o tym w kontekście przyszłości. A planuję ten projekt rozwijać w wolnych chwilach przez długi czas. Chciałbym, aby możliwa była zmiana wyglądu tej gry. Żeby każdy użytkownik mógł sobie sam dobrać np. rozmiar, układ czy kolor elementów. O ile z kolorem nie mam żadnego problemu, to z obliczeniami już problem jest. Być może nie jest to najwłaściwsza metoda. W sumie nie znam innej możliwe. Powiedzmy, że są to różne skórki. Każda miałaby przypisane ustawienia w pliku tekstowym. I mogę wstawić że np. Wysokość elementu to będzie 60. Ale ja bym chciał, żeby w tym pliku było zapisane coś takiego że np. wysokość elementu = screen.height - (5 * zmienna1) + zmienna2.

Jeżeli będzie to tak zapisane i odczytam to jako string i będę próbował podstawić pod wysokość to zwróci mi informacje że jest nieprawidłowy typ zmiennej. A więc czy jest sposób, żeby jakoś to zrobić? Mam nadzieję, że wytłumaczyłem w miarę zrozumiale.

EDIT. Podobnie sytuacja wygląda z np. border. Jak sczytać z pliku żeby później zmienić BorderStyle. Da się to jakoś przekonwertować? Ja mam w pliku wpisane BorderStyle = none. Potrafię to rozdzielić i na zmiennej typu string znajduje się tylko napis 'none'. W konsekwencji dostaje komunikat 'unit1.pas(208,91) Error: Incompatible types: got "AnsiString" expected "TBorderStyle"'.

2

A więc czy jest sposób, żeby jakoś to zrobić?

Napisać parser wyrażeń arytmetycznych.

Podobnie sytuacja wygląda z np. border. Jak sczytać z pliku żeby później zmienić BorderStyle. Da się to jakoś przekonwertować?

To Ci powinno pomóc:
http://ideone.com/VN0MWK
http://ideone.com/54yY2z

1

Ewentualnie możesz zrobić tak jak zazwyczaj newbie robią
pseudokod

begin
  Read(Plik,TypRamki)
  case TypRamki of
    none : Objekt.Border := bsNone
    sizeable : Objekt.Border := bsSizeable
    ...
  end;
end.
1

Ja wcale bym się nie zastanawiał nad wyrażeniami arytmetycznymi jako wartościami elementów, bo jest to utrudnienie; W pliku powinny się znaleźć same liczby, które łatwo wczytasz sobie do programu; A jeśli potrzebujesz coś obliczać, to wzory zaimplementuj w kodzie programu - do nich podstawisz wczytane z pliku liczby;

Chciałbym, aby możliwa była zmiana wyglądu tej gry. Żeby każdy użytkownik mógł sobie sam dobrać np. rozmiar, układ czy kolor elementów.

Te informacje także możesz sobie zapisać w pliku konfiguracyjnym; Wszystkie dane zapisz w jakiejś sensownej strukturze, odczytuj je i aktualizuj komponenty przy zmianie skórki lub rozruchu aplikacji;

Jak sczytać z pliku żeby później zmienić BorderStyle.

Wczytaj łańcuch znaków i sprawdź jego zawartość - proste:

function ConvertStringToBorderStyle(const AString: AnsiString): TBorderStyle;
begin
  case AString of
    'sizeable': Result := bsSizeable;
    'single':   Result := bsSingle;
  else
    Result := bsNone;
  end;
end;

I tyle, ewentualnie skorzystaj z nieczułej na wielkość liter fukncji do ich porównywania, np. SameText czy CompareText;

Potrafię to rozdzielić i na zmiennej typu string znajduje się tylko napis 'none'. W konsekwencji dostaje komunikat 'unit1.pas(208,91) Error: Incompatible types: got "AnsiString" expected "TBorderStyle"'.

Nie wiesz dlaczego? Dlatego, że:

bsSizeable <> 'bsSizeable'

Jeżeli potrzebujesz przechowywać w plikach tekstowych konfigurację programu, to polecam TreeStructInfo (linki w sygnaturce); Dane każdego komponentu możesz trzymać w osobnych węzłach, łatwo je modyfikować i odczytywać na podstawie ścieżki, bez martwienia się o poprawność konwersji (o to dbają wewnętrzne mechanizmy); Chyba że chcesz trzymać dane w niestandardowej formie, no to trzeba będzie czytać po prostu łańcuchy i konwertować tak jak wyżej;

Jest biblioteka dla Lazarusa, więc nic tylko brać i bawić się.

0

Rzeczywiście to proste. Czasami szukam rozwiązanie na podstawie czegoś innego. W tym wypadku oczekiwałem funkcji podobnie działającej do StrToInt. Byłoby to krótsze rozwiązanie, ale pewnie coś takiego nie istnieje.

A z TreeStructInfo na pewno się zapoznam. Wiem, że się przyda, ale póki co robię to co jestem w stanie zrobić na teraz.

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