Zmiana wlasciwosci komponentu??

0

Witam,
jestem poczatkujacy w te klocki, na lekcji mielismy proste zadanie narysowac wykres "czegos tam" za pomoca Canvas. Ale przy okazji utrudnilismy sobie zadanie i ten wykres ma byc narysowany na Panelu. Problem w tym ze Panel nie obsluguje Canvas. Czy istnieje sposob, jesli tak to jaki na dolozenie do Panelu dodatkowo wlasciwosci Canvas nie tworzac nowego typu Panelu. No troche pozawijalem. Z gory dziekuje za odpowiedz. Nie jest to do szkoly na ocene tylko dla mojej samej satysfakcji z tej informacji i nauki programowania. Bede nadal szukal czegos w necie jesli znajde to sam napisze. :-)

0

Proszę bardzo,dam Ci przykład co po wszystkim możesz mazać nawet po buttonie:)

var
P:TCanvas;
Begin
P:=TCanvas.Create;
P.Handle:=GetWindowDC(Panel1.Handle);
P.Brush.Color := clBlue;
P.Ellipse(50, 50, 200, 200);
end;
0

dzieki :-) sprobuje ale chyba to rozwiazuje tylko polowe problem..bede mial jak rysowac, ale nie zmienia faktu ze nie zaspokoilem swojej ciekawosci jak zmienic to bezposrednio w komponencie:(

0

Po pierwsze możesz sobie zmodyfikować komponent Tpanel jest chyba w

Uses ExtCtrls 
TPanel = class(TCustomPanel) 

i dodać sobie opcje Canvas albo napisać własny http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_15 . Tak czy inaczej poczytaj sobie kompedium aby zrozumieć co to jest w ogóle komponent
i będziesz mógł wszystko od nowa sobie napisać.

0

wlasnie mi o to idzie zeby zmienic ten komponent tylko chcialbym wiedziec jak..dzieki za twoj poswiecony czas..zwlaszcza w piatek wieczorem ;-)

0

Poniżej masz przykład jak dodać do komponentu ScrollBox Canvas, ktorego ten komponent normalnie nie ma
i własność Bitmap, na której jeżeli rysujemy cokolwiek i przypiszemy do Canvasu - to zostanie na nim to coś:

unit canvasedscrollbox;

interface

uses
  Windows, Messages, Classes, Controls, Forms, Graphics;

type
  TCanvasedScrollBox = class(TScrollBox)
  private
    FBmp: TBitmap;
    FCanvas: TCanvas;
    procedure SetBitmap(Value: TBitmap);
  protected
    procedure WMPaint(var Message: TMessage); message WM_PAINT;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Bitmap: TBitmap read FBmp write SetBitmap;
    property Canvas: TCanvas read FCanvas;
  end;

implementation

constructor TCanvasedScrollBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
     csSetCaption, csDoubleClicks];
  Width := 185;
  Height := 41;
  BorderStyle := bsSingle;
  FBmp := TBitmap.Create;
  FCanvas := TControlCanvas.Create;
  TControlCanvas(FCanvas).Control := Self;
end;

destructor TCanvasedScrollBox.Destroy;
begin
  FBmp.Free;
  FCanvas.Free;
  inherited Destroy;
end;

procedure TCanvasedScrollBox.SetBitmap(Value: TBitmap);
begin
  FBmp.Assign(Value);
  SendMessage(Handle, WM_PAINT, 0, 0);
end;

procedure TCanvasedScrollBox.WMPaint(var Message: TMessage);
begin
  if Assigned(FBmp) then
    Canvas.Draw(0, 0, FBmp);
  inherited;
end;

end.

Próbowałem to samo zrobić z TPanel, ale o dziwo nic się nie pokazuje jak wypełnię Bitmapę
na przykład czerwonym kolorem i przypiszę tę Bitmapę Panelowi to on nic nie wyświetla, no
więc może coś źle robię, ale się chyba na Penlu nie da tak rysować, ale pusty ScrollBox jest
według mnie bardzo pdoobny do TPanel tylko wklęsły. Dodam tylko że jak chcesz dodać ów
komponent na stale do palety to dopisz taką procedurę do źródła jak poniżej - a spowoduje
ona że komponent doda się to palety "Samples". Poniżej zaś masz przykład użycia całości:

