Azarien napisał(a)
rany boskie, trzymaj sobie tę ilość kolumn w osobnym polu klasy.
Owszem, mógłbym, ale musiałbym wtedy trzymać tak samo osiem innych ilości i indeksów w osobnych polach a to marnowanie pamięci, poza tym kdeklaracja klasy się wydłuży; Poza tym w każdej metodzie zmieniającej ilość wierszy czy kolumn musiałbym tą wartość zwiększać lub zmniejszać, a to strata czasu; Myślisz, że źle robię dbając o to, by klasa zajmowała jak najmniej w pamięci...?
Misiekd napisał(a)
NIEPRAWDA!!!!! to, że "tabela" jest pusta oznacza tylko i wyłącznie tyle, że żadna komórka nie jest wypełniona!
Zależy co kto rozumie pod pijęciem pusta; Dobrze piszesz, tabela jest pusta jak wszystkie komórki nie są wypełnione, ale nie o takie znaczenie słowa pusta mi chodzi; Excel to może niezbyt dobry przykład, bo w arkuszach kalkulacyjnych AFAIR nie usuwa się wierszy ani kolumn; W sumie nie ma do czego tego porównać, żeby to zobrazować;
Misiekd napisał(a)
Możesz zrobić dokładnie tak samo - stworzyć wiersze SetLength(Tablica, IloscWierszy); a potem stworzyć w każdym wierszu pola for i := 0 to IloscWierszy - 1 do SetLength(Tablica[i], IloscKolumn) i pozostawić je puste, czyli nie przypisywać Tablica[wiersz, kolumna] := 'dupa'
Jasne, że mogę i tak właśnie manipulowałem ilością wierszy i kolumn, ale zrezygnowałem z tego by przyspieszyć dodawanie wierszy i kolumn; To chyba też nie wada, że klasa będzie szybsza...?
Ok chłopaki, nie zagłębiajmy się dalej zagadnieniem kolejności indeksów, bo nie to jest przyczyną; Zrobiłem sobie osobny programik do testowania pod różnymi aspektami tablicy dwuwymiarowej przechowującej dane typu String
i ku mojemu zaskoczeniu wszystko działa; Tworzyłem nawet o wiele większe tablice i nie było żadnego problemu ani z zapisem, ani odczytem informacji z poszczególnych komórek; Stąd jestem teraz w 100% pewny, że nie przyczyną jest kolejność indeksów;
Błąd odnalazłem w warunku sprawdzającym poprawność indeksów; Otóż np. w metodzie służącej do wpisywania nowej wartości w parametrze podaje się indeks kolumny, wiersza i nową wartość; Mniej więcej deklaracja wygląda tak:
Kopiuj
procedure WriteCell(iColumnIndex, iRowIndex: Integer; sValue: String);
Wszystko chyba jest dość sugestywne; Warunek sprawdzający poprawność obydwu indeksów sprawdza jednocześnie* czy indeks kolumny mieści się w odpowiednim przedziale, a po słowie and
sprawdzany jest w ten sam sposób indeks wiersza, po czym całość jest negowana:
Kopiuj
if not ((iColumnIndex in [Low(PTable^) .. High(PTable^)]) and
(iRowIndex in [Low(PTable^[0]) .. High(PTable^[0])])) then Exit;
Warunek dosyć prosty i wygodny, ale nie do końca prawidłowy, bo po jego rozbiciu na dwa osobno:
Kopiuj
if not iColumnIndex in [Low(PTable^) .. High(PTable^)] then Exit;
if not iRowIndex in [Low(PTable^[0]) .. High(PTable^[0])] then Exit;
wszystko działa bez zarzutu; Niestety dziwne to jest, bo klasę po napisaniu czy modyfikacji każdej metody dokładnie testuję, by wykluczyć ewentualne błędy; Wszystkie metody dodające, usuwające i wstawiające (czyli wszystkie te, które manipulują ilością kolumn i wierszy) testowałem na małej ilości kolumn i wierszy tak, by zawartość tablicy mieściła się w komponencie TListBox
, bo w nim właśnie wyświetlałem wyniki działania metod; Liczba kolumn nie była większa niż 7, a wierszy niż 20; To mnie właśnie dziwi, że na małej ilości danych warunek sprawdzał się, a na większej już nie; Spędzałem dość dużo czasu na sprawdzenie poprawności działania metod, próbowałem wszystkich możliwości jakie dopuszcza i nie dopuszcza ten właśnie nie do końca poprawny warunek; Zwiększałem ilości o 1 i test, znów o jeden i test itd itd... wszelkie możliwe sposoby podania złych danych sprawdzałem i było wszystko ok; Dlatego właśnie nie podejrzewałem, że właśnie w ten sposób skonstruowany warunek może przynieść takie błędy...
Czyli już po kłopocie; Mam jeszcze jedno pytanie: czy ktoś wie dlaczego ten pierwszy warunek takie jaja odstawia? Co należy w nim zmienić, by był poprawny w każdej sytuacji? Dziękuję serdecznie za zainteresowanie i pomoc;
*jednocześnie - w znaczeniu w jednej instrukcji warunkowej if;