AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte SubClassed Control
Thema durchsuchen
Ansicht
Themen-Optionen

SubClassed Control

Ein Thema von EWeiss · begonnen am 30. Jun 2011 · letzter Beitrag vom 10. Okt 2016
Antwort Antwort
Seite 4 von 4   « Erste     234   
EWeiss
Projekt entfernt..

Geändert von EWeiss (24. Jul 2019 um 05:49 Uhr)
 
EWeiss
 
#31
  Alt 26. Okt 2011, 11:47
Hallo,
Allerdings hab ich das hier eben unter Win7 64 angesehen und habe auch hier den 1 pixel nach rechts verschoben, aber meine Einstellungen im Windows für die Scrollbars ist auf standart. Gibt es hierzu schon einen fix?
Also sagte ja schon in einem Post vorher ich hab da keine Probleme mit. (Win7 64Bit)

Zitat:
Kann man evtl die größe der scrollbar auslesen und die von dir daran anpassen?
Schau mal im source wo der Rect der Scrollbar ermittelt wird da dürfte eigentlich kein fehler vorliegen.
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

Geändert von EWeiss (27. Okt 2011 um 00:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#32
  Alt 26. Okt 2011, 20:14
Einwas ist aber noch falsch.

Delphi-Quellcode:
  function HookedCombo_Create: IHookedCombo; stdcall;
  procedure HookedCombo_Destroy; stdcall;

var
  HookedCombo: IHookedCombo;
  CloseHandle: HWND;

implementation
Und zwar die bösen globalen Variablen.

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:
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ...
  private
    { Private-Deklarationen }
    ScrbMemoHook : IHookedScrollbar;
    ScrbMemoHook2 : IHookedScrollbar;
    ComboHook : IHookedCombo;
  public
    { Public-Deklarationen }
  end;
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.


[add]
Delphi-Quellcode:
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;
(siehe Signatur)




[add]
Tut mir Leid das jetzt so hart sagen zu müssen, aber das Teil ist das reinste Speichergrab.
So if assigned(VTrack) then VTrack := nil; gibt man jedenfalls keine Komonente ala TBitmap frei.

Wobei, wie schon gesagt, hier eh fast keine Komponenten freigegeben werden, da HookedScroolBar_Destroy nur beim Letzen wirkt.

Geändert von himitsu (26. Okt 2011 um 21:27 Uhr)
  Mit Zitat antworten Zitat
EWeiss
 
#33
  Alt 26. Okt 2011, 21:34
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:
Tut mir Leid das jetzt so hart sagen zu müssen, aber das Teil ist das reinste Speichergrab.
Kein problem muss dir nicht leid tun

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

Geändert von EWeiss (12. Mai 2012 um 14:42 Uhr)
  Mit Zitat antworten Zitat
EWeiss
 
#34
  Alt 12. Mai 2012, 14:54
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
  Mit Zitat antworten Zitat
EWeiss
 
#35
  Alt 13. Mai 2012, 16:00
Neuerungen siehe oben.

gruss
  Mit Zitat antworten Zitat
noisy_master

 
Delphi XE5 Professional
 
#36
  Alt 24. Mär 2016, 11:32
gibt es das noch irgendwo zum herunterladen?
Dirk
  Mit Zitat antworten Zitat
EWeiss
 
#37
  Alt 24. Mär 2016, 17:25
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
  Mit Zitat antworten Zitat
EWeiss
 
#38
  Alt 10. Okt 2016, 10:25
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:
    procedure SetCheckBoxParentObj(ParentObj: TWinControl);
    procedure SetCheckBoxObj(CtrlObj: TWinControl);
Anschließend diese Funktion erweitern.

procedure Connect;
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

Geändert von EWeiss (11. Jul 2019 um 16:48 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz