[C++] Problem z tworzeniem dynamicznego komponentu

0

Witam.

Tworzę w BDS 2006 (C++ Turbo Explorer) własny komponent i mam problem z dostępem do komponentów umieszczonych w komponencie który tworzę. Może ktoś mi wyjaśni z was co nie tak robię.

kod komponentu :

plik MyComponent.cpp - konstruktor


#include <vcl.h>

#pragma hdrstop

#include "DockShortCut.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//

static inline void ValidCtrCheck(TDockShortCut *)
{
	new TDockShortCut(NULL);
}
//---------------------------------------------------------------------------
__fastcall TDockShortCut::TDockShortCut(TComponent* Owner)
	: TPanel(Owner)
{
 BevelOuter = bvNone;
 Height = 22;
 
 ShortCutIconPanel = new TPanel(this);
 ShortCutIconPanel->Parent = this; //TDockShortCut;
 ShortCutIconPanel->Width = 31;
 ShortCutIconPanel->Align = alLeft;
// ShortCutIconPanel->BevelOuter = bvNone; // działa
 ShortCutIconPanel->ParentColor = true; // musiałem użyć aby przekazywał kolor z rodzica - inaczej nie działa pobranie koloru z TransparentColor
 String test = "X" + ShortCutCaption; // chciałem aby wyświetlał napis chociażby na TPanel bo na TLabel->Caption nie działa
 ShortCutIconPanel->Caption = test; //"X"; // + this->ShortCutCaption;
 ShortCutIconPanel->OnClick = this->OnClick;

// ShortCutIconPanel->Color = Color; //TransparentColor; // miał tu ustawić kolor podkładu który miał być potem używany jako przezroczysty
/* praktycznie w ogóle nie działa ten kawałek kodu :(
 ShortCutIconLink = new TLabel(this);
 ShortCutIconLink->Parent = ShortCutIconPanel;
 ShortCutIconLink->AutoSize = false;
 ShortCutIconLink->Align = alClient;
 ShortCutIconLink->Caption = ShortCutCaption;
 ShortCutIconLink->OnClick = MyDockShortCutFunction(ShortCutFilePath); // wywala błąd ""
*/
}
//---------------------------------------------------------------------------
void __fastcall TDockShortCut::ShortCutIconLinkClick(String MyShortCutFilePath)
{
 ShowMessage(MyShortCutFilePath);
}
//---------------------------------------------------------------------------
namespace Dockshortcut
{
	void __fastcall PACKAGE Register()
	{
		TComponentClass classes[1] = {__classid(TDockShortCut)};
		RegisterComponents("MyDock", classes, 0);
	}
}
//---------------------------------------------------------------------------

plik MyComponent.h


#ifndef DockShortCutH
#define DockShortCutH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE TDockShortCut : public TPanel
{
private:
	TLabel *ShortCutIconLink;
protected:
public:
	TColor TransparentColor;
	String ShortCutCaption;
	String ShortCutFilePath;
	TPanel *ShortCutIconPanel;
	__fastcall TDockShortCut(TComponent* Owner);
__published:
	void __fastcall ShortCutIconLinkClick(String MyShortCutFilePath);
};
//---------------------------------------------------------------------------
#endif

Utworzenie komponentu w głównej części programu :


 // TDockShortCut test
  MyDockShortCut = new TDockShortCut(this);
  MyDockShortCut->Parent = Panel1;
  MyDockShortCut->Align = alTop;
  MyDockShortCut->Height = 22;
  MyDockShortCut->Color = clGreen;
  MyDockShortCut->OnClick = MyDockShortCutFunction; // Funkcja podpięta - poniżej
  MyDockShortCut->ShortCutIconPath = "";
  MyDockShortCut->ShortCutCaption = "W";

