Dwa problemy... jak to zrobić?

0

Cześć
Mam dwa problemy bo nie wiem jak zrobić coś takiego:

Mam bitmape monochromatyczną (czyli kolor biały i czarny) i musze ją pociąć poziomo na pasy o wysokości 8 pixeli. Następnie każdą kolumnę 8-pixelową w każdym pasie zapisać w postaci jednego bajtu czyli od 0 do 255 (bit: 1-czarny, 0-biały). Przykładowo wczytuje bitmape 84x48. Zostaje podzielona na 6 pasków po 48 bajtów na każdy. Następnie wszystkie bajty wpisac np do memo po przecinku: 1,2,3,4.....

Mam pole 8x8 robione np. z 64 buttonów albo pole 8x8 w paintboxie... wszystko jedno byle 8x8 i przy pomocy myszki mogę zaznaczać lub odznaczać dowolne pola. Później musze to zapisać jako 8x8 bajtów tak jak w przypadku poprzedniego problemu.

aha najmłodszy bit liczy się od góry.
Jeśli wiecie jak to zrobić to byłbym wdzięczny za pomoc!

0

Nie wierze... nie ma tu takich kozaków co by potrafili to zrobić? :)

0

Dobra, zrobiłem ci to drugie, bo się szybciej pisze, na drugie nie mam czasu, od rana jestem na nogach i dopiero co wróciłem do domu i zaraz ide w kimę. Nie chce mi się nic opisywać, zarzucę ci gotowy kod. Swoją drogą nie wierze, żebyś sam nie potrafił tego zrobić...
dobra, to pokolei, najpierw w uses dodaj Buttons bo skorzystamy z TSpeedButton. Teraz stwórz tablicę [1..8,1..8] of TSpeedButton; Teraz kolej na dynamiczne stworzenie tych 64 przycisków:

procedure cośtam(Sender: TObject); //np. Button1 Click albo gdzieś
var x,y:Integer;
begin
  for y:=1 to 8 do
    for x:=1 to 8 do begin
      przyciski[x,y]:=TSpeedButton.Create(Form1);
      with przyciski[x,y] do begin
        Parent:=Self;
        Left:=10+(x-1)*32;
        Top:=10+(y-1)*32;
        Width:=32;
        Height:=32;
        GroupIndex:=(y-1)*8+x;
        OnClick:=Klikniecie;
    end;
  end;
end;

Teraz kolej na stworzenie procedury Klikniecie. Jest ona po to, żeby speedbutton po kliknięciu sporotem wyskakiwał do góry (tak swoją drogą, to żeby każdy z osobna skakał w dół, musi mieć inny groupindex, obacz poprzednią procke):

procedure TForm1.Klikniecie(Sender: TObject);
begin
  (Sender as TSpeedButton).AllowAllUp:=true;
end;

Oczywiście ta procka musi być zdeklarowana w jakimś publicku czy gdzie tam sobie chcesz. To teraz zliczanie tych twoich bitów, bajtów i innych szmerów. Przyda się także procka do potęgowania, bo pod tym względem delphi jest biedne, albo ja jestem tempy i nie znam polecenia do potęgowania :P :

function potega(podstawa,wykladnik: Integer): Integer;
var i:Integer;
begin
  if wykladnik=0 then result:=1
  else begin
    result:=podstawa;
    for i:=2 to wykladnik do
      result:=result*podstawa;
  end;
end;
//i w końcu to liczenie - ja to walnąłem do memo1, a ty rób, gdzie ci się podoba:
procedure cośam2;  //np. kliknięcie 2 buttona
var x,y,bajt: Integer;
begin
  Memo1.Lines.Clear;
  for y:=1 to 8 do begin
    bajt:=0;
    for x:=8 downto 1 do
      If przyciski[x,y].Down then bajt:=bajt+potega(2,x-1);
    Memo1.Lines.Add(IntToStr(bajt));
  end;
end;

No, może ta zmienna bajt by mogła być typu Byte, x i y też, no ale co tam - zrobiłem to na szybko i z nudów, na tej samej zasadzie bez problemu chyba zrobisz sobie to pierwsze zagadnienie... Oczywiście to co tutaj prezentuje to jest zrobione po linii najmniejszego oporu, ale co tam :P Jak narzekasz to masz. Chyba nie trudne, skoro nawet ja sobie z tym poradziłem, nie?

0

Wielkie dzięki! o to mi chodziło. Co prawda zapisuje wiersze zamiast kolumn jako liczbę ale to juz sobie sam przerobiłem.

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