[Delphi] Problem z deklaracją klasy i kilka pytań

0

Witam,

Piszę dość spory program (dochodzi do 5000 linijek kodu) i natrafiłem właśnie na kilka problemów. Jednym z nich jest błąd w deklaracji klasy, która będzie przechowywała dane. Program służy do automatycznego tworzenia ASCII Artów z obrazów. Do dobierania znaku będę stosował coś w rodzaju mechanizmu OCR. Te struktury i klasy będą zawierać przetworzone na grafikę wybrane znaki z danej czcionki.

Poniższy kod nie kompiluje się. Błąd pojawia się odnośnie linijek oznaczonych "problem". Treść błędu "Record, object or class type required", czyli wg. mnie kompilator nie poznaje że to bitmapa, albo źle odniosłem się do tej wartości. Wiecie może jak to poprawić?

type                                        //Struktura bajtu wraz z opisem w postaci znaku
  TByteAndChar = record
    Wartosc : Byte;
    Nazwa : Char;
  end;

type                                        //Struktura l. calkowitej wraz z opisem w postaci znaku
  TIntAndChar = record
    Wartosc : Integer;
    Nazwa : Char;
  end;

type                                        //Struktura l. rzeczywistej wraz z opisem w postaci znaku
  TRealAndChar = record
    Wartosc : Real;
    Nazwa : Char;
  end;

type                                         //Klasa znaku przeanalizowanego i zapisanego jako grafika
  TZnakGfxInfo = class
  private
    ZnakID : TByteAndChar;                   //Struktura przecohuwaca nazwe znaku i jego ID

  public
    ObrazZnak : TBitmap;                     //Obraz znaku
    ObrazZnakKrawedz : TBitmap;              //Obraz krawędzi znaku (polowa rozdzielczosci oryginalu)
    ObrazZnakRozmyty : TBitmap;              //Obraz znaku po addytywnym rozmyciu Guassowskim (obraz oryginalu)

    SumyRGB : array[0..2, 0..2] of Integer;  //Sumy RGB w 9 obszarach znaku

    property ID : byte read ZnakID.Wartosc write ZnakID.Wartosc default 0;      //Domyslna wartosc to NUL 000
    property Nazwa : char read ZnakID.Nazwa write ZnakID.Nazwa default Chr(0);
    property SzerokoscX : Integer read ObrazZnak.Width default 0;       //Problem
    property WysokoscY : Integer read ObrazZnak.Height default 0;       //Problem
  end;

type                                        //Klasa czcionki przeanalizowanej i zapisanej jako grafika
  TCzcionkaGfxInfo = class
  private
    ZnakiKrawedzie : array of TIntAndChar;  //Dynamiczna tablica zawierajaca liczbe krawedzi w znakach, posortowana rosnaco
    ZnakiGradient : array of TRealAndChar;  //Dynamiczna tablica zawierajaca % miejsca zajmowanego przez znaki, posortowana rosnaco
    Znaki : array of TZnakGfxInfo;          //Dynamicznej wielkosci tablica znakow przekonwertowanych

    LZnakow : byte;                         //Liczba przekonwertowanych znakow
  public
    Czcionka : TFont;                       //Czcionka która zostala przekonwetrowana

    ZnakMDolny,ZnakMBoczny : bool;          //Informacja czy dodano dolny i boczny margines do znaków
    ZnakX,ZnakY : integer;                  //Wymiary znaku

    property LiczbaZnakow : byte read LZnakow;
  end;

Druga sprawa. Pojawił się problem z czytelnością kodu. Mam wiele okien aplikacji, a na jednym z nich znajduje się ListBox Logu. Obsługa logu jest potrzebna z każdego okna, więc musiałem wkleić kod odpowiedzialny za nią do kilku plików. Nie można go wstawić do DLL-a bo odnosi się on do konkretnego obiektu - ListBoxa na głównej formatce. Czy jest jakiś sposób by dołączyć fragment kodu z pliku i mieć go tylko w jednej kopii dla łatwej edycji?

Zdaję sobie sprawę że być może robię coś po Chińsku... z tym że to mój pierwszy projekt w Delphi. Najbardziej mnie wnerwia że zdecydowałem się na polskie nazwy własnych procedur, zmiennych, funkcji itp. Szerokosc := Width wygląda fatalne :/ Nie polecam. :)

Dziękuję za pomoc.

0

mam takie wrażenie, że za bardzo nie wiesz do czego jest default. Otóż klauzula default NIE nadaje wartości zmiennej! Ona tylko określa czy dana włściwości published będzie zapisywana do dfma czy nie. Co więcej ma ona sens tylko w przypadku właściwości komponentów bo tylko one zapisywane są w dfmach.

Co do drugiego to nie bardzo rozumiem, ale nie możesz tego przenieść do osobnego jednego modułu lub wstawić do modułu formy?

0

Muszę w takim razie w konstruktorze nadać wartości początkowe tych zmiennych zamiast wstawiać default. Jednakże błąd występuje i bez tej instrukcji. Kod:

type                                         //Klasa znaku przeanalizowanego i zapisanego jako grafika
  TZnakGfxInfo = class
  private
    ZnakID : TByteAndChar;                   //Struktura przecohuwaca nazwe znaku i jego ID

  public
    ObrazZnak : TBitmap;                     //Obraz znaku
    ObrazZnakKrawedz : TBitmap;              //Obraz krawędzi znaku (polowa rozdzielczosci oryginalu)
    ObrazZnakRozmyty : TBitmap;              //Obraz znaku po addytywnym rozmyciu Guassowskim (obraz oryginalu)

    SumyRGB : array[0..2, 0..2] of Integer;  //Sumy RGB w 9 obszarach znaku

    property ID : byte read ZnakID.Wartosc write ZnakID.Wartosc;
    property Nazwa : char read ZnakID.Nazwa write ZnakID.Nazwa;
    property SzerkoscX : integer read ObrazZnak.Height;               //Ten sam problem
    property WysokoscY : integer read ObrazZnak.Width;                //błąd "Record, object or type required"
  end;

Również się nie kompiluje, błąd opisany w komentarzu. Czy powinienem jakoś inaczej odwoływać się do tej wartości? Błąd świadczy o tym iż kompilator nie wie że ObrazZnak to TBitmap, przynajmniej z tego co ja rozumiem.

Co do drugiego problemu - wygląda na to że muszę poczytać o globalnych deklaracjach procedur. Procedura dodawania info do okna logu powinna być po prostu dostępna ze wszystkich okien.

0

Ale to trochę przerost formy nad treścią to co robisz bo robisz ObrazZnak jako zmienną publiczną i masz przez to dostęp do wszystkich jej publicznych i opublikowanych zmiennych, metod i właściwości dostęp i tak a później dodatkowo dopisujesz właściwości, które mają czytać z jej właściwości - takie masło maślane.
BTW zakomentuj te linie, gdzie się odwołujesz do ObrazZnak i zobacz czy w ogóle się kompiluje

0

Tak, reszta oczywiście działa.

Właściwie masz rację że taka struktura jest bez sensu, tym bardziej że wszystkie znaki w czcionce muszą mieć te same wymiary. Z tego powodu same zmienne przechowujące obraz powinny być chronione, a bitmapa wpisywana do nich sprawdzana, czy ma ten sam wymiar co poprzednie.

To co mnie zastanawia to dlaczego przyjmuje mi odwołanie do zadeklarowanego wcześniej typu i wszystko działa, a do bitmapy nie, mimo że też jest zadeklarowana i w pozostałych miejscach kodu TBitmap-y działają jak trzeba.

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