Funkcja główna dla komponentu MyDockShortCut którą chciałbym aby komponentu podrzędne obsługiwały ale nie działa to coś :(


void __fastcall TForm1::MyDockShortCutFunction(TObject *Sender)
{
 Form1->Caption = "Wywolane zdarzenie z komponentu TShortCut";
}

Ogólnie chce zrobić komponent który przejmie takie właściwości jak :

  • Kolor który ma mieć komponent typu TPanel
  • Napis który ma być wyświetlony na TLabel
  • chcę utworzyć funkcję która po kliknięciu w label wyświetli ShowMessage(NazwaPliku);

Może ktoś podpowiedzieć co jak zrobić aby pod-komponenty komponentu MyDockShortCut przejmowały takie informacje jak Caption i zdarzenie OnClick ?

0

Twój komponent z sumie składa się z:

  • TDockShortCut (który jest w sumie TPanel'em - dziedziczy po nim),
  • TPanel (ShortCutIconPanel),
  • TLabel (ShortCutIconLink)

o to Ci chodziło?

Color i OnClick przypisujesz do TDockShortCut czyli do tego, na którym umieszczone są TPanel i TLabel.

Przypisanie Parenta w konstruktorze z tego co ja wiem (może źle wiem) nie będzie ok, bo jest on przypisywany po wyjściu z konstruktora. Najlepiej nadaje się do tego dziedziczona funkcja Loaded:

protected:

	virtual void __fastcall Loaded(void);

W której np:

void __fastcall TDockShortCu::Loaded(void){

	TPanel::Loaded(); // dziedziczysz po TPanel

	// jesli w trybie projektowania to koniec
	if(ComponentState.Contains(csDesigning)){

		return;
	}

	// ja tu tworze dodatkowe komponenty: TPanel, TLabel..
	// i ustawiam Parent, i inne

ShortCutIconPanel->OnClick = this->OnClick;

Te ustawienie w konstruktorze nic Ci nie da, bo przypisujesz tam 0. Powinieneś zrobić właściwość np.:

__property TNotifyEvent OnClick = { read = OnClick, write = TwojaFunkcjaUstawiajaca };
0

Dzięki wielkie jak tylko wrócę do domu to sprawdzę to.

Mam jeszcze jedną prośbę chociaż może za dużą... mógłbyś napisać mi przykładowy gotowiec jak podpiąć obsługę ładowania z zewnątrz napisu Caption, metody OnClick i ładowania obrazka ? Nigdy jeszcze nie potrzebowałem tak komponentów projektować a moja metoda jaka wczoraj jako tako wyszła wygląda tak :

Komponent.cpp:

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "DockShortCut.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//

static inline void ValidCtrCheck(TDockShortCut *)
{
	new TDockShortCut(NULL);
}
//---------------------------------------------------------------------------
__fastcall TDockShortCut::TDockShortCut(TComponent* Owner)
	: TPanel(Owner)
{
 BevelOuter = bvNone;
 Height = 22;
 // Panel z ikonką
 ShortCutIconPanel = new TPanel(this);
 ShortCutIconPanel->Parent = this;
 ShortCutIconPanel->Align = alLeft;
 ShortCutIconPanel->Width = 31;
 ShortCutIconPanel->BevelOuter = bvNone;
 ShortCutIconPanel->ParentColor = true;
 // ikonka
 ShortCutIcon = new TImage(this);
 ShortCutIcon->Parent = ShortCutIconPanel;
 ShortCutIcon->Top = 3;
 ShortCutIcon->Left = 6;
 ShortCutIcon->Width = 16;
 ShortCutIcon->Height = 16;
 ShortCutIcon->Center = true;
 // przesłona na ikonkę na cały panel
 ShortCutIconLink = new TLabel(this);
 ShortCutIconLink->Parent = ShortCutIconPanel;
 ShortCutIconLink->Align = alClient;
 ShortCutIconLink->AutoSize = false;
 ShortCutIconLink->Transparent = true;
 ShortCutIconLink->BringToFront();
 ShortCutIconLink->Cursor = crHandPoint;

 // Panel z nazwą skrótu
 ShortCutLinkPanel = new TPanel(this);
 ShortCutLinkPanel->Parent = this;
 ShortCutLinkPanel->Align = alClient;
 ShortCutLinkPanel->BevelOuter = bvNone;
 ShortCutLinkPanel->ParentColor = true;
 // Przesłona z nazwą skrótu
 ShortCutLink = new TLabel(this);
 ShortCutLink->Parent = ShortCutLinkPanel;
 ShortCutLink->Align = alClient;
 ShortCutLink->Layout = tlCenter;
 ShortCutLink->Cursor = crHandPoint;

}
//---------------------------------------------------------------------------
namespace Dockshortcut
{
	void __fastcall PACKAGE Register()
	{
		TComponentClass classes[1] = {__classid(TDockShortCut)};
		RegisterComponents("MyDock", classes, 0);
	}
}
//---------------------------------------------------------------------------

Komponent.h:

//---------------------------------------------------------------------------

#ifndef DockShortCutH
#define DockShortCutH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE TDockShortCut : public TPanel
{
private:
protected:
public:
	TLabel *ShortCutLink;
	TImage *ShortCutIcon;
	TLabel *ShortCutIconLink;
	TColor TransparentColor;
	String ShortCutIconPath;
	String ShortCutCaption;
	String ShortCutFilePath;
	TPanel *ShortCutIconPanel;
	TPanel *ShortCutLinkPanel;
	__fastcall TDockShortCut(TComponent* Owner);
__published:

};
//---------------------------------------------------------------------------
#endif

główne wykonanie kodu

//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 MyDockShortCut = new TDockShortCut(this);
 MyDockShortCut->Parent = Panel1;
 MyDockShortCut->OnResize = CreateShortCutButton;
 MyDockShortCut->Align = alTop;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyDockShortCutFunction(TObject *Sender)
{
 Form1->Caption = "Wywolane zdarzenie z komponentu TShortCut";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 delete MyDockShortCut;
}
int i=0;
//---------------------------------------------------------------------------
void __fastcall TForm1::CreateShortCutButton(TObject *Sender)
{
 i++;
 ShowMessage("KK");

 MyDockShortCut->Color = clGreen;
 MyDockShortCut->TransparentColor = clGreen;
 MyDockShortCut->ShortCutIconPanel->Color =  MyDockShortCut->TransparentColor;

 MyDockShortCut->OnClick = MyDockShortCutFunction;
 MyDockShortCut->ShortCutIconLink->OnClick = MyDockShortCutFunction;
 MyDockShortCut->ShortCutLink->OnClick = MyDockShortCutFunction;

 MyDockShortCut->ShortCutIconPath = "E:\\icon.ico";
 MyDockShortCut->ShortCutCaption = IntToStr(i) + "MyShortCut" ;

 if(FileExists(MyDockShortCut->ShortCutIconPath))
	MyDockShortCut->ShortCutIcon->Picture->LoadFromFile(MyDockShortCut->ShortCutIconPath);

 MyDockShortCut->ShortCutLink->Caption = MyDockShortCut->ShortCutCaption;
}

Teraz wiem że powinno być inaczej ale działa. Natomiast wolałbym aby tylko niektóre elementy np TLabel'a były dostępne a nie wszystkie.

Chcę zrobić odwołanie do TLabel poprzez :

MyDockShortCut->ShortCutCaption = "MyShortCut";

Podobnie z TPanel :

MyDockShortCut->TransparentColor = clGreen;

I z tego co mi się wydaje to w tej funkcji będę musiał ustawić aby label przejął Caption taki jak komponent rodzica ma w

MyDockShortCut->ShortCutCaption = "MyShortCut";

Tylko czy w czasie działania programu będę w stanie zmienić ten napis na inny ?

0

Wieczorem może dam radę napisać jakieś przykłady.
Ale poczytaj o dodawaniu właściwości / zdarzeń do komponentów VCL np.:
http://www.idg.pl/artykuly/47031/VCL.pierwsze.kroki.html
http://cyfbar.republika.pl/teor4.html

0

Nie wiem czy dobrze kombinuje (bo nie wychodzi) ... spróbowałem z funkcją Loaded...

void __fastcall TDockShortCut::Loaded(void)
{
 TPanel::Loaded(); // dziedziczysz po TPanel
 // jesli w trybie projektowania to koniec
 if(ComponentState.Contains(csDesigning))
   {
	return;
   }
 // ja tu tworze dodatkowe komponenty: TPanel, TLabel..
 // i ustawiam Parent, i inne
 ShortCutIconPanelX = new TPanel(this);
 ShortCutIconPanelX->Parent = this;
 ShortCutIconPanelX->Align = alClient;
 ShortCutIconPanelX->Color = clRed; //TransparentColor;
}

W dobrym miejscu umieściłem deklarację tworzenia komponentu ?

I tak po za tematem... Jak byście chcieli stworzyć komponent rozszerzony typu button to od jakiego komponentu by w was dziedziczył ? Ja postawiłem na TPanel z kilku powodów (między innymi opcja align) ale po przeczytaniu tych artykułów zastanawiam się czy nie lepiej od czegoś innego zacząć od nowa :(

0

W dobrym miejscu umieściłem deklarację tworzenia komponentu ?

Ja tworzę komponenty w tym właśnie miejscu. A deklaracji ShortCutIconPanelX nie widziałem w kodzie, więc nie wiem co to - pewnie w .h gdzieś ma być.

Jak byście chcieli stworzyć komponent rozszerzony typu button to od jakiego komponentu by w was dziedziczył ?

TButton raczej, lub tez możesz dziedziczyć po TWinControl i samemu robić wszystko.

mógłbyś napisać mi przykładowy gotowiec jak podpiąć obsługę ładowania z zewnątrz napisu Caption

w .h

    //...
private:
    UnicodeString usMyCaption;
    void __fastcall SetMyCaption(UnicodeString xusMyCaption);
    //...
public:
    //...
__published
    __property UnicodeString MyCaption = { read = usMyCaption, write = SetMyCaption };
    //...

w .cpp

//...
void __fastcall TXX::SetMyCaption(UnicodeString xusMyCaption){

    usMyCaption = xusMyCaption;

    Caption = usMyCaption;
    ShortCutLink->Caption = usMyCaption;
    //... i inne jesli chcesz
    return;
}

Tylko czy w czasie działania programu będę w stanie zmienić ten napis na inny ?

W w/w sposób będziesz. To będzie działać jak Caption TPanela, który w runtimie możesz zmieniać.

Pozostałe rzeczy jak Color, OnClick, obrazek robisz analogicznie. A komponenty wewnętrzne TLabel, TPanel możesz przesunąć do private i nie będzie do nich dostępu.

0

// EDIT : Znalazłem rozwiązanie które zmniejszy zużycie pamięci ram - na końcu odpowiedzi moje rozwiązanie - o ile dobrze myślę :)

Hmm... To może napiszę co dokładnie chce zrobić...

Chcę stworzyć komponent - coś typu TButton tyle że graficzny (zmieniająca się grafika przycisku po najechaniu a niego myszką)

Wymyśliłem że stworzę ten komponent z innych komponentów :

  • TPanel x7
  • TLabel x5
  • TImage x16

Podgląd w BDS : (poniżej rozmiar przycisku 5 razy większy niż powinien być aby lepiej widzieć jak ma wyglądać)

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 182
  ClientWidth = 554
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object P_DockShortCut: TPanel
    Left = 30
    Top = 30
    Width = 500
    Height = 110
    BevelOuter = bvNone
    Color = clSilver
    ParentBackground = False
    TabOrder = 0
    object P_ICON: TPanel
      Left = 0
      Top = 0
      Width = 155
      Height = 110
      Align = alLeft
      BevelOuter = bvNone
      Color = 13619151
      TabOrder = 0
      object P_ICON_CLIENT: TPanel
        Left = 15
        Top = 0
        Width = 125
        Height = 110
        Align = alClient
        BevelOuter = bvNone
        TabOrder = 0
        object I_ICON_CLIENT_BOTTOM: TImage
          Left = 0
          Top = 95
          Width = 125
          Height = 15
          Align = alBottom
          ExplicitTop = 88
          ExplicitWidth = 120
        end
        object I_ICON_CLIENT_CLIENT: TImage
          Left = 0
          Top = 15
          Width = 125
          Height = 80
          Align = alClient
          ExplicitLeft = 95
          ExplicitTop = 90
          ExplicitWidth = 20
          ExplicitHeight = 20
        end
        object I_ICON_CLIENT_TOP: TImage
          Left = 0
          Top = 0
          Width = 125
          Height = 15
          Align = alTop
          ExplicitWidth = 120
        end
        object I_ICON: TImage
          Left = 20
          Top = 15
          Width = 80
          Height = 80
        end
        object L_ICON_CLIENT: TLabel
          Left = 0
          Top = 0
          Width = 125
          Height = 110
          AutoSize = False
          Transparent = True
          OnMouseEnter = L_ICON_CLIENTMouseEnter
          OnMouseLeave = L_ICON_CLIENTMouseLeave
        end
      end
      object P_ICON_RIGHT: TPanel
        Left = 140
        Top = 0
        Width = 15
        Height = 110
        Align = alRight
        BevelOuter = bvNone
        TabOrder = 1
        object I_ICON_RIGHT_TOP: TImage
          Left = 0
          Top = 0
          Width = 15
          Height = 15
          Align = alTop
        end
        object I_ICON_RIGHT_BOTTOM: TImage
          Left = 0
          Top = 95
          Width = 15
          Height = 15
          Align = alBottom
          ExplicitTop = 90
        end
        object I_ICON_RIGHT_CLIENT: TImage
          Left = 0
          Top = 15
          Width = 15
          Height = 80
          Align = alClient
          ExplicitTop = 90
          ExplicitWidth = 20
          ExplicitHeight = 20
        end
        object L_ICON_RIGHT: TLabel
          Left = 0
          Top = 0
          Width = 15
          Height = 110
          AutoSize = False
          Transparent = True
          OnMouseEnter = L_ICON_RIGHTMouseEnter
          OnMouseLeave = L_ICON_RIGHTMouseLeave
        end
      end
      object P_ICON_LEFT: TPanel
        Left = 0
        Top = 0
        Width = 15
        Height = 110
        Align = alLeft
        BevelOuter = bvNone
        TabOrder = 2
        object I_ICON_LEFT_CLIENT: TImage
          Left = 0
          Top = 15
          Width = 15
          Height = 80
          Align = alClient
          ExplicitTop = 90
          ExplicitWidth = 20
          ExplicitHeight = 20
        end
        object I_ICON_LEFT_BOTTOM: TImage
          Left = 0
          Top = 95
          Width = 15
          Height = 15
          Align = alBottom
          ExplicitTop = 88
        end
        object I_ICON_LEFT_TOP: TImage
          Left = 0
          Top = 0
          Width = 15
          Height = 15
          Align = alTop
        end
        object L_ICON_LEFT: TLabel
          Left = 0
          Top = 0
          Width = 15
          Height = 110
          AutoSize = False
          Transparent = True
          OnMouseEnter = L_ICON_LEFTMouseEnter
          OnMouseLeave = L_ICON_LEFTMouseLeave
        end
      end
    end
    object P_CAPTION_CLIENT: TPanel
      Left = 155
      Top = 0
      Width = 330
      Height = 110
      Align = alClient
      BevelOuter = bvNone
      TabOrder = 1
      object I_CAPTION_CLIENT_TOP: TImage
        Left = 0
        Top = 0
        Width = 330
        Height = 15
        Align = alTop
        ExplicitWidth = 325
      end
      object I_CAPTION_CLIENT_BOTTOM: TImage
        Left = 0
        Top = 95
        Width = 330
        Height = 15
        Align = alBottom
        ExplicitTop = 90
        ExplicitWidth = 325
      end
      object I_CAPTION_CLIENT_CLIENT: TImage
        Left = 0
        Top = 15
        Width = 330
        Height = 80
        Align = alClient
        ExplicitLeft = -8
        ExplicitTop = 50
        ExplicitWidth = 20
        ExplicitHeight = 20
      end
      object L_CAPTION: TLabel
        Left = 0
        Top = 0
        Width = 330
        Height = 110
        AutoSize = False
        Caption = '  Captionex'
        Font.Charset = EASTEUROPE_CHARSET
        Font.Color = clBlack
        Font.Height = -48
        Font.Name = 'Segoe UI'
        Font.Style = [fsBold]
        ParentFont = False
        Transparent = True
        Layout = tlCenter
        OnMouseEnter = L_CAPTIONMouseEnter
        OnMouseLeave = L_CAPTIONMouseLeave
      end
    end
    object P_CAPTION_RIGHT: TPanel
      Left = 485
      Top = 0
      Width = 15
      Height = 110
      Align = alRight
      BevelOuter = bvNone
      TabOrder = 2
      object I_CAPTION_RIGHT_BOTTOM: TImage
        Left = 0
        Top = 95
        Width = 15
        Height = 15
        Align = alBottom
      end
      object I_CAPTION_RIGHT_TOP: TImage
        Left = 0
        Top = 0
        Width = 15
        Height = 15
        Align = alTop
      end
      object I_CAPTION_RIGHT_CLIENT: TImage
        Left = 0
        Top = 15
        Width = 15
        Height = 80
        Align = alClient
        ExplicitLeft = -8
        ExplicitTop = 50
        ExplicitWidth = 20
        ExplicitHeight = 20
      end
      object L_CAPTION_RIGHT: TLabel
        Left = 0
        Top = 0
        Width = 15
        Height = 110
        Cursor = crHandPoint
        AutoSize = False
        Transparent = True
        OnMouseEnter = L_CAPTION_RIGHTMouseEnter
        OnMouseLeave = L_CAPTION_RIGHTMouseLeave
      end
    end
  end
end

Zdarzenia przykładowe po najechaniu myszką :

void __fastcall TForm1::Label1MouseEnter(TObject *Sender)
{
 Caption = "Myszka w polu ikonki";	
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label1MouseLeave(TObject *Sender)
{
 Caption = "Myszka poza polem przycisku (ikonki)";	
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label3MouseEnter(TObject *Sender)
{
 Caption = "Myszka w polu Caption'a";		
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label3MouseLeave(TObject *Sender)
{
 Caption = "Myszka poza polem przycisku (caption'a)";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::L_ICON_LEFTMouseEnter(TObject *Sender)
{
 Caption = "Mysz - Ikonka - 1/3";	
}
//---------------------------------------------------------------------------
void __fastcall TForm1::L_ICON_LEFTMouseLeave(TObject *Sender)
{
 Caption = "Mysz - Ikonka - 1/3 - OFF";	
}
//---------------------------------------------------------------------------
void __fastcall TForm1::L_ICON_CLIENTMouseEnter(TObject *Sender)
{
 Caption = "Mysz - Ikonka - 2/3";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::L_ICON_CLIENTMouseLeave(TObject *Sender)
{
 Caption = "Mysz - Ikonka - 2/3 - OFF";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::L_ICON_RIGHTMouseEnter(TObject *Sender)
{
 Caption = "Mysz - Ikonka - 3/3";	
}
//---------------------------------------------------------------------------
void __fastcall TForm1::L_ICON_RIGHTMouseLeave(TObject *Sender)
{
 Caption = "Mysz - Ikonka - 3/3 - OFF";	
}
//---------------------------------------------------------------------------
void __fastcall TForm1::L_CAPTIONMouseEnter(TObject *Sender)
{
 Caption = "Mysz - Caption - 1/2";	
}
//---------------------------------------------------------------------------
void __fastcall TForm1::L_CAPTIONMouseLeave(TObject *Sender)
{
 Caption = "Mysz - Caption - 1/2 - OFF";	
}
//---------------------------------------------------------------------------
void __fastcall TForm1::L_CAPTION_RIGHTMouseEnter(TObject *Sender)
{
 Caption = "Mysz - Caption - 2/2";	
}
//---------------------------------------------------------------------------
void __fastcall TForm1::L_CAPTION_RIGHTMouseLeave(TObject *Sender)
{
 Caption = "Mysz - Caption - 2/2 - OFF";	
}
//---------------------------------------------------------------------------

I teraz tak...

L_CAPTION - komponent który będzie wyświetlał nazwę skrótu
I_ICON - komponent który będzie wyświetlał ikonkę dla skrótu (ikonka pliku od którego skrót pochodzi)

wszystkie komponenty TLabel - będą odpowiedzialne za operację jaka ma być dokonana po kliknięciu w nie myszką (uruchomienie pliku/katalogu do którego skrót prowadzi)

TImage - po za komponentem I_ICON wszystkie mają za zadanie wyświetlić daną grafikę - razem składają się na pełny wygląd przycisku i pozwalają na przeskalowanie przycisku tak rozmiarem wysokości jak szerokości.

Mam nadzieję że dobrze opisałem :)

A teraz... Wszystkie te komponenty które składają się na przycisk na pewno zbierają dużo pamięci... a problem że takich przycisków potrzebuję na 4 formatkach... około 150... (w zależności od zapotrzebowania - po to chce tworzyć je dynamicznie) :-P

Problem z zapotrzebowaniem na pamięć... aż strach myśleć ile program będzie zżerał ramu...

Macie pomysł jak zachować to co chcę przy mniejszym zużyciu pamięci ?

Tworzę w BDS Turbo C++ Explorer :(

// EDIT : ROZWIĄZANIE

Znalazłem rozwiązanie aby jeden komponent zawierał mniej podkomponentów a i tak będzie spełniał swoje zadanie :

ilość komponentów po przeanalizowaniu problemu :

  • TPanel : x1
  • TLabel : x2
  • TImage :x2

Rozwiązanie polegać będzie na tym że główna część programu po uruchomieniu programu prześledzi wszystkie nazwy jakie mają się pojawiać w przyciskach i wybierze najdłuższy z nich - następnie z plików graficznych wygeneruje jeden plik graficzny który będzie całkowitym graficznym odwzorowaniem przycisku w chwili gdy myszka nie jest nad komponentem, drugi plik graficzny który będzie odwzorowywał stan kiedy myszka wchodzi nad komponent i trzeci stan przycisku kiedy myszką klikamy na przycisk.

Dzięki temu pełny komponent będzie złożony z 5 podkomponentów a nie z 28 (! ! !) jak wcześniej zakładałem z tym że będzie wczytywany jeden większy plik zamiast 15 mniejszych. Drugi komponent TImage będzie zawierał ikonkę skrótu która za każdym razem będzie osobno wczytywana.

Dzięki takiemu rozwiązaniu zaoszczędzę trochę ramu na samych komponentach a dodatkowo pliki graficzne będą tylko 1 raz generowane - po tym zastanawiam się w jaki sposób umieścić plik w pamięci aby za każdym razem nie wczytywać go z dysku.

Co myślicie o takowym rozwiązaniu ? Macie może pomysł na jeszcze lepsze okrojenie wykorzystania pamięci ? :)

Będę wdzięczny za pomysły - jak tylko dokładnie przemyślę co jeszcze poprawić i będę pewny że to jest to co chcę to wezmę się za tworzenie od nowa dynamicznego komponentu :)

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