• 17 odgovora
  • 3.960 pregleda
Slika na user kontroli 26.04.2016. u 14:03 · pre 127 meseci #1
Radio sam slično, ali ne znam gdje sad griješim. Treba mi na mojoj kontroli postaviti sliku.
Kad kontrolu postavim na formu i u propery dodam sliku, u design modu se vidi, u runtime ne...

Osnovni dio kontrole:
Code:

  tMyGroupButton = class(TPanel)
  private
    fPicture: TImage;
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Picture: TImage read fPicture write fPicture;
  end;

...

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyControls', [tMyGroupButton]);
end;

constructor tMyGroupButton.Create(AOwner: TComponent);
begin
  inherited;
  fPicture := TImage.Create(self);
  fPicture.Parent := self;
  fPicture.Left := 20;
  fPicture.Top := 0;
  fPicture.Height := 24;
  fPicture.Width := 24;
  fPicture.Transparent := true;
  fPicture.AutoSize := true;
  fPicture.Visible := true;
end;

Re: Slika na user kontroli 26.04.2016. u 16:48 · pre 127 meseci #2
probaj za svaki slučaj
Code:
fPicture.BringToFront


Gdje zadaješ .picture property?
Potpis
F
Re: Slika na user kontroli 26.04.2016. u 17:33 · pre 127 meseci #3
Ovako na prvi pogled i meni deluje u redu, samo proveri da li dodeljuješ sliku i da li je to ispravna slika (tipa probja sa nekom koja je skroz crvena).
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Slika na user kontroli 27.04.2016. u 08:05 · pre 127 meseci #4
Još nešto, kad spremim pa učitam projekt, slika nestane.

Dodao sam, ali ne pomaže:

Code:

constructor tMyGroupButton.Create(AOwner: TComponent);
begin
...
   fPicture.BringToFront;
end;


Sliku dodjeljujem u design modu -> Object inspector -> Property -> Picture -> Picture

U Property-ima vidim moj published definirani property "Picture" koji ćita/piše direktno u private var "fPicture"

Kontrola je (za sada) vrlo jednostavna:
- nasljednik tPanela-a
- na noj je tImage kojem moram u design modu dodjeliti sliku

Svu "igru" koja slijedi još nisam niti počeo raditi.

Imam kontrolu koju sam ranije radio, koja doduše, koristi tBitBtn a ne tImage i s njom nisam imao tih problema. Ne vidim u kodu nešto različito zbog čega bi pamtila sliku...


Re: Slika na user kontroli 27.04.2016. u 08:46 · pre 127 meseci #5
Probaj da je dodeliš iz koda, tipa učitaš neki bmp iz fajla. Ako ne pomogne, jedino da pošalješ neki primer koda.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Slika na user kontroli 27.04.2016. u 08:53 · pre 127 meseci #6
Moram dodjeliti sliku u design modu.
Evo cijeli kod kontrole. Tek sam ju počeo slagati.
Sada kontrola, kad ju postaviš na formu ima dva property-a: "Pictur1" i "Picture". Jedno je moja definirana klasa (što će kasnije i biti), a drugo direktno tImage koju sam dodao radi testiranja problema sa slikom.

Code:

unit MyGroupButton;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.Graphics;

type
  tMyCaption = class
  
  end;

  tMyPicture=class(TPersistent)
  private
    fPicture: TImage;
    fOwner: TPersistent;
  public
    function GetOwner: TPersistent; override;
  published
    property Picture: TImage read fPicture write fPicture;  
  end;

  tMyGroupButton = class(TPanel)
  private
    fCaption: TMyCaption;
    fPicture: tMyPicture;
    fPicture1: TImage;
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Assign(aSour: TPersistent); override;
  published
    { Published declarations }
    property Picture: tMyPicture read fPicture write fPicture;
    property Pictur1: TImage read fPicture1 write fPicture1;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyControls', [tMyGroupButton]);
end;     

{ tMyGroupButton }

