AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte SubClassed Control

SubClassed Control

Ein Thema von EWeiss · begonnen am 30. Jun 2011 · letzter Beitrag vom 10. Okt 2016
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: SubClassed ScrollBar

  Alt 30. Jun 2011, 21:00

Toll! Läuft unter XP ohne Probleme.
Ist auch eine super Idee, den Quelltext im Memo der Exe unterzubringen!
Jo weil gesubclassed gehen alle originalen funktionen der Memo-ScrollBar direkt an die SkinnedBar.
also MouseWheel usw..

gruss
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: SubClassed ScrollBar

  Alt 30. Jun 2011, 21:33
Wie sieht es aus, mit größenänderung des Hauptfensters? Wenn man das Fenster in der größe ändert, dann bleiben die Bars noch im Ausgangs zustand...
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: SubClassed ScrollBar

  Alt 30. Jun 2011, 21:35
Wie sieht es aus, mit größenänderung des Hauptfensters? Wenn man das Fenster in der größe ändert, dann bleiben die Bars noch im Ausgangs zustand...
Denke habe das schon richtig gemacht
Wenn die Memo sich beim resitz des Fensters vergrößert setzt sich natürlich die Scrollbar
an die richtige position so wie es sein muss

Das habe ich schon abgefangen.

gruss

Geändert von EWeiss ( 1. Jul 2011 um 21:45 Uhr)
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#4

AW: SubClassed ScrollBar

  Alt 30. Jun 2011, 21:41
Email ist angekommen - ich schau's mir gerade an.
Zu Deinen Bemerkungen: Ja - geht alles klar. Da hast Du mein vollstes Verständnis!
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: SubClassed ScrollBar

  Alt 30. Jun 2011, 21:43
Email ist angekommen - ich schau's mir gerade an.
Zu Deinen Bemerkungen: Ja - geht alles klar. Da hast Du mein vollstes Verständnis!
Das ist fein..

gruss
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#6

AW: SubClassed ScrollBar

  Alt 30. Jun 2011, 22:18
Problem gefunden/gelöst:
Delphi-Quellcode:
function THookedScrollbar.StoreHorizontal(WinHandle: HWND): Boolean;
begin
  //...
  Result:=HScrBar.rgstate[0] and STATE_SYSTEM_INVISIBLE=0;
end;

function THookedScrollbar.StoreVertical(WinHandle: HWND): Boolean;
begin
  //...
  Result:=VScrBar.rgstate[0] and STATE_SYSTEM_INVISIBLE=0;
end;
Allerdings habe ich noch einen kleinen Fehler gefunden:
pixelfehler.jpg
Es sieht so aus, als ob die Scrollbar um jeweils einen Pixel nach rechts und unter verschoben wäre. Könnte das sein?

P.S.: Das ist ja ein richtig umfangreiches Projekt und einer Menge Arbeit, die da drin steckt.
Ganz tolle Arbeit!
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom (30. Jun 2011 um 22:22 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: SubClassed ScrollBar

  Alt 30. Jun 2011, 22:21
Problem gefunden/gelöst:
Delphi-Quellcode:
function THookedScrollbar.StoreHorizontal(WinHandle: HWND): Boolean;
begin
  //...
  Result:=HScrBar.rgstate[0] and STATE_SYSTEM_INVISIBLE=0;
end;

function THookedScrollbar.StoreVertical(WinHandle: HWND): Boolean;
begin
  //...
  Result:=VScrBar.rgstate[0] and STATE_SYSTEM_INVISIBLE=0;
end;
Allerdings habe ich noch einen kleinen Fehler gefunden:
Anhang 34538
Es sieht so aus, als ob die Scrollbar um jeweils einen Pixel nach rechts und unter verschoben wäre. Könnte das sein?
Das ist ohne weiteres möglich meine Augen "Sorry" sind nicht mehr die besten.

werde es mal einbauen und schaun ob es geht.
Mit Quelltext geht es doch besser als mit ner

EDIT:
Was hast mit State gemacht?
Auf der Basis wird es ja nicht mehr gebraucht.. Oder?


gruss

Geändert von EWeiss (30. Jun 2011 um 22:29 Uhr)
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#8

AW: SubClassed ScrollBar

  Alt 30. Jun 2011, 22:36
Nö. Ist unter den Tisch gefallen...
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.355 Beiträge
 
Delphi 12 Athens
 
#9

AW: SubClassed Control

  Alt 26. Okt 2011, 19: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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (26. Okt 2011 um 20:27 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: SubClassed Control

  Alt 26. Okt 2011, 20: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 13:42 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:33 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