Obliczanie rozmiarów komponentu z użyciem pliku tekstowego

Obliczanie rozmiarów komponentu z użyciem pliku tekstowego
D1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:165
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
drorat1
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ś?
flowCRANE
@drorat1 - na temat odpowiadaj w postach;
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
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


flowCRANE
Zwróć uwagę, że pytacz chce użyć innych ciągów, niż dokładne identyfikatory enomów; Np. dla bsNone potrzebuje ciągu none;
Patryk27
bs odrzucamy i porównujemy case-insensitive ;p
flowCRANE
Można i tak :>
babubabu
  • Rejestracja:około 13 lat
  • Ostatnio:2 miesiące
  • Lokalizacja:Łódź
  • Postów:648
1

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

Kopiuj
begin
  Read(Plik,TypRamki)
  case TypRamki of
    none : Objekt.Border := bsNone
    sizeable : Objekt.Border := bsSizeable
    ...
  end;
end.
edytowany 2x, ostatnio: babubabu
Patryk27
'none', 'sizeable' :P
babubabu
'pseudokod' :P
flowCRANE
Zgubiłeś w drugim case właściwość obiektu ;P
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Tuchów
  • Postów:12166
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:

Kopiuj
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:

Kopiuj
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ę.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
babubabu
dlaczego if i to jeszcze bez else, a nie case?
flowCRANE
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 :)
flowCRANE
Ok, poprawię na case - ciągle zapominam, że Free Pascal dopuszcza taką konstrukcję;
D1
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:165
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.

flowCRANE
Pliki TreeStructInfo są tak samo proste w obsłudze jak pliki Ini; Więc jeśli umiesz korzystać z Ini, to i z TreeStructInfo ;)
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)