![]() |
AW: SubClassed Control
Zitat:
Zitat:
Alternativ könnte man ja noch anstelle von Bitblt StretchBlt verwenden. PS: Alternativ (vieleicht hab ich mein Bitmap zu klein gemacht) Kannst das ja mal prüfen. gruss |
AW: SubClassed Control
Einwas ist aber noch falsch.
Delphi-Quellcode:
Und zwar die bösen globalen Variablen. :warn:
function HookedCombo_Create: IHookedCombo; stdcall;
procedure HookedCombo_Destroy; stdcall; var HookedCombo: IHookedCombo; CloseHandle: HWND; implementation HookedCombo_Destroy kann also immer nur das zuletzt erstelle Control freigeben. Entweder du gibst dieser Prozedur das richtige Handle mit, oder ... du nutzt doch eh Interfaces. Also laß' einfach diese Funktion und die beiden Variablen weg. Die Komponenten wird doch zusammen mit dem im Interface liegenden Objekt freigegeben. Nutze stattdessen TInterfacedObject als Vorfahre, dann hat man im Hauptprogramm noch die Kontrolle und kann darüber das SubclassesControl freigeben, indem man den Interfacezeiger freigibt. Dazu muß dann natürlich im Hauptprogramm immer dieser Zeiger gespeichert werden/bleiben. Und auch im Hauptprogramm gehören diese Variablen nicht global, sondern z.B. als private Felder in die Form-Klasse.
Delphi-Quellcode:
Statt den vielen Variablen könnte man auch eine TInterfaceList verwenden, dazu dann noch eine Funktion, welche die Components der Form durchgeht, alle passenden Kombonenten sucht, für alle die SubclassedObjects erstellt und sie in der TInterfaceList speichert, welcher mit der Form dann freigegeben wird.
type
TForm1 = class(TForm) Memo1: TMemo; ... private { Private-Deklarationen } ScrbMemoHook : IHookedScrollbar; ScrbMemoHook2 : IHookedScrollbar; ComboHook : IHookedCombo; public { Public-Deklarationen } end; [add]
Delphi-Quellcode:
(siehe Signatur)
type
TSubclassedList = class(TComponent) List: TInterfaceList; constructor Create(Owner: TComponent); override; destructor Destroy; override; end; constructor TSubclassedList.Create(Owner: TComponent); begin inherited; List := TInterfaceList.Create; end; destructor TSubclassedList.Destroy; begin List.Free; inherited; end; procedure FindSubclassed(Comp: TWinControl; Config: TStrings; L: TSubclassedList = nil); var i: Integer; S: IHookedScrollbar; C: IHookedCombo; begin if Config.Values['Path'] = '' then Config.Values['Path'] := ExtractFilePath(ParamStr(0)); if not Assigned(L) then L := TSubclassedList.Create(Comp); for i := 0 to Comp.ControlCount - 1 do begin if Comp.Controls[i] is TCustomMemo then begin S := HookedScroolBar_Create; L.List.Add(S); // Vertikale ScrollBar Images if Config.Values['VTrack'] > '' then S.VTrack := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['VTrack']); if Config.Values['VBtnUp'] > '' then S.VBtnUp := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['VBtnUp']); if Config.Values['VThumb'] > '' then S.VThumb := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['VThumb']); if Config.Values['VBtnDown'] > '' then S.VBtnDown := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['VBtnDown']); // Horizontale ScrollBar Images if Config.Values['HTrack'] > '' then S.HTrack := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['HTrack']); if Config.Values['HBtnLeft'] > '' then S.HBtnLeft := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['HBtnLeft']); if Config.Values['HThumb'] > '' then S.HThumb := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['HThumb']); if Config.Values['HBtnRight'] > '' then S.HBtnRight := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['HBtnRight']); // Size Images if Config.Values['Sizer'] > '' then S.Sizer := S.CreateImageFromFile(Config.Values['Path'] + Config.Values['Sizer']); // S.SetScrollBarObj(Comp.Controls[i]); S.Connect; end else if Comp.Controls[i] is TCustomCombo then begin // Comboox C := HookedCombo_Create; L.List.Add(C); if Config.Values['ComboImg'] > '' then C.ComboImg := C.CreateImageFromFile(Config.Values['Path'] + Config.Values['ComboImg']); if Config.Values['FrameColor'] > '' then C.FrameColor := StringToColor(Config.Values['FrameColor']); if Config.Values['FrameHighLite'] > '' then C.FrameHighLite := StringToColor(Config.Values['FrameHighLite']); //if Config.Values['FrameStyle'] > '' then C.FrameStyle := StringToXxx(Config.Values['FrameStyle']); C.SetComboParentObj(Comp.Controls[i]); C.Connect; end; FindSubclassed(Comp.Controls[i], Config, L); end; end; procedure TForm1.FormCreate(Sender: TObject); var Config: TStringList; begin Config := TStringList.Create; try Config.Values['Path'] := ExtractFilePath(ParamStr(0)) + 'ScrollBarSkin\'; // Vertikale ScrollBar Images Config.Values['VTrack'] := 'VTrack.png'; Config.Values['VBtnUp'] := 'VBtnUp.png'; Config.Values['VThumb'] := 'VThumb.png'; Config.Values['VBtnDown'] := 'VBtnDown.png'; // Horizontale ScrollBar Images Config.Values['HTrack'] := 'HTrack.png'; Config.Values['HBtnLeft'] := 'HBtnLeft.png'; Config.Values['HThumb'] := 'HThumb.png'; Config.Values['HBtnRight'] := 'HBtnRight.png'; // Size Images Config.Values['Sizer'] := 'Sizer.png'; // Comboox Config.Values['ComboImg'] := 'Combo.png'; Config.Values['FrameColor'] := '$FED3AC'; Config.Values['FrameHighLite'] := '$666666'; Config.Values['FrameStyle'] := 'FrameFlat'; // FindSubclassed(Self, Config); finally Config.Free; end; end; [add] Tut mir Leid das jetzt so hart sagen zu müssen, aber das Teil ist das reinste Speichergrab. So
Delphi-Quellcode:
gibt man jedenfalls keine Komonente ala TBitmap frei.
if assigned(VTrack) then VTrack := nil;
Wobei, wie schon gesagt, hier eh fast keine Komponenten freigegeben werden, da HookedScroolBar_Destroy nur beim Letzen wirkt. |
AW: SubClassed Control
Danke für die Infos :)
Wenn ich bock habe da noch was in der nächsten zeit zu berichtigen werde ich die von dir vorgeschlagenen Aspekte mit berücksichtigen. Zitat:
Ich denke das Control's ala HWND (also Nonvcl erstellte Windows) von Windows grundsätzlich selbst freigegeben werden. Warum dann die Arbeit machen diese in einer Collection zusammen zu fassen ? War so schon schwer genug .. Der Ansatz ist vorhanden und kann dann vom User soweit er es verwenden will und Fehler findet selbst korrigiert werden. gruss |
AW: SubClassed Control
Hab mal ne neue version hochgeladen.
Wenn jemand Bock hat kann er mir mal mitteilen ob die Speicherlecks jetzt beseitigt sind. Vorrangig erstmal die für die ComboBoxen. FastMM zeigt mir zumindest nichts mehr an. Hab die Function von himitsu mal mit eingebunden. gruss |
AW: SubClassed Control
Neuerungen siehe oben.
gruss |
AW: SubClassed Control
gibt es das noch irgendwo zum herunterladen?
|
AW: SubClassed Control
Leider nein, da einige Leute hier meinen sich nicht an Urheberrechte halten zu müssen
habe ich alle meine Projekte hier entfernt. Es sollte aber kein Problem sein so etwas selbst zu programmieren. gruss |
AW: SubClassed Control
Habe noch ne Checkbox addiert da ich diese für mein aktuelles Projekt benötigte.
Ich möchte darum bitten die Header nicht zu entfernen.. wenn ihr was verbessert addiert eure Änderungen dazu. Für NonVcl muss man diese Funktionen deaktivieren.
Delphi-Quellcode:
Anschließend diese Funktion erweitern.
procedure SetCheckBoxParentObj(ParentObj: TWinControl);
procedure SetCheckBoxObj(CtrlObj: TWinControl);
Delphi-Quellcode:
procedure Connect;
Delphi-Quellcode:
procedure Connect(ParentHandle: HWND; CtrlHandle: HWND);
Man übergibt dann das ParentHandle = Form -> Handle Und dazu das des Controls bsp. Checkbox -> Handle Aber Achtung diese Änderungen müssen dann natürlich auch im Interface geschehen.. 3D Text mit Schatten wie im Anhang zu sehen ist in diesen Projekt nicht verfügbar. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz