[ FranjoZG @ 26.04.2016. 14:03 ] @
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;

[ captPicard @ 26.04.2016. 16:48 ] @
probaj za svaki slučaj
Code:
fPicture.BringToFront


Gdje zadaješ .picture property?
[ savkic @ 26.04.2016. 17:33 ] @
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).
[ FranjoZG @ 27.04.2016. 08:05 ] @
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...


[ savkic @ 27.04.2016. 08:46 ] @
Probaj da je dodeliš iz koda, tipa učitaš neki bmp iz fajla. Ako ne pomogne, jedino da pošalješ neki primer koda.
[ FranjoZG @ 27.04.2016. 08:53 ] @
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.

[ savkic @ 27.04.2016. 09:09 ] @
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.
[ Rapaic Rajko @ 27.04.2016. 09:36 ] @
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
[ FranjoZG @ 27.04.2016. 11:01 ] @
Ako stavim inherited na dno procedure, delphi kod postavljanja kontrole na formu javlja "Access violation at..."

Kako dodati attachment?
[ savkic @ 27.04.2016. 11:22 ] @
> Kako dodati attachment?

Kad pošalješ poruku, na dnu treba da bude "Upload uz poruku".
[ FranjoZG @ 27.04.2016. 11:50 ] @
Našao... ovo je kontrola, ostatak nije bitan - forma i na njoj postaviti kontrolu
[ Rapaic Rajko @ 27.04.2016. 13:20 ] @
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
[ FranjoZG @ 27.04.2016. 13:50 ] @
fPicture1 se može postviti u designtime-u preko property-a Picture1

klasa TMyPicture će ići kasnije kad dobijem da zapamti sliku fPicture1
[ FranjoZG @ 27.04.2016. 14:29 ] @
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).
[ Rapaic Rajko @ 27.04.2016. 15:09 ] @
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
[ FranjoZG @ 27.04.2016. 15:36 ] @
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.
[ FranjoZG @ 29.04.2016. 12:26 ] @
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.


[ savkic @ 29.04.2016. 13:19 ] @
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.