procedure tMyGroupButton.Assign(aSour: TPersistent);
begin
  inherited;
  if aSour is tMyPicture then begin
     //fPicture.fPicture.Picture := tMyPicture(aSour).fPicture.Picture;
  end else inherited;
end;

constructor tMyGroupButton.Create(AOwner: TComponent);
begin
  inherited;
  fCaption := tMyCaption.Create;
  fPicture := tMyPicture.Create;
  fPicture.fOwner := self;
  //fPicture.fPicture.Parent := self;
  fPicture.fPicture := TImage.Create(self);
  fPicture.fPicture.Parent := self;
  fPicture.fPicture.Left := 0;
  fPicture.fPicture.Top := 0;
  fPicture.fPicture.Width := 24;
  fPicture.fPicture.Height := 24;
  fPicture.fPicture.Transparent := true;
  fPicture.fPicture.AutoSize := true;
  fPicture.fPicture.Visible := true;
  //fPicture.fPicture.BringToFront;

  fPicture1 := TImage.Create(self);
  fPicture1.Parent := self;
  fPicture1.Left := 20;
  fPicture1.Top := 0;
  fPicture1.Height := 24;
  fPicture1.Width := 24;
  fPicture1.Transparent := true;
  fPicture1.AutoSize := true;
  fPicture1.Visible := true;
  fPicture1.BringToFront;
end;                             

destructor tMyGroupButton.Destroy;
begin
  fPicture.Free;
  fPicture1.Free;
  fCaption.Free;
  inherited;
end;

{ tMyPicture }

{ tMyPicture }


function tMyPicture.GetOwner: TPersistent;
begin
   result := fOwner;
end;

end.

Re: Slika na user kontroli 27.04.2016. u 09:09 · pre 127 meseci #7
Probaj kao test da to uradis i u runtimu, da bi se videlo je li problem u design time ili u samoj komponenti.
Prikaci (uz poruku kao attachment) ceo kod, i test projekat i komponentu.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Slika na user kontroli 27.04.2016. u 09:36 · pre 127 meseci #8
U constructor-u treba staviti inherited; na dno procedure .

Zasto? Zato sto inherited; poziva metodu Loaded; u kojoj se izvrsava ucitavanje resursa komponenta. A posto u momentu ucitavanja resursa (znaci slika), fPicture i fPicture1 jos nisu kreirane, zato i ostanu prazne.

Pozz
Re: Slika na user kontroli 27.04.2016. u 11:01 · pre 127 meseci #9
Ako stavim inherited na dno procedure, delphi kod postavljanja kontrole na formu javlja "Access violation at..."

Kako dodati attachment?
Re: Slika na user kontroli 27.04.2016. u 13:20 · pre 127 meseci #12
Citat:
FranjoZG:
Ako stavim inherited na dno procedure, delphi kod postavljanja kontrole na formu javlja "Access violation at..."


Izvinjavam se, prevideo sam da je na novijim Delphi-jima je Form1.OldCreatingOrder postavljeno na false.

Pogledao sam malo detaljnije kod. Za pocetak, predlazem da nateras prosti TImage (fPicture1) da se moze postaviti iz desingtime-a. Za slozeniju klasu TMyPicture ide dosta vise izmena.

Pozz
Re: Slika na user kontroli 27.04.2016. u 13:50 · pre 127 meseci #13
fPicture1 se može postviti u designtime-u preko property-a Picture1

klasa TMyPicture će ići kasnije kad dobijem da zapamti sliku fPicture1
Re: Slika na user kontroli 27.04.2016. u 14:29 · pre 127 meseci #14
Kad sam umjesto tIamge stavtio tBitMap stvar radi, pamti sliku. Jedni što se sad treba igrati sa prikazom.
Rješit ću to tako (ako netko od vas ne pronađen rješenje za direktno učitavnje u tImage).
Re: Slika na user kontroli 27.04.2016. u 15:09 · pre 127 meseci #15
FranjoZG,