procedure Register;
begin
  RegisterComponents('Samples', [TCanvasedScrollBox]);
end;

W sposób dynamiczny, bo statycznie jak masz umieszczony to zmieniasz własność Bitmap:

var
  Bmp : TBitmap;
  A : TCanvasedScrollBox;
begin
  A := TCanvasedScrollBox.Create(Self);
  A.Parent := Self;
  A.Width := 300;
  A.Height := 100;
  Bmp := TBitmap.Create;
  Bmp.Height := 30;
  Bmp.Width := 100;
  Bmp.Canvas.Brush.Color := clRed;
  Bmp.Canvas.Fillrect(ClientRect);
  A.Bitmap := Bmp;
  Bmp.Free;
end;
end;
0

jestes wielki olesio!..ale to nie zmienia faktu ze ten typ jakby to powiedziec stworzyles a mi szlo o to zeby tylko namieszac juz w istniejacym..np. wezme juz sobie istniejacy panel metoda "kliknij przenies" a potem uzyje jego do tych niecnych celow po prostu rysujac sobie na nim canvas..to co pokazaliscie mi oboje bylo swietne ale znalazlem juz to na necie..a jestem ciekaw czy to co sobie ja zamarzylem jest mozliwe?:P

0

Cieszę się że mogłem pomóc. Jednak jeśli nie chcesz modyfikować komponentu wzbogacając go o jakąś tam
własność to możesz użyc kodu, który podał lankusiek. Co ciekawe maluje on jednak po TPanel, a maluje też
na innym komponencie ktorego uchwyt podasz, na przykład na ScrollBoxie. Jednak jeżeli zminimalizujesz lub
przełączysz na chwile na inną aplikację to rysunek zniknie gdyż wywoływany jest komunikat WM_PAINT i cała
formatka jest rysowana od nowa. Można przechwycić ten komunikat i kazać coś rysować na nowo ale - jeżeli
spóbujesz - to wiesz, że słabo to działa. Innych pomysłów nie mam. Może jakoś się da to zrobić - jednak ja
na to nie mam innych pomysłów. Jeśli dodawanie dynamicznie ScrollBoxa jest dla Ciebie problemme to równie
dobrze możesz ten komponent dodawać do źródeł swojego programu i zalecać Użytkownikowi jego instalację
sam robiąc to samo, ale żeby się ładnie zainstalował Ci na palecie "Samples" to musisz dodać to, co pisałem.

A w ostateczności możesz umieścić na formatce zwykły TImage i na nim rysować, a rysunki nie będą znikać.
No i podsumowując o ile się orientuje - to nie ma możliwość dodania własności (Ty pytasz o zmianę, ale to w
sumie w przypadku Canvasa jest dodanie do komponentu, bo ów własność dla większości nie istnieje wcale)
bez tworzenia komponentu od nowa wzbogaconego o te własność. Po prostu komponent dziedziczy wszystko
z oryginalnego plus ma obsługę jeżeli dodasz nowej własnośći. Inny przykład. Potrzebowałem żeby Memo mi
wyświetlało tekst tylko z dużych liter przy wpisywaniu. Musiałem sobie zajrzeć do źródła TEdit (jeszcze to był
moduł z Delphi 3) i zobaczyć jak ustawia się CharCase, a następnie utworzyłem klasę pochodną od TMemo i
dodałem do niej obsługę CharCase. A że komponent miał być jeden w osobnej formstce to dodałem go tam,
w spsób dynamiczny i wszystko działa jak należy. Do istniejącego Memo tak własności bym nie dodał wcale.

0

Dzieki na ta informacje czekalem:P Pozdrawiam:-)

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