A może do TMainMenu
?
Nie mam pojęcia jak obsługiwać TMainMenu.
I nie zastanawiasz się nad tym, co Ci ktoś proponuje - takie było zadanie mojego poprzedniego posta.
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?
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:
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.
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.
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'.
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.
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.