Canvas.Draw - pytanie

0

Napisałem coś takiego:

var
obraz : TBitMap;
begin
obraz.LoadFromFile('img/logo.BMP');
Canvas.Draw(0,0,obraz);
end;

Jest to w procedurze OnCreate - kiedy kompiluje program jest wszystko OK! (Ctrl+F9), natomiast kiedy uruchamiam (F9) wywala karte z blędami: tytuł: Debugger Exception Notification; treść: Project Baza_Danych.exe raised exception class EExternalException with message 'External exception C000001D'. Process stopped. Used Step or Run to continue. Czy ktoś może wie o co tu chodzi ??

0

Daj to w OnPaint.

//DOPISANE
AndRew przebił nas wszystkich. Respect....

0

wciepnij tą procke do OnActivate formy. z tego co sie orientuje to ci błąd wyskakuje dlatego ze procedura oncreate wykonuje sie jeszcze zanim forma zostaje pokazana, a ty tam juz chcesz cos rysować. OnActivate wykonywane jest wtedy gdy juz forma sie pokaze.

0

Wywołujesz to w konstruktorze a wtedy jeszcze Canvas nie istnieje.

[<font color="blue">dopisane</span>]
Dziwne - ja miałem kiedyś problemy z użyciem Canvas w konstruktorze, ale to był BCB.

0

imho zapomniałeś o obraz := TBitmap.Create...

0

Dzięki za pomoc. matoda AndReg'a jest OK! :-) Wszystko dziła. Tylko zaskoczył mnie efekt... jak się uruchomił program. Sprobowałem później w OnPaint - efekt ten sam. Przerobilem tez troszke kod na:

Form3.Canvas.Draw(0,0,obraz);

jednak nadal po uruchomieniu programu nic nie widać. Robiąc to myślałem, że przynajmniej się to pokaże gdzieś na formie, a tu nic, tak na prawdę liczyłem ze uzyskam tlo Formy w ten sposób, niestety na formie nie widac w ogóle tego obrazka! Czy to normalne? Jak zrobić żeby było widać?

(p.s. Jak zrobiłem w OnCreate to kiedy startował program i tworzyły się Formy to przez momęt pokazał się obrazek ale kiedy program już wystartował i zamknęła się Forma1, ktora pełni rolę Loadingu i pojawiła się Forma3 wszystko zniknęło)

0

Wszystko zniknęło, bo forma się odrysowała. Jeśli to ma być permanentnie, to zrób tak jak napisał berl - rysuj bitmapę w zdarzeniu OnPaint formy.

0

Poszedłem za radą wrzuciłem w OnPaint są teraz 2 sytuacje, jeśli dam:

Form3.Canvas.Draw(0,0,obraz); 

to przy kompilowaniu i urachamianiu jest wszystko OK! Lecz na formie nic nie wiać! (czy to że na formie są jakieś obiekty np. Edit1 to ma na to wpływ? Jest jakies polecenie, domyślam się że w API, które by rozciągało obraz na całą formę?)

Natomiast w drugiej sytuacji kiedy dam w OnPaint:

Canvas.Draw(0,0,obraz); 

to przechodzi kompilacje, a przy uruchomieniu wyrzuca komunikat: tytuł: Debugger Exception Notification; treść: Project Baza_Danych.exe raised exception class EAccessViolation with message 'Access violation at address 005387FD in module 'BAZA_DANYCH.EXE'. Read of address B883669F'. Process stopped. Used Step or Run to continue.

Ja się już gubie o co tu chodzi... zwlaszcza, dopiero się ucze pisać w Delphi...

(P.S. Jeszcze raz bardzo dziękuje za pomoc...)

0

więc jeśli chodzi Ci o tło dla programu, to walnij na formę komponent TImage i po kłopocie...

0

ja ma coś takiego i ladnie działa
oczywiście w OnPaint

var b:TBitmap;
begin
b:=TBitmap.Create;
b.LoadFromFile('c:\f1.bmp');
Canvas.Draw(0,0,b);
b.free;
end;

I jeszcze jedno w twoim pierwszym poscie zamiast
obraz.LoadFromFile('img/logo.BMP');
powinno być raczej
obraz.LoadFromFile('img\logo.bmp');
a właściwie to po co dodajesz "form3" skoro on i tak rysuje na przypisanej do unita formie... :-)

0

ja ma coś takiego i ladnie działa
oczywiście w OnPaint

var b:TBitmap;
begin
b:=TBitmap.Create;
b.LoadFromFile('c:\f1.bmp');
Canvas.Draw(0,0,b);
b.free;
end;

brawo.. i za każdym razem (50 razy na skundę) obrazek jest ładowany z dysku, rysowany a następnie zwalniany... a niektórzy "spece" na forum wydziwiają że im się windows zawiesza.. przy takich programach sam bym się powiesił..

0

AndRew mnie poprzedził, ale napiszę raz jeszcze, jak ja sam bym to zrobił.
Po pierwsze:
Zmienna TBitmap globalna, w OnCreate tworzenie i ładowanie z pliku.
Po drugie:
W OnPaint rysowanie na Canvas'ie.
Po trzecie:
W OnClose formy: Bitmap.Free.

Mam nadzieję, że teraz nie będzie kłopotów z narysowaniem.
Jeżeli chodzi o rozciąganie, to jeśli się nie mylę trzeba ustawić jakąś właściwość (nie pamiętam jak się nazywa, a nie chce mi się Delphi włączać), odpowiedzialną za "rozciąganie obrazka wraz z wielkością komponentu" a następnie ustawienie Bitmap.Width:=Form3.ClientWidth; i Bitmap.Height:=Form3.ClientHeight; jeśli chcesz mieć na całą formę.

0

radzę poczytać o StrechDraw.

0

Pochwalony! Możecie to napisać w Image'u zamiast na Canvasie!! Po co się męczyć, jak jest już do tego komponent!! A tak poza tym to można zrobić zmienną globalną typu TBitmap i w OnCreate niech do tej zmiennej będzie ładowany rysunek. W OnDestroy zwalniany, a w OnPaint (ostatecznie) ładowany na Canvas. Ale i tak skorzystałbym z TImage'a :P. Pozdrowienia Ki

0

Możecie to napisać w Image'u zamiast na Canvasie

A jak w programie jest 10 form, na każdej po 3 panele, które też trzeba zamalować, to daje razem 10 teł form + 30 teł paneli = 40 teł. Jeden TImage to około 12kb, czyli przy 40 tłach to wzrost pliku wykonywalnego o jakieś 480kb. Ale jak kto woli...

//DOPISANE
No fakt, MatroX, może się zapędziłem, rzeczywiście zajmuje niecałe 15kB. I muszę przyznać, że ładowanie obrazka do TImage trwa nieco szybciej (0.0057 sek.) niż StretchDraw (0.0064 sek.). Ale to nie zmieni faktu, że stosowanie nadmiernej iczby zbędnych komponentów jest według mnie nieeleganckie.

0

480kB ?? Jestes pewien? Moge się założyć, że wstawienie 40 Image'ów na forme zajmie góra 15kB w exeku. Owszem wstawienie pierwszego zajmuje okolo 12kB, ale wstawianie kolejnych już grosze. Jakby było jak piszesz to zrobienie 10 form w programie zajmowałoby kilka MB.

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