// 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 :)