[builder] problem z odświeżaniem komponentu Image

0

Witam.
Mam taki problem z odświeżaniem w komponencie Image, włączyłem DoubleBuffered i gdy Image jest bezpośrednio na formularzu to jest OK, ale gdy Image jest w komponencie ScrollBox to obraz jest wyświetlany tak, jakby DoubleBuffered był wyłączony.

Tutaj jest exe:
http://www.extradomena.pl/pliki/builder.exe

Źródło:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
        DoubleBuffered = true;
        Image1->Picture->Bitmap->Width = Image1->Width;
        Image1->Picture->Bitmap->Height = Image1->Height;
        Image2->Picture->Bitmap->Width = Image2->Width;
        Image2->Picture->Bitmap->Height = Image2->Height;
        Image1->Picture->Bitmap->Canvas->Brush->Color = clRed;
        Image2->Picture->Bitmap->Canvas->Brush->Color = clRed;
        Image1->Picture->Bitmap->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
        Image2->Picture->Bitmap->Canvas->Rectangle(0,0,Image2->Width,Image2->Height);
}
//---------------------------------------------------------------------------

// bezposrednio w Form1
void __fastcall TForm1::Image2MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
        if ( Shift.Contains(ssLeft) )
        {
                Image2->Picture->Bitmap->Canvas->Rectangle(0,0,Image2->Width,Image2->Height);
                Image2->Picture->Bitmap->Canvas->Ellipse(X-20,Y-20,X+20,Y+20);
        }
}
//---------------------------------------------------------------------------

// w ScrollBox'ie i tutaj jest zle odswiezanie
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
        if ( Shift.Contains(ssLeft) )
        {
                Image1->Picture->Bitmap->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
                Image1->Picture->Bitmap->Canvas->Ellipse(X-20,Y-20,X+20,Y+20);
        }
}

Z góry dziękuję za odpowiedź.
Pozdrawiam.

0

Po pierwsze wypadaloby skompresowac tego exec'a przed umieszczeniem w sieci.
Po drugi miga bo musi migac. Image lezy na ScrollBox'ie wiec jest on odrysowywany gdy zmieniasz obrazek. Aby wymusic na nim (ScrollBox'ie) aby tego nie robil trzeba mu ustawic Brush->Style na bsClear (np. ScrollBox1->Brush->Style = bsClear;). Minus jest taki, ze jesli Image bedzie mniejszy niz ScrollBox to na "wystajacej" czesci beda smieci - trzeba sie tym tez zajac...

0

Kurcze , przekompilowałem kod i mi nic nie miga ( w moim .exe ).
Może troszkę przy przesunięciu srollami , ale w porównaniu
z .exe z linku jest dobrze . :|

0

Można również ScrollBoxowi włączyć buforowanie, a nie obrazkowi. Zresztą, ja się nigdy nie bawię, i jak chcę wyłączyć miganie, to ustawiam DoubleBuffered głównej formie, i później o niczym nie muszę myśleć. Może żre zasoby, ale bez przesadyzmu...

0

Już problem rozwiązałem.
Gdy daje DoubleBuffered w FormCreate to jest ono tylko dla komponentów umieszczonych bezpośrednio na Form, aby w ScrollBoxie też było podwójne bufowowanie należy w FormCreate dodać linię:
ScrollBox1->DoubleBuffered = true;
i wtedy podwójne bufoeowanie będzie włączone dla komponentów zawartych w ScrollBoxie.
Takie proste, a tyle szukania było :D
Pozdrawiam

0

Ja mam jueszcze ciekawszy przypadek.
Używam TCanvas jako objektu składowego własnej klasy, coś tam po nim rysuje (skomplikowany wykres). Konstruktor jako argument przyjmuje Uchwyt do okna (przeładowany do pulpitu, kolejny wsk do Canvas).
I jak tu zrobić podwójne buforowanie...?
Próbowałem wszystkich metod:
DoubleBuffered=true; (na OnCreate Form'a) - nic nie daje.
Wewnątrz klasy rysować na jednym płutnie (w pamięci) a na koniec kopiować do plutna podłonczonego pod uchwyt Okna (CopyRect) - rysuje tylko jednokrotnie.
Tą drugą metodę testowałem na zewnątrz poprzez dodanie tych buforów w dziedziczeniu Form1 i działa, a jak to robię w swojej klasie, wszystkie metody zawodzą.
Dodam tylko, że program jest wielowątkowy, ale gdy rysuje bez buforowania, jest ok (poza migotaniem).

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