Wątek przeniesiony 2017-01-06 22:15 z Delphi i Pascal przez furious programming.

Stworzenie losowanej tablicy w aplikacji okienkowej.

0

A może do TMainMenu?

0

Nie mam pojęcia jak obsługiwać TMainMenu.

0

I nie zastanawiasz się nad tym, co Ci ktoś proponuje - takie było zadanie mojego poprzedniego posta.

0

Pooglądałem pare tutoriali o TMainMenu, próbowałem go utworzyć, tylko nie rozumiem po co jest potrzebne do wypisywania, bardziej z tego co czytałem to do obsługiwania się całym programem jest potrzebne.

Btw, nie mogę znaleźć jak w ListBox zrobić większe odstępy w wypisywaniu, jest taka opcja?

0

Dalej nie rozumiesz tego, co miałem wcześniej na myśli... Powinieneś się najpierw zastanawiać nad tym, czy rozwiązanie sugerowane przez kogoś jest sensowne i dopiero jeśli tak faktycznie jest to coś w tym kierunku działać; Natomiast ani TListBox, ani tym bardziej TMainMenu się do tego nie nadaje, co powinieneś zrozumieć po krótkim zastanowieniu (jak wygląda, do czego służy itd.);

Jeśli nie potrzebujesz edytować tych liczb (decymalnych, w dodatkowych komponentach) to bez problemu wystarczą Ci zwykłe etykiety, umieszczone z boku i pod tablicą przycisków; Każda ta dodatkowa kontrolka będzie posiadać tylko jedną liczbę, więc jej rozmiar może być malutki - dzięki temu wszystko zmieści się bez problemu:

digits.png

0

Etykieta będzie ok, tylko jeszcze co trzeba dodać żeby ona rozpoznawała zmianę dowolnego CdGit i aktualizowała swoją wartość?
Bo ona się zmienia tylko że np dopiero po kliknieciu na niego.

0

Najlepiej by było, gdybyś każdemu przyciskowi ustawił właściwość Tag - wpisał do niej numer przycisku, od 0 do 63; Dzięki temu w zbiorczym zdarzeniu OnClick tych przycisków będzie można ten tag odczytać i wykorzystać;

Każdą etykietę nazwij sensownie, tak aby na podstawie tagu klikniętego przycisku dało się do niej dostać na podstawie FindChildControl; Niech też nazywają się tak samo, tyle że odróżniać je będzie numerek (tak jak przyciski); Etykietom z prawej strony ustal nazwy od CDigitLabelHorz0 do CDigitLabelHorz7, a tym na dole ustal nazwy od CDigitLabelVert0 do CDigitLabelVert7; Te z prawej będą wyświetlać liczby dla wierszy tabelki przycisków, a te na dole dla kolumn;

Teraz jeśli już masz ustalony Tag dla każdego przycisku i nadane są nazwy etykiet, wystarczy odczytać wartość Tag klikniętego przycisku, pobrać z niego numer wiersza i kolumny, a na koniec przekonwertować dwie liczby (dla poziomu i pionu) i wpisać je do dwóch etykiet; Wszystkie te instrukcje należy wykonać w zdarzeniu OnClick;

Przerobienie indeksu na współrzędne przycisku jest bardzo proste:

function TForm1.ButtonIndexToCoords(AIndex: Integer): TPoint;
begin
  Result.X := AIndex mod 8;
  Result.Y := AIndex div 8;
end;

Do pobrania liczby zawartej w przyciskach podałem Ci już dwie metody HorzDigitsToNumber i VertDigitsToNumber; Kod zdarzenia OnClick przycisków też już podałem; Korzystając z tych informacji, kod zdarzenia powinien wyglądać tak:

procedure TForm.CDigit0Click(Sender: TObject);
var
  LButton: TControl absolute Sender;
  LLabel: TControl;
  LDigit, LNumber: Integer;
  LCoords: TPoint;
begin
  { zamiana cyferki klikniętego przycisku }
  LDigit := StrToInt(LButton.Caption);
  LButton.Caption := IntToStr((LDigit + 1) mod 2);
  
  { pobranie współrzędnych klikniętego przycisku }
  LCoords := ButtonIndexToCoords(LButton.Tag);
  
  { aktualizacja zawartości etykiety po prawej }
  LNumber := HorzDigitsToNumber(LCoords.Y);
  LLabel := CDigitsGroup.FindChildControl(Format('CDigitLabelHorz%d', [LCoords.Y]));
  LLabel.Caption := IntToStr(LNumber);
  
  { aktualizacja zawartości etykiety na dole }
  LNumber := VertDigitsToNumber(LCoords.X);
  LLabel := CDigitsGroup.FindChildControl(Format('CDigitLabelVert%d', [LCoords.X]));
  LLabel.Caption := IntToStr(LNumber);
end;

Dobrze by było, gdyby aktualizację zawartości etykiet wydzielić do osobnych metod, dlatego że przydadzą się w dwóch miejscach programu - po wylosowaniu zawartości przycisków oraz po klikaniu w przyciski; To jednak pozostawiam Tobie.

0

Wszystko skompilowało się ok, tylko po uruchomieniu i próbie zmiany wartości przycisku, wyskakuje błąd, treści:

Projekt raised exception class External:SIGSEGV'.
0

Tablica się losuje, ale na CDigitLabelHorz nie wyświetla się żadna liczba, a przy kliknięciu na Cdigit wywala błąd tej treści wyżej.

0

Z tym sobie poradziłem, teraz jest problem, bo wartości CdigtLabelVert działają dynamicznie i wszystko jest ok, tylko jest problem dla CdigitLabelHorz.
Problem wygląda tak, pierwszy wiersz działa dobrze, zmienia się dynamicznie, tylko drugi i następne działają nastepująco:
2 wiersz czy CdigitLabelHorz1 pobiera współrzędne nie od Cdigit8, tylko CdiGit2 i przedstawia on liczbę taką jak CdigitLabelHorz0 tylko przesuniętą o jeden CdiGit w prawo. Obrazowo mówiąc tam gdzie dla CdiGitLabelHorz0 Cdigit0 ma wartość 64, dla CdigitLabelHorz1 ma wartość 128 itd dla kolejnych CdigitLabelHorz.
Próbowałem zmieniać funkcję HorzDigitsToNumber tak aby wartość i rosła o 8 z każdym przejściem, ale nie odniosłem żadnego skutku.
Jeżeli możesz to podpowiedz gdzie mogę mieć błąd, bo już wyczerpały się moje pomysły.

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