Obliczanie rozmiarów komponentu z użyciem pliku tekstowego

Odpowiedz Nowy wątek
2014-12-23 04:55
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"'.

edytowany 1x, ostatnio: dani17, 2014-12-23 05:08
Robisz odpowiednie konwersje, jak w pliku txt masz np w postaci stringu: "bsNone", "bsSizeable" itd, to musisz to odpowiednio przekonwertować na TBorderStyle (typ enum), możesz co prawda robić konwersje String na int ale później i tak trzeba użyć rzutowania, tak żeby int było interpretowane jako TBorderStyle. To nie jest tak prosto że sobie przypiszesz co chcesz. Może mi tu rzucisz jakimś przykładem z tego co realizowałeś? - drorat1 2014-12-23 09:35
@drorat1 - na temat odpowiadaj w postach; - furious programming 2014-12-23 17:29

Pozostało 580 znaków

2014-12-23 10:45
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


Zwróć uwagę, że pytacz chce użyć innych ciągów, niż dokładne identyfikatory enomów; Np. dla bsNone potrzebuje ciągu none; - furious programming 2014-12-23 17:32
bs odrzucamy i porównujemy case-insensitive ;p - Patryk27 2014-12-23 17:35

Pozostało 580 znaków

2014-12-23 11:01
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.
edytowany 2x, ostatnio: babubabu, 2014-12-23 19:53
'none', 'sizeable' :P - Patryk27 2014-12-23 11:04
'pseudokod' :P - babubabu 2014-12-23 14:44
Zgubiłeś w drugim case właściwość obiektu ;P - furious programming 2014-12-23 17:12

Pozostało 580 znaków

2014-12-23 17:24
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ę.


edytowany 3x, ostatnio: furious programming, 2014-12-26 19:05
dlaczego if i to jeszcze bez else, a nie case? - babubabu 2014-12-23 19:55
if dlatego, że nie jestem przyzwyczajony do używania case przy sprawdzaniu łańcuchów - takie zboczenie ze starego Delphi7; A bez else, bo jak widzisz używam w warunkach Exit :) - furious programming 2014-12-26 19:04
Ok, poprawię na case - ciągle zapominam, że Free Pascal dopuszcza taką konstrukcję; - furious programming 2014-12-26 19:04

Pozostało 580 znaków

2014-12-26 12:05
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.

Pliki TreeStructInfo są tak samo proste w obsłudze jak pliki Ini; Więc jeśli umiesz korzystać z Ini, to i z TreeStructInfo ;) - furious programming 2014-12-26 19:01

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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