nimalo me ne cudi sto si zaglavio s ovim; toliko je toga promenjeno u novijim Delphi-jima da vise covek nije pametan. Kod koji si postavio gore (uz neke izmene doduse) bi radio glat na (recimo) D7.

Posto me je zaintrigiralo zasto gornji kod ne radi, odvojio sam malo vremena i produvao zavrzlamu (komponenti su moja strast ). U prilogu je kod koji radi, uglavio sam i TImage i tvoju klasu TMyPicture. Kljuc je u pozivanju (nove?) metode SetSubComponent(IsSubComponent: boolean), i to svuda gde treba.

Kad iskompajliras i postavis slike u komponent (postavljen na formi), pogledaj prikaz 'View Form As Text', i tek ces onda videti kakav je to pi*vajz. Ali u ObjectInspector-u to izgleda sve kako treba.
Sledi kod:

Code:

unit MyGroupButton;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.Graphics;

type
  tMyPicture = class(TComponent) // zasto TComponent? zbog SetSubComponent()
  private
    fPicture: TImage;
  public
    constructor Create(aOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Picture: TImage read fPicture write fPicture;
  end;

  tMyGroupButton = class(TPanel)
  private
    fPicture: TMyPicture;
    fPicture1: TImage;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Picture: tMyPicture read fPicture write fPicture;
    property Picture1: TImage read fPicture1 write fPicture1;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyControls', [tMyGroupButton]);
end;

constructor tMyGroupButton.Create(AOwner: TComponent);
begin
  inherited;

  fPicture := tMyPicture.Create(self);
  fPicture.SetSubComponent(true);

  fPicture1 := TImage.Create(self);
  fPicture1.SetSubComponent(true);
  fPicture1.Parent := self;
  fPicture1.Left := 20;
  fPicture1.Top := 0;
  fPicture1.Height := 24;
  fPicture1.Width := 24;
  fPicture1.Transparent := true;
  fPicture1.AutoSize := true;
  fPicture1.Visible := true;
end;

destructor tMyGroupButton.Destroy;
begin
  fPicture.Free;
  fPicture1.Free;
  inherited;
end;

{ tMyPicture }

constructor tMyPicture.Create(aOwner: TComponent);
begin
  inherited;
  fPicture := TImage.Create(self);
  fPicture.SetSubComponent(true);
  fPicture.Parent := TWinControl(Owner); // ovo jeste malo nategnuto - typecast bez provere ...ali radi
  fPicture.Left := 0;
  fPicture.Top := 0;
  fPicture.Width := 24;
  fPicture.Height := 24;
  fPicture.Transparent := true;
  fPicture.AutoSize := true;
  fPicture.Visible := true;
end;

destructor tMyPicture.Destroy;
begin
  fPicture.Free;
  inherited;
end;

end.


Pozz
Re: Slika na user kontroli 27.04.2016. u 15:36 · pre 127 meseci #16
Hvala, provjerti ću kako radi (sutra, dosta za danas)

Složio sam s tBitMap, radi dobro, ali ovako izbjegavam petljanje oko refresha-a kod učitavanja slike.
Re: Slika na user kontroli 29.04.2016. u 12:26 · pre 127 meseci #17
Da ne otvaram novu temu, a odnosi se na istu kontrolu?

Kotrola mi je nasljednik tPanel-a, što znaći da u object inspectoru vidim sve property-e tPanela (kojih je peviše i ne želim da su svi dostupni)

Probao sam napraviti kontrolu kao nasljednika TWinControl ili TControl, a panel staviti kao atribut tako da mogu propagirati samo property-e koji mi trebaju. Kreiram ga u konstruktoru, ali se panel koji sam kreirao ne vidi na formi.


Re: Slika na user kontroli 29.04.2016. u 13:19 · pre 127 meseci #18
Delphi je upravo zgodan za te namene, sve controle imaju pravu funkcionalnost u neposrednom custom parentu, za panel je to TCustomPanel, dakle nasledi od njega i onda samo ubaci u published sekciju propertije koji ti trebaju, pogledaj kako je sam TPanel deklarisan u ExtCtrls unitu